diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 5be83bf..9d6a048 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -16,7 +16,7 @@
 * Dart website: https://github.com/dart-lang/site-www
 * Flutter: https://github.com/flutter/flutter
 * Linter: https://github.com/dart-lang/linter
-* dartfmt: https://github.com/dart-lang/dart_style
+* dart format: https://github.com/dart-lang/dart_style
 
 If you aren't sure, file the issue here and we'll find the right home for it.
 In your issue, please include:
diff --git a/DEPS b/DEPS
index 614956d..c6d7fe8 100644
--- a/DEPS
+++ b/DEPS
@@ -73,7 +73,7 @@
 
   # Revisions of /third_party/* dependencies.
   "args_rev": "d8fea36c10ef96797be02e3d132d572445cd86f4",
-  "async_rev": "49464c342fe64c8632223ce3475364d163fb0623",
+  "async_rev": "92e7119aa068bfb86a6a9519d44037ffff5eece8",
   "bazel_worker_rev": "0885637b037979afbf5bcd05fd748b309fd669c0",
   "benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7",
   "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
diff --git a/build/README.dart.md b/build/README.dart.md
index 8fa8057..dd2fd3d 100644
--- a/build/README.dart.md
+++ b/build/README.dart.md
@@ -4,4 +4,4 @@
 the flutter repository.
 
 The contents has now diverged significantly from Flutter, and is maintained
-independantly by the Dart team. It is used to support the GN build system.
+independently by the Dart team. It is used to support the GN build system.
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
index cc6f516..4d2422d 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
@@ -122,8 +122,6 @@
 /*cfe|cfe:builder.member: LegacyClass4d.==:bool* Function(dynamic)**/
 class LegacyClass4d implements Class4a, Class4b {}
 
-/*class: LegacyClass5:Class5,GenericInterface<dynamic>,LegacyClass5,Object*/
-/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/
 class
 /*cfe|cfe:builder.error: AmbiguousSupertypes*/
     /*cfe|cfe:builder.member: LegacyClass5.toString:String* Function()**/
@@ -136,6 +134,8 @@
 /*cfe|cfe:builder.member: LegacyClass5._simpleInstanceOfFalse:bool* Function(dynamic)**/
 /*cfe|cfe:builder.member: LegacyClass5._simpleInstanceOfTrue:bool* Function(dynamic)**/
 /*cfe|cfe:builder.member: LegacyClass5.==:bool* Function(dynamic)**/
+/*class: LegacyClass5:Class5,GenericInterface<dynamic>,LegacyClass5,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/
     LegacyClass5 extends Class5 implements GenericInterface<Object> {}
 
 /*class: LegacyClass6a:
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 73797af..3cb56a5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -299,8 +299,9 @@
       verifier.generateDuplicateShownHiddenNameHints(errorReporter);
       verifier.generateUnusedImportHints(errorReporter);
       verifier.generateUnusedShownNameHints(errorReporter);
-      verifier.generateUnnecessaryImportHints(
-          errorReporter, _usedImportedElementsList);
+      // TODO(srawlins): Re-enable this check once Flutter engine path is clear.
+      // verifier.generateUnnecessaryImportHints(
+      //     errorReporter, _usedImportedElementsList);
     }
 
     // Unused local elements.
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 9fc6ea2..6d5c3de 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1655,7 +1655,7 @@
   // class I<T> {}
   // class A implements I<int> {}
   // class B implements I<String> {}
-  // [!class C extends A implements B {}!]
+  // class [!C!] extends A implements B {}
   // ```
   //
   // #### Common fixes
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 1cb1091..907c52c 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1812,7 +1812,7 @@
       if (error is IncompatibleInterfacesClassHierarchyError) {
         errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES,
-          node,
+          node.name,
           [
             _enclosingClass!.name,
             error.first.getDisplayString(withNullability: true),
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 d86c1cf..2754202 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart
@@ -22,7 +22,7 @@
 class B implements I<String> {}
 class C extends A implements B {}
 ''', [
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 75, 33),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 81, 1),
     ]);
   }
 
@@ -42,7 +42,7 @@
 class B implements I<int?> {}
 class C extends A implements B {}
 ''', [
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 73, 33),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 79, 1),
     ]);
   }
 
@@ -81,7 +81,7 @@
 class B implements I<String> {}
 class C extends A with B {}
 ''', [
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 75, 27),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 81, 1),
     ]);
   }
 
@@ -152,7 +152,7 @@
 mixin M implements I<String> {}
 class C = A with M;
 ''', [
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 66, 19),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 72, 1),
     ]);
   }
 
@@ -172,7 +172,7 @@
 mixin M implements I<String> {}
 class C = A with M;
 ''', [
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 75, 19),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 81, 1),
     ]);
   }
 
@@ -183,7 +183,7 @@
 class B implements I<String> {}
 mixin M on A implements B {}
 ''', [
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 75, 28),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 81, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_import_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_import_test.dart
index b6071fc..a5c76d1 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_import_test.dart
@@ -9,7 +9,8 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(UnnecessaryImportTest);
+    // TODO(srawlins): Re-enable this check once Flutter engine path is clear.
+    // defineReflectiveTests(UnnecessaryImportTest);
   });
 }
 
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 2ceddee..61cbee9 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -2180,11 +2180,11 @@
 }
 ''', [
       error(CompileTimeErrorCode.INVALID_OVERRIDE, 124, 1),
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 180, 42),
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 180, 42),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 186, 1),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 186, 1),
       error(CompileTimeErrorCode.INVALID_OVERRIDE, 218, 1),
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 226, 42),
-      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 226, 42),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 232, 1),
+      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 232, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 6b5ed50..b13d301 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -1728,7 +1728,7 @@
 class I<T> {}
 class A implements I<int> {}
 class B implements I<String> {}
-[!class C extends A implements B {}!]
+class [!C!] extends A implements B {}
 {% endprettify %}
 
 #### Common fixes
diff --git a/pkg/analyzer_cli/analysis_options.yaml b/pkg/analyzer_cli/analysis_options.yaml
index ee6055a..e69ac71 100644
--- a/pkg/analyzer_cli/analysis_options.yaml
+++ b/pkg/analyzer_cli/analysis_options.yaml
@@ -1,24 +1,19 @@
-include: package:pedantic/analysis_options.1.9.0.yaml
+include: package:lints/recommended.yaml
 
 analyzer:
   strong-mode:
     implicit-casts: false
-  errors:
-    # Increase the severity of the unused_import hint.
-    unused_import: warning
   language:
     strict-inference: true
   exclude:
     - test/data/**
+
 linter:
   rules:
-    - avoid_single_cascade_in_expression_statements
-    - avoid_unused_constructor_parameters
-    - await_only_futures
-    - empty_statements
-    - iterable_contains_unrelated_type
-    - list_remove_unrelated_type
-    - provide_deprecation_message
-    - unnecessary_brace_in_string_interps
-    - unnecessary_overrides
-    - void_checks
+    avoid_unused_constructor_parameters: true
+    directives_ordering: true
+
+    # We import heavily from package:analyzer/src.
+    implementation_imports: false
+    # This rule does not work well with package:test_reflective_loader.
+    non_constant_identifier_names: false
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 66b2f59..4ad11c96 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -171,7 +171,8 @@
 
     // Note: This references analysisDriver via closure, so it will change over
     // time during the following analysis.
-    var defaultSeverityProcessor = (AnalysisError error) {
+    SeverityProcessor defaultSeverityProcessor;
+    defaultSeverityProcessor = (AnalysisError error) {
       return determineProcessedSeverity(
           error, options, analysisDriver.analysisOptions);
     };
diff --git a/pkg/analyzer_cli/lib/src/perf_report.dart b/pkg/analyzer_cli/lib/src/perf_report.dart
index c032125..25c21c5 100644
--- a/pkg/analyzer_cli/lib/src/perf_report.dart
+++ b/pkg/analyzer_cli/lib/src/perf_report.dart
@@ -8,7 +8,7 @@
 import 'package:analyzer_cli/src/error_formatter.dart';
 import 'package:analyzer_cli/src/options.dart' show CommandLineOptions;
 
-const _JSON = JsonEncoder.withIndent('  ');
+const _jsonEncoder = JsonEncoder.withIndent('  ');
 
 final String _osType = () {
   if (Platform.isLinux) {
@@ -53,5 +53,5 @@
     'reportedDiagnostics': stats.filteredCount,
   };
 
-  return _JSON.convert(reportJson);
+  return _jsonEncoder.convert(reportJson);
 }
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 9ad9601..466e477 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -19,6 +19,6 @@
   yaml: any
 
 dev_dependencies:
-  pedantic: ^1.9.0
+  lints: any
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
diff --git a/pkg/analyzer_utilities/lib/tools.dart b/pkg/analyzer_utilities/lib/tools.dart
index 12210c8..f28fc4e 100644
--- a/pkg/analyzer_utilities/lib/tools.dart
+++ b/pkg/analyzer_utilities/lib/tools.dart
@@ -218,29 +218,19 @@
       this.indent = '  '});
 }
 
-/// A utility class for invoking dartfmt.
+/// A utility class for invoking 'dart format'.
 class DartFormat {
-  static String get _dartfmtPath {
-    var binName = Platform.isWindows ? 'dartfmt.bat' : 'dartfmt';
-    for (var loc in [binName, join('dart-sdk', 'bin', binName)]) {
-      var candidatePath = join(dirname(Platform.resolvedExecutable), loc);
-      if (File(candidatePath).existsSync()) {
-        return candidatePath;
-      }
-    }
-    throw StateError('Could not find dartfmt executable');
-  }
+  static String get _dartPath => Platform.resolvedExecutable;
 
   static void formatFile(File file) {
-    var result = Process.runSync(_dartfmtPath, ['-w', file.path]);
+    var result = Process.runSync(_dartPath, ['format', file.path]);
     _throwIfExitCode(result);
   }
 
   static String formatText(String text) {
     var file = File(join(Directory.systemTemp.path, 'gen.dart'));
     file.writeAsStringSync(text);
-    var result = Process.runSync(_dartfmtPath, ['-w', file.path]);
-    _throwIfExitCode(result);
+    formatFile(file);
     return file.readAsStringSync();
   }
 
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index 4518521..b49abc0 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -18,15 +18,13 @@
 String prettyPrint(Node node,
     {bool enableMinification: false,
     bool allowVariableMinification: true,
-    bool preferSemicolonToNewlineInMinifiedOutput: false,
-    Renamer renamerForNames: JavaScriptPrintingOptions.identityRenamer}) {
+    bool preferSemicolonToNewlineInMinifiedOutput: false}) {
   // TODO(johnniwinther): Do we need all the options here?
   JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
       shouldCompressOutput: enableMinification,
       minifyLocalVariables: allowVariableMinification,
       preferSemicolonToNewlineInMinifiedOutput:
-          preferSemicolonToNewlineInMinifiedOutput,
-      renamerForNames: renamerForNames);
+          preferSemicolonToNewlineInMinifiedOutput);
   SimpleJavaScriptPrintingContext context =
       new SimpleJavaScriptPrintingContext();
   Printer printer = new Printer(options, context);
@@ -38,12 +36,10 @@
     JavaScriptSourceInformationStrategy sourceInformationStrategy,
     {DumpInfoTask monitor,
     bool allowVariableMinification: true,
-    Renamer renamerForNames: JavaScriptPrintingOptions.identityRenamer,
     List<CodeOutputListener> listeners: const []}) {
   JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
       shouldCompressOutput: compilerOptions.enableMinification,
-      minifyLocalVariables: allowVariableMinification,
-      renamerForNames: renamerForNames);
+      minifyLocalVariables: allowVariableMinification);
   CodeBuffer outBuffer = new CodeBuffer(listeners);
   SourceInformationProcessor sourceInformationProcessor =
       sourceInformationStrategy.createProcessor(
diff --git a/pkg/compiler/lib/src/js/size_estimator.dart b/pkg/compiler/lib/src/js/size_estimator.dart
index e2b8a9b..8ecfd9e 100644
--- a/pkg/compiler/lib/src/js/size_estimator.dart
+++ b/pkg/compiler/lib/src/js/size_estimator.dart
@@ -886,8 +886,6 @@
   @override
   visitName(Name node) {
     // For simplicity and stability we use a constant name size estimate.
-    // In production this is:
-    // '${options.renamerForNames(node)}'
     out(sizeEstimate(node));
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 6cf1ab5..2f994bb 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -2308,6 +2308,8 @@
         return className(_commonElements.objectClass);
       case JsGetName.FUTURE_CLASS_TYPE_NAME:
         return className(_commonElements.futureClass);
+      case JsGetName.LIST_CLASS_TYPE_NAME:
+        return className(_commonElements.listClass);
       case JsGetName.RTI_FIELD_AS:
         return instanceFieldPropertyName(_commonElements.rtiAsField);
       case JsGetName.RTI_FIELD_IS:
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index b7fdafc..10ba94a 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -103,11 +103,7 @@
           this,
           _generateSourceMap);
       metadataCollector = new MetadataCollector(
-          _compiler.options,
-          _compiler.reporter,
-          _emitter,
-          codegen.rtiRecipeEncoder,
-          closedWorld.elementEnvironment);
+          _compiler.reporter, _emitter, codegen.rtiRecipeEncoder);
       typeTestRegistry = new TypeTestRegistry(
           _compiler.options, closedWorld.elementEnvironment);
     });
diff --git a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
index db10350..4923f10 100644
--- a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
@@ -7,18 +7,12 @@
 import 'package:js_ast/src/precedence.dart' as js_precedence;
 
 import '../common.dart';
-import '../common_elements.dart' show JElementEnvironment;
-import '../constants/values.dart';
 import '../deferred_load.dart' show OutputUnit;
-import '../elements/entities.dart' show FunctionEntity;
 
-import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../js/js.dart' as jsAst;
-import '../js/js.dart' show js;
 import '../js_backend/runtime_types_new.dart' show RecipeEncoder;
 import '../js_model/type_recipe.dart' show TypeExpressionRecipe;
-import '../options.dart';
 
 import 'code_emitter_task.dart' show Emitter;
 
@@ -99,20 +93,9 @@
 }
 
 class MetadataCollector implements jsAst.TokenFinalizer {
-  final CompilerOptions _options;
   final DiagnosticReporter reporter;
   final Emitter _emitter;
   final RecipeEncoder _rtiRecipeEncoder;
-  final JElementEnvironment _elementEnvironment;
-
-  /// A map with a token per output unit for a list of expressions that
-  /// represent metadata, parameter names and type variable types.
-  Map<OutputUnit, _MetadataList> _metadataTokens =
-      new Map<OutputUnit, _MetadataList>();
-
-  jsAst.Expression getMetadataForOutputUnit(OutputUnit outputUnit) {
-    return _metadataTokens.putIfAbsent(outputUnit, () => new _MetadataList());
-  }
 
   /// A map used to canonicalize the entries of metadata.
   Map<OutputUnit, Map<String, List<BoundMetadataEntry>>> _metadataMap = {};
@@ -120,16 +103,17 @@
   /// A map with a token for a lists of JS expressions, one token for each
   /// output unit. Once finalized, the entries represent types including
   /// function types and typedefs.
-  Map<OutputUnit, _MetadataList> _typesTokens =
-      new Map<OutputUnit, _MetadataList>();
+  Map<OutputUnit, _MetadataList> _typesTokens = {};
+
+  /// A map used to canonicalize the entries of types.
+  Map<OutputUnit, Map<DartType, List<BoundMetadataEntry>>> _typesMap = {};
+
+  MetadataCollector(this.reporter, this._emitter, this._rtiRecipeEncoder);
 
   jsAst.Expression getTypesForOutputUnit(OutputUnit outputUnit) {
     return _typesTokens.putIfAbsent(outputUnit, () => new _MetadataList());
   }
 
-  /// A map used to canonicalize the entries of types.
-  Map<OutputUnit, Map<DartType, List<BoundMetadataEntry>>> _typesMap = {};
-
   void mergeOutputUnitMetadata(OutputUnit target, OutputUnit source) {
     assert(target != source);
 
@@ -158,43 +142,8 @@
     }
   }
 
-  MetadataCollector(this._options, this.reporter, this._emitter,
-      this._rtiRecipeEncoder, this._elementEnvironment);
-
-  List<jsAst.DeferredNumber> reifyDefaultArguments(
-      FunctionEntity function, OutputUnit outputUnit) {
-    // TODO(sra): These are stored on the InstanceMethod or StaticDartMethod.
-    List<jsAst.DeferredNumber> defaultValues = <jsAst.DeferredNumber>[];
-    _elementEnvironment.forEachParameter(function,
-        (_, String name, ConstantValue constant) {
-      if (constant == null) return;
-      jsAst.Expression expression = _emitter.constantReference(constant);
-      defaultValues.add(_addGlobalMetadata(expression, outputUnit));
-    });
-    return defaultValues;
-  }
-
   jsAst.Expression reifyType(DartType type, OutputUnit outputUnit) {
-    return addTypeInOutputUnit(type, outputUnit);
-  }
-
-  jsAst.Expression reifyName(String name, OutputUnit outputUnit) {
-    return _addGlobalMetadata(js.string(name), outputUnit);
-  }
-
-  jsAst.Expression reifyExpression(
-      jsAst.Expression expression, OutputUnit outputUnit) {
-    return _addGlobalMetadata(expression, outputUnit);
-  }
-
-  _MetadataEntry _addGlobalMetadata(jsAst.Node node, OutputUnit outputUnit) {
-    String nameToKey(jsAst.Name name) => "${name.key}";
-    String printed = jsAst.prettyPrint(node,
-        enableMinification: _options.enableMinification,
-        renamerForNames: nameToKey);
-    final submap = _metadataMap[outputUnit] ??= {};
-    final entries = submap[printed] ??= [BoundMetadataEntry(node)];
-    return entries.single;
+    return _addTypeInOutputUnit(type, outputUnit);
   }
 
   jsAst.Expression _computeTypeRepresentationNewRti(DartType type) {
@@ -202,11 +151,10 @@
         _emitter, TypeExpressionRecipe(type));
   }
 
-  jsAst.Expression addTypeInOutputUnit(DartType type, OutputUnit outputUnit) {
+  jsAst.Expression _addTypeInOutputUnit(DartType type, OutputUnit outputUnit) {
     _typesMap[outputUnit] ??= Map<DartType, List<BoundMetadataEntry>>();
     BoundMetadataEntry metadataEntry;
 
-    // See comment for _addGlobalMetadata.
     if (_typesMap[outputUnit].containsKey(type)) {
       metadataEntry = _typesMap[outputUnit][type].single;
     } else {
@@ -251,15 +199,6 @@
       return new jsAst.ArrayInitializer(values);
     }
 
-    _metadataTokens.forEach((OutputUnit outputUnit, _MetadataList token) {
-      Map metadataMap = _metadataMap[outputUnit];
-      if (metadataMap != null) {
-        token.setExpression(finalizeMap(metadataMap));
-      } else {
-        token.setExpression(new jsAst.ArrayInitializer([]));
-      }
-    });
-
     _typesTokens.forEach((OutputUnit outputUnit, _MetadataList token) {
       Map<DartType, List<BoundMetadataEntry>> typesMap = _typesMap[outputUnit];
       if (typesMap != null) {
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index f2c81cf..8903eec 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -39,21 +39,6 @@
     _metadataCollector.mergeOutputUnitMetadata(target, source);
   }
 
-  /// Accessor for the list of metadata entries for a given [OutputUnit].
-  ///
-  /// There is one list for each output unit. The list belonging to the main
-  /// unit must be emitted in the `METADATA` embedded global.
-  /// The list references constants and must hence be emitted after constants
-  /// have been initialized.
-  ///
-  /// Note: the metadata is derived from the task's `metadataCollector`. The
-  /// list must not be emitted before all operations on it are done. For
-  /// example, the old emitter generates metadata when emitting reflection
-  /// data.
-  js.Expression metadataForOutputUnit(OutputUnit unit) {
-    return _metadataCollector.getMetadataForOutputUnit(unit);
-  }
-
   /// Accessor for the list of type entries for a given [OutputUnit].
   ///
   /// There is one list for each output unit. The list belonging to the main
diff --git a/pkg/compiler/lib/src/js_emitter/native_generator.dart b/pkg/compiler/lib/src/js_emitter/native_generator.dart
index d0b49dd..28616dc 100644
--- a/pkg/compiler/lib/src/js_emitter/native_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_generator.dart
@@ -10,8 +10,6 @@
 import '../js/js.dart' show js;
 import '../js_backend/backend_usage.dart' show BackendUsage;
 
-import 'model.dart';
-
 class NativeGenerator {
   static bool needsIsolateAffinityTagInitialization(BackendUsage backendUsage) {
     return backendUsage.needToInitializeIsolateAffinityTag;
@@ -76,139 +74,4 @@
     // TODO(sra): MD5 of contributing source code or URIs?
     return 'ZxYxX';
   }
-
-  /// Encodes the collected native information so that it can be treated by
-  /// the native info-handler below.
-  ///
-  /// The encoded information has the form:
-  ///
-  //    "%": "leafTag1|leafTag2|...;nonleafTag1|...;Class1|Class2|...",
-  //
-  // If there is no data following a semicolon, the semicolon can be omitted.
-  static jsAst.Expression encodeNativeInfo(Class cls) {
-    List<String> leafTags = cls.nativeLeafTags;
-    List<String> nonLeafTags = cls.nativeNonLeafTags;
-    List<Class> extensions = cls.nativeExtensions;
-
-    String formatTags(Iterable<String> tags) {
-      if (tags == null) return '';
-      return (tags.toList()..sort()).join('|');
-    }
-
-    String leafStr = formatTags(leafTags);
-    String nonLeafStr = formatTags(nonLeafTags);
-
-    StringBuffer sb = new StringBuffer(leafStr);
-    if (nonLeafStr != '') {
-      sb..write(';')..write(nonLeafStr);
-    }
-
-    String encoding = sb.toString();
-
-    if (cls.isNative || encoding != '' || extensions != null) {
-      List<jsAst.Literal> parts = <jsAst.Literal>[js.stringPart(encoding)];
-      if (extensions != null) {
-        parts
-          ..add(js.stringPart(';'))
-          ..addAll(js.joinLiterals(
-              extensions.map((Class cls) => cls.name), js.stringPart('|')));
-      }
-      return jsAst.concatenateStrings(parts, addQuotes: true);
-    }
-    return null;
-  }
-
-  /// Returns a JavaScript template that fills the embedded globals referenced
-  /// by [interceptorsByTagAccess] and [leafTagsAccess].
-  ///
-  /// This code must be invoked for every class that has a native info before
-  /// the program starts.
-  ///
-  /// The [infoAccess] parameter must evaluate to an expression that contains
-  /// the info (as a JavaScript string).
-  ///
-  /// The [constructorAccess] parameter must evaluate to an expression that
-  /// contains the constructor of the class. The constructor's prototype must
-  /// be set up.
-  ///
-  /// The [subclassReadGenerator] function must evaluate to a JS expression
-  /// that returns a reference to the constructor (with evaluated prototype)
-  /// of the given JS expression.
-  ///
-  /// The [interceptorsByTagAccess] must point to the embedded global
-  /// [embeddedNames.INTERCEPTORS_BY_TAG] and must be initialized with an empty
-  /// JS Object (used as a map).
-  ///
-  /// Similarly, the [leafTagsAccess] must point to the embedded global
-  /// [embeddedNames.LEAF_TAGS] and must be initialized with an empty JS Object
-  /// (used as a map).
-  ///
-  /// Both variables are passed in (instead of creating the access here) to
-  /// make sure the caller is aware of these globals.
-  static jsAst.Statement buildNativeInfoHandler(
-      jsAst.Expression infoAccess,
-      jsAst.Expression constructorAccess,
-      jsAst.Expression subclassReadGenerator(jsAst.Expression subclass),
-      jsAst.Expression interceptorsByTagAccess,
-      jsAst.Expression leafTagsAccess) {
-    jsAst.Expression subclassRead =
-        subclassReadGenerator(js('subclasses[i]', []));
-    return js.statement('''
-          // The native info looks like this:
-          //
-          // HtmlElement: {
-          //     "%": "HTMLDivElement|HTMLAnchorElement;HTMLElement;FancyButton"
-          //
-          // The first two semicolon-separated parts contain dispatch tags, the
-          // third contains the JavaScript names for classes.
-          //
-          // The tags indicate that JavaScript objects with the dispatch tags
-          // (usually constructor names) HTMLDivElement, HTMLAnchorElement and
-          // HTMLElement all map to the Dart native class named HtmlElement.
-          // The first set is for effective leaf nodes in the hierarchy, the
-          // second set is non-leaf nodes.
-          //
-          // The third part contains the JavaScript names of Dart classes that
-          // extend the native class. Here, FancyButton extends HtmlElement, so
-          // the runtime needs to know that window.HTMLElement.prototype is the
-          // prototype that needs to be extended in creating the custom element.
-          //
-          // The information is used to build tables referenced by
-          // getNativeInterceptor and custom element support.
-          {
-            var nativeSpec = #info.split(";");
-            if (nativeSpec[0]) {
-              var tags = nativeSpec[0].split("|");
-              for (var i = 0; i < tags.length; i++) {
-                #interceptorsByTagAccess[tags[i]] = #constructor;
-                #leafTagsAccess[tags[i]] = true;
-              }
-            }
-            if (nativeSpec[1]) {
-              tags = nativeSpec[1].split("|");
-              if (#allowNativesSubclassing) {
-                if (nativeSpec[2]) {
-                  var subclasses = nativeSpec[2].split("|");
-                  for (var i = 0; i < subclasses.length; i++) {
-                    var subclass = #subclassRead;
-                    subclass.#nativeSuperclassTagName = tags[0];
-                  }
-                }
-                for (i = 0; i < tags.length; i++) {
-                  #interceptorsByTagAccess[tags[i]] = #constructor;
-                  #leafTagsAccess[tags[i]] = false;
-                }
-              }
-            }
-          }
-    ''', {
-      'info': infoAccess,
-      'constructor': constructorAccess,
-      'subclassRead': subclassRead,
-      'interceptorsByTagAccess': interceptorsByTagAccess,
-      'leafTagsAccess': leafTagsAccess,
-      'nativeSuperclassTagName': embeddedNames.NATIVE_SUPERCLASS_TAG_NAME,
-      'allowNativesSubclassing': true
-    });
-  }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 9c4864f..f84c045 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -1817,8 +1817,6 @@
     }
 
     var mainUnit = program.mainFragment.outputUnit;
-    js.Expression metadata = program.metadataForOutputUnit(mainUnit);
-    metadataGlobals.add(createGlobal(metadata, METADATA));
     js.Expression types = program.metadataTypesForOutputUnit(mainUnit);
     metadataGlobals.add(createGlobal(types, TYPES));
 
@@ -2027,13 +2025,6 @@
   }
 
   /// Emits data needed for native classes.
-  ///
-  /// We don't try to reduce the size of the native data, but rather build
-  /// JavaScript object literals that contain all the information directly.
-  /// This means that the output size is bigger, but that the startup is faster.
-  ///
-  /// This function is the static equivalent of
-  /// [NativeGenerator.buildNativeInfoHandler].
   js.Statement emitNativeSupport(Fragment fragment) {
     List<js.Statement> statements = [];
 
diff --git a/pkg/dartdev/doc/dart-fix.md b/pkg/dartdev/doc/dart-fix.md
index 2fd0f73..c4086f6 100644
--- a/pkg/dartdev/doc/dart-fix.md
+++ b/pkg/dartdev/doc/dart-fix.md
@@ -9,7 +9,7 @@
 
 `dart fix` runs over your project looking for analysis issues. For each issue it
 checks whether there is an automated fix that can be applied. These fixes are
-generaly either in response to a lint or hint in your code, or part of upgrading
+generally either in response to a lint or hint in your code, or part of upgrading
 your source to newer package APIs.
 
 For the first type of change, the fixes are generally in response to the set of
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
index cdeb1e9..ade7adb 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
@@ -8,7 +8,6 @@
 
 @#C7
 class Coordinate extends ffi::Struct {
-  static final field core::int* #sizeOf = (#C10).{core::List::[]}(ffi::_abi());
   constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Coordinate
     : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
@@ -30,20 +29,23 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  @#C11
+  @#C8
   get x() → core::double*
-    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()));
   set x(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #v);
-  @#C11
+    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()), #v);
+  @#C8
   get y() → core::double*
-    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()));
   set y(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #v);
   get next() → ffi::Pointer<self::Coordinate*>*
-    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate*>* #v) → void
-    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+  @#C16
+  static get /*isNonNullableByDefault*/ #sizeOf() → core::int*
+    return (#C19).{core::List::[]}(ffi::_abi());
 }
 static method main() → dynamic {}
 
@@ -55,16 +57,18 @@
   #C5 = null
   #C6 = ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <core::int*>[#C8, #C9, #C8]
-  #C11 = ffi::Double {}
-  #C12 = 0
-  #C13 = <core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <core::int*>[#C16, #C16, #C16]
+  #C8 = ffi::Double {}
+  #C9 = 0
+  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <core::int*>[#C17, #C18, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
index 7b59748..25bf01a 100644
--- a/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
@@ -5,19 +5,21 @@
 
   @#C6
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C9
+    @#C7
     get yy() → dart.core::int
-      return dart.ffi::_loadUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C11).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C9
+      return dart.ffi::_loadUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C7
     set yy(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C11).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -25,9 +27,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C15
+  @#C17
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -37,10 +38,13 @@
     get xx() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C8).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C9).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C13).{dart.core::List::[]}(dart.ffi::_abi())));
     set xx(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C11).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C10, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C8, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -50,13 +54,15 @@
   #C4 = null
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
-  #C7 = 4
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = dart.ffi::Uint32 {}
-  #C10 = 0
-  #C11 = <dart.core::int*>[#C10, #C10, #C10]
-  #C12 = TypeLiteralConstant(lib::Y)
-  #C13 = <dart.core::Type>[#C12]
-  #C14 = dart.ffi::_FfiStructLayout {fieldTypes:#C13, packing:#C4}
-  #C15 = dart.core::pragma {name:#C1, options:#C14}
+  #C7 = dart.ffi::Uint32 {}
+  #C8 = 0
+  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C10 = "vm:prefer-inline"
+  #C11 = dart.core::pragma {name:#C10, options:#C4}
+  #C12 = 4
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = TypeLiteralConstant(lib::Y)
+  #C15 = <dart.core::Type>[#C14]
+  #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
+  #C17 = dart.core::pragma {name:#C1, options:#C16}
 }
diff --git a/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
index 7b59748..25bf01a 100644
--- a/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
@@ -5,19 +5,21 @@
 
   @#C6
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C9
+    @#C7
     get yy() → dart.core::int
-      return dart.ffi::_loadUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C11).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C9
+      return dart.ffi::_loadUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C7
     set yy(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C11).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint32(this.{dart.ffi::_Compound::_typedDataBase}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -25,9 +27,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C15
+  @#C17
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -37,10 +38,13 @@
     get xx() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C8).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C9).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C13).{dart.core::List::[]}(dart.ffi::_abi())));
     set xx(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C11).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C10, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C8, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -50,13 +54,15 @@
   #C4 = null
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
-  #C7 = 4
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = dart.ffi::Uint32 {}
-  #C10 = 0
-  #C11 = <dart.core::int*>[#C10, #C10, #C10]
-  #C12 = TypeLiteralConstant(lib::Y)
-  #C13 = <dart.core::Type>[#C12]
-  #C14 = dart.ffi::_FfiStructLayout {fieldTypes:#C13, packing:#C4}
-  #C15 = dart.core::pragma {name:#C1, options:#C14}
+  #C7 = dart.ffi::Uint32 {}
+  #C8 = 0
+  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C10 = "vm:prefer-inline"
+  #C11 = dart.core::pragma {name:#C10, options:#C4}
+  #C12 = 4
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = TypeLiteralConstant(lib::Y)
+  #C15 = <dart.core::Type>[#C14]
+  #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
+  #C17 = dart.core::pragma {name:#C1, options:#C16}
 }
diff --git a/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
index 2e6d138..bb7e809 100644
--- a/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
@@ -23,7 +23,6 @@
 
   @#C6
   class A extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → str::A
       : super dart.ffi::Struct::•()
       ;
@@ -37,9 +36,11 @@
       } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<str::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C8).{dart.core::List::[]}(dart.ffi::_abi())));
     set yy(str::Y #externalFieldValue) → void
       return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C7, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C8).{dart.core::List::[]}(dart.ffi::_abi());
   }
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → str::Y
       : super dart.ffi::Struct::•()
       ;
@@ -48,6 +49,9 @@
       ;
     external get zz() → invalid-type;
     external set zz(invalid-type #externalFieldValue) → void;
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C8).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -59,4 +63,6 @@
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
   #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C9 = "vm:prefer-inline"
+  #C10 = dart.core::pragma {name:#C9, options:#C4}
 }
diff --git a/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
index 2e6d138..bb7e809 100644
--- a/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
@@ -23,7 +23,6 @@
 
   @#C6
   class A extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → str::A
       : super dart.ffi::Struct::•()
       ;
@@ -37,9 +36,11 @@
       } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<str::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C8).{dart.core::List::[]}(dart.ffi::_abi())));
     set yy(str::Y #externalFieldValue) → void
       return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C7, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C8).{dart.core::List::[]}(dart.ffi::_abi());
   }
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C8).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → str::Y
       : super dart.ffi::Struct::•()
       ;
@@ -48,6 +49,9 @@
       ;
     external get zz() → invalid-type;
     external set zz(invalid-type #externalFieldValue) → void;
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C8).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -59,4 +63,6 @@
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
   #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C9 = "vm:prefer-inline"
+  #C10 = dart.core::pragma {name:#C9, options:#C4}
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
index 481fe3f..48fec45 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
@@ -5,7 +5,6 @@
 
   @#C7
   class Coordinate extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
@@ -23,20 +22,23 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-    @#C11
+    @#C8
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
-    @#C11
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+    @#C8
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+    @#C16
+    static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
+      return (#C19).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -58,14 +60,16 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Double {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <dart.core::int*>[#C16, #C16, #C16]
+  #C8 = dart.ffi::Double {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = dart.core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
index 751d0a9..0f27d3c 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
@@ -5,7 +5,6 @@
 
   @#C7
   class Coordinate extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
@@ -23,20 +22,23 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-    @#C11
+    @#C8
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
-    @#C11
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+    @#C8
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+    @#C16
+    static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
+      return (#C19).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -62,14 +64,16 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Double {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <dart.core::int*>[#C16, #C16, #C16]
+  #C8 = dart.ffi::Double {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = dart.core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
index deb8a44..969a92d 100644
--- a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
@@ -5,7 +5,6 @@
 
   @#C7
   class Coordinate extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
@@ -23,20 +22,23 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-    @#C11
+    @#C8
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
-    @#C11
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+    @#C8
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+    @#C16
+    static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
+      return (#C19).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -59,14 +61,16 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Double {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <dart.core::int*>[#C16, #C16, #C16]
+  #C8 = dart.ffi::Double {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = dart.core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
index 481fe3f..48fec45 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
@@ -5,7 +5,6 @@
 
   @#C7
   class Coordinate extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
@@ -23,20 +22,23 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-    @#C11
+    @#C8
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
-    @#C11
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+    @#C8
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+    @#C16
+    static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
+      return (#C19).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -58,14 +60,16 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Double {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <dart.core::int*>[#C16, #C16, #C16]
+  #C8 = dart.ffi::Double {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = dart.core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
index aeab1b0..f74978e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
@@ -5,7 +5,6 @@
 
   @#C7
   class Coordinate extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
@@ -23,20 +22,23 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-    @#C11
+    @#C8
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
-    @#C11
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+    @#C8
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+    @#C16
+    static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
+      return (#C19).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -59,14 +61,16 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Double {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <dart.core::int*>[#C16, #C16, #C16]
+  #C8 = dart.ffi::Double {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = dart.core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
index 1c8bfde..392f43a 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
@@ -5,7 +5,6 @@
 
   @#C7
   class Coordinate extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
@@ -24,20 +23,23 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-    @#C11
+    @#C8
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
-    @#C11
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+    @#C8
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+    @#C16
+    static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
+      return (#C19).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -60,14 +62,16 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Double {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <dart.core::int*>[#C16, #C16, #C16]
+  #C8 = dart.ffi::Double {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = dart.core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
index 6563e60..b1ca0cd 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
@@ -5,31 +5,33 @@
 
   @#C7
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C11
+    @#C8
     get y1() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y1(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C11
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C8
     get y2() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y2(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C16
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C13
     get y3() → dart.core::int
-      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C16
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C13
     set y3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C18
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -37,9 +39,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C23
+  @#C25
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -49,23 +50,26 @@
     get x1() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x1(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
     get x2() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C21).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x2(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     get x3() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set x3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C18
+    static get #sizeOf() → dart.core::int*
+      return (#C31).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -76,26 +80,28 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 16
-  #C9 = 12
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Uint8 {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 1
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = dart.ffi::Uint64 {}
-  #C17 = 8
-  #C18 = 4
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
-  #C20 = TypeLiteralConstant(lib::Y)
-  #C21 = <dart.core::Type>[#C20, #C20, #C2]
-  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
-  #C23 = dart.core::pragma {name:#C1, options:#C22}
-  #C24 = 40
-  #C25 = 28
-  #C26 = <dart.core::int*>[#C24, #C25, #C24]
-  #C27 = 32
-  #C28 = 24
-  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+  #C8 = dart.ffi::Uint8 {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 1
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = dart.ffi::Uint64 {}
+  #C14 = 8
+  #C15 = 4
+  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C17 = "vm:prefer-inline"
+  #C18 = dart.core::pragma {name:#C17, options:#C5}
+  #C19 = 16
+  #C20 = 12
+  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C22 = TypeLiteralConstant(lib::Y)
+  #C23 = <dart.core::Type>[#C22, #C22, #C2]
+  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
+  #C25 = dart.core::pragma {name:#C1, options:#C24}
+  #C26 = 32
+  #C27 = 24
+  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C29 = 40
+  #C30 = 28
+  #C31 = <dart.core::int*>[#C29, #C30, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
index 8713870..75e87b0 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
@@ -5,31 +5,33 @@
 
   @#C7
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C11
+    @#C8
     get y1() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y1(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C14
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
     get y3() → dart.core::int
-      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C14
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
     set y3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C11
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C8
     get y2() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y2(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -37,9 +39,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C23
+  @#C25
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -49,23 +50,26 @@
     get x1() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x1(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
     get x2() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C21).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x2(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     get x3() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set x3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C31).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -76,26 +80,28 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 16
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Uint8 {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = dart.ffi::Uint64 {}
-  #C15 = 8
-  #C16 = 4
+  #C8 = dart.ffi::Uint8 {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = dart.ffi::Uint64 {}
+  #C12 = 8
+  #C13 = 4
+  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C15 = 16
+  #C16 = 12
   #C17 = <dart.core::int*>[#C15, #C16, #C15]
-  #C18 = 12
-  #C19 = <dart.core::int*>[#C9, #C18, #C9]
-  #C20 = TypeLiteralConstant(lib::Y)
-  #C21 = <dart.core::Type>[#C20, #C20, #C2]
-  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
-  #C23 = dart.core::pragma {name:#C1, options:#C22}
-  #C24 = 56
-  #C25 = 36
-  #C26 = <dart.core::int*>[#C24, #C25, #C24]
-  #C27 = 48
-  #C28 = 32
-  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+  #C18 = "vm:prefer-inline"
+  #C19 = dart.core::pragma {name:#C18, options:#C5}
+  #C20 = 24
+  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C22 = TypeLiteralConstant(lib::Y)
+  #C23 = <dart.core::Type>[#C22, #C22, #C2]
+  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
+  #C25 = dart.core::pragma {name:#C1, options:#C24}
+  #C26 = 48
+  #C27 = 32
+  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C29 = 56
+  #C30 = 36
+  #C31 = <dart.core::int*>[#C29, #C30, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
index 6563e60..b1ca0cd 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
@@ -5,31 +5,33 @@
 
   @#C7
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C11
+    @#C8
     get y1() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y1(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C11
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C8
     get y2() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y2(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C16
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C13
     get y3() → dart.core::int
-      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C16
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C13
     set y3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C18
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -37,9 +39,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C23
+  @#C25
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -49,23 +50,26 @@
     get x1() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x1(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
     get x2() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C21).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x2(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     get x3() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set x3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C18
+    static get #sizeOf() → dart.core::int*
+      return (#C31).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -76,26 +80,28 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 16
-  #C9 = 12
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Uint8 {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 1
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = dart.ffi::Uint64 {}
-  #C17 = 8
-  #C18 = 4
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
-  #C20 = TypeLiteralConstant(lib::Y)
-  #C21 = <dart.core::Type>[#C20, #C20, #C2]
-  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
-  #C23 = dart.core::pragma {name:#C1, options:#C22}
-  #C24 = 40
-  #C25 = 28
-  #C26 = <dart.core::int*>[#C24, #C25, #C24]
-  #C27 = 32
-  #C28 = 24
-  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+  #C8 = dart.ffi::Uint8 {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 1
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = dart.ffi::Uint64 {}
+  #C14 = 8
+  #C15 = 4
+  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C17 = "vm:prefer-inline"
+  #C18 = dart.core::pragma {name:#C17, options:#C5}
+  #C19 = 16
+  #C20 = 12
+  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C22 = TypeLiteralConstant(lib::Y)
+  #C23 = <dart.core::Type>[#C22, #C22, #C2]
+  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
+  #C25 = dart.core::pragma {name:#C1, options:#C24}
+  #C26 = 32
+  #C27 = 24
+  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C29 = 40
+  #C30 = 28
+  #C31 = <dart.core::int*>[#C29, #C30, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
index 8713870..75e87b0 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
@@ -5,31 +5,33 @@
 
   @#C7
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C11
+    @#C8
     get y1() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y1(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C14
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
     get y3() → dart.core::int
-      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C14
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
     set y3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C11
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C8
     get y2() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y2(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -37,9 +39,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C23
+  @#C25
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -49,23 +50,26 @@
     get x1() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x1(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
     get x2() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C21).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x2(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     get x3() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set x3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C31).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -76,26 +80,28 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 16
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Uint8 {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = dart.ffi::Uint64 {}
-  #C15 = 8
-  #C16 = 4
+  #C8 = dart.ffi::Uint8 {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = dart.ffi::Uint64 {}
+  #C12 = 8
+  #C13 = 4
+  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C15 = 16
+  #C16 = 12
   #C17 = <dart.core::int*>[#C15, #C16, #C15]
-  #C18 = 12
-  #C19 = <dart.core::int*>[#C9, #C18, #C9]
-  #C20 = TypeLiteralConstant(lib::Y)
-  #C21 = <dart.core::Type>[#C20, #C20, #C2]
-  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
-  #C23 = dart.core::pragma {name:#C1, options:#C22}
-  #C24 = 56
-  #C25 = 36
-  #C26 = <dart.core::int*>[#C24, #C25, #C24]
-  #C27 = 48
-  #C28 = 32
-  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+  #C18 = "vm:prefer-inline"
+  #C19 = dart.core::pragma {name:#C18, options:#C5}
+  #C20 = 24
+  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C22 = TypeLiteralConstant(lib::Y)
+  #C23 = <dart.core::Type>[#C22, #C22, #C2]
+  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
+  #C25 = dart.core::pragma {name:#C1, options:#C24}
+  #C26 = 48
+  #C27 = 32
+  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C29 = 56
+  #C30 = 36
+  #C31 = <dart.core::int*>[#C29, #C30, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
index 790b63b..b6ef699 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
@@ -5,31 +5,33 @@
 
   @#C7
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C11
+    @#C8
     get y1() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y1(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C11
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C8
     get y2() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y2(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C16
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C13
     get y3() → dart.core::int
-      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C16
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C13
     set y3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C18
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///lib2.dart" as lib2 {
@@ -175,9 +177,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C23
+  @#C25
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -187,23 +188,26 @@
     get x1() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x1(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
     get x2() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C21).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x2(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     get x3() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set x3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C18
+    static get #sizeOf() → dart.core::int*
+      return (#C31).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -214,26 +218,28 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 16
-  #C9 = 12
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Uint8 {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = 1
-  #C15 = <dart.core::int*>[#C14, #C14, #C14]
-  #C16 = dart.ffi::Uint64 {}
-  #C17 = 8
-  #C18 = 4
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
-  #C20 = TypeLiteralConstant(lib::Y)
-  #C21 = <dart.core::Type>[#C20, #C20, #C2]
-  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
-  #C23 = dart.core::pragma {name:#C1, options:#C22}
-  #C24 = 40
-  #C25 = 28
-  #C26 = <dart.core::int*>[#C24, #C25, #C24]
-  #C27 = 32
-  #C28 = 24
-  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+  #C8 = dart.ffi::Uint8 {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = 1
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = dart.ffi::Uint64 {}
+  #C14 = 8
+  #C15 = 4
+  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C17 = "vm:prefer-inline"
+  #C18 = dart.core::pragma {name:#C17, options:#C5}
+  #C19 = 16
+  #C20 = 12
+  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C22 = TypeLiteralConstant(lib::Y)
+  #C23 = <dart.core::Type>[#C22, #C22, #C2]
+  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
+  #C25 = dart.core::pragma {name:#C1, options:#C24}
+  #C26 = 32
+  #C27 = 24
+  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C29 = 40
+  #C30 = 28
+  #C31 = <dart.core::int*>[#C29, #C30, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
index 44136bf..c8d5564 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
@@ -5,31 +5,33 @@
 
   @#C7
   class Y extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → lib::Y
       : super dart.ffi::Struct::•()
       ;
     constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
-    @#C11
+    @#C8
     get y1() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y1(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C14
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
     get y3() → dart.core::int
-      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C14
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
     set y3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
-    @#C11
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C8
     get y2() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set y2(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 library from "org-dartlang-test:///lib2.dart" as lib2 {
@@ -175,9 +177,8 @@
   import "dart:ffi";
   import "org-dartlang-test:///lib.dart";
 
-  @#C23
+  @#C25
   class X extends dart.ffi::Struct {
-    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
     synthetic constructor •() → main::X
       : super dart.ffi::Struct::•()
       ;
@@ -187,23 +188,26 @@
     get x1() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x1(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
     get x2() → lib::Y
       return new lib::Y::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
-        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+        dart.core::int #offset = (#C21).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C21).{dart.core::List::[]}(dart.ffi::_abi())));
     set x2(lib::Y #externalFieldValue) → void
-      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     get x3() → dart.core::int
-      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
-    @#C11
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C8
     set x3(dart.core::int #externalFieldValue) → void
-      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C31).{dart.core::List::[]}(dart.ffi::_abi());
   }
 }
 constants  {
@@ -214,26 +218,28 @@
   #C5 = null
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 16
-  #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = dart.ffi::Uint8 {}
-  #C12 = 0
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
-  #C14 = dart.ffi::Uint64 {}
-  #C15 = 8
-  #C16 = 4
+  #C8 = dart.ffi::Uint8 {}
+  #C9 = 0
+  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C11 = dart.ffi::Uint64 {}
+  #C12 = 8
+  #C13 = 4
+  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C15 = 16
+  #C16 = 12
   #C17 = <dart.core::int*>[#C15, #C16, #C15]
-  #C18 = 12
-  #C19 = <dart.core::int*>[#C9, #C18, #C9]
-  #C20 = TypeLiteralConstant(lib::Y)
-  #C21 = <dart.core::Type>[#C20, #C20, #C2]
-  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
-  #C23 = dart.core::pragma {name:#C1, options:#C22}
-  #C24 = 56
-  #C25 = 36
-  #C26 = <dart.core::int*>[#C24, #C25, #C24]
-  #C27 = 48
-  #C28 = 32
-  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+  #C18 = "vm:prefer-inline"
+  #C19 = dart.core::pragma {name:#C18, options:#C5}
+  #C20 = 24
+  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C22 = TypeLiteralConstant(lib::Y)
+  #C23 = <dart.core::Type>[#C22, #C22, #C2]
+  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
+  #C25 = dart.core::pragma {name:#C1, options:#C24}
+  #C26 = 48
+  #C27 = 32
+  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C29 = 56
+  #C30 = 36
+  #C31 = <dart.core::int*>[#C29, #C30, #C29]
 }
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
index eee9d220..156a6b3 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
@@ -8,26 +8,25 @@
 
 @#C7
 class Coordinate extends ffi::Struct {
-  static final field core::int* #sizeOf = (#C10).{core::List::[]}(ffi::_abi())/*isLegacy*/;
   constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Coordinate
     : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C11
+  @#C8
   get x() → core::double
-    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()));
-  @#C11
+    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()));
+  @#C8
   set x(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue);
-  @#C11
+    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+  @#C8
   get y() → core::double
-    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()));
-  @#C11
+    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()));
+  @#C8
   set y(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue);
   get next() → ffi::Pointer<self::Coordinate>
-    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
-    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
   static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
     return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf)!) in block {
       #t1.{self::Coordinate::x} = x;
@@ -35,6 +34,9 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
+  @#C16
+  static get #sizeOf() → core::int*
+    return (#C19).{core::List::[]}(ffi::_abi());
 }
 static method main() → dynamic {}
 
@@ -46,16 +48,18 @@
   #C5 = null
   #C6 = ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <core::int*>[#C8, #C9, #C8]
-  #C11 = ffi::Double {}
-  #C12 = 0
-  #C13 = <core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <core::int*>[#C16, #C16, #C16]
+  #C8 = ffi::Double {}
+  #C9 = 0
+  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <core::int*>[#C17, #C18, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
index eee9d220..156a6b3 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
@@ -8,26 +8,25 @@
 
 @#C7
 class Coordinate extends ffi::Struct {
-  static final field core::int* #sizeOf = (#C10).{core::List::[]}(ffi::_abi())/*isLegacy*/;
   constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Coordinate
     : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C11
+  @#C8
   get x() → core::double
-    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()));
-  @#C11
+    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()));
+  @#C8
   set x(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue);
-  @#C11
+    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+  @#C8
   get y() → core::double
-    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()));
-  @#C11
+    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()));
+  @#C8
   set y(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue);
   get next() → ffi::Pointer<self::Coordinate>
-    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
-    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
   static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
     return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf)!) in block {
       #t1.{self::Coordinate::x} = x;
@@ -35,6 +34,9 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
+  @#C16
+  static get #sizeOf() → core::int*
+    return (#C19).{core::List::[]}(ffi::_abi());
 }
 static method main() → dynamic {}
 
@@ -46,16 +48,18 @@
   #C5 = null
   #C6 = ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = core::pragma {name:#C1, options:#C6}
-  #C8 = 24
-  #C9 = 20
-  #C10 = <core::int*>[#C8, #C9, #C8]
-  #C11 = ffi::Double {}
-  #C12 = 0
-  #C13 = <core::int*>[#C12, #C12, #C12]
-  #C14 = 8
-  #C15 = <core::int*>[#C14, #C14, #C14]
-  #C16 = 16
-  #C17 = <core::int*>[#C16, #C16, #C16]
+  #C8 = ffi::Double {}
+  #C9 = 0
+  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C11 = 8
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = 16
+  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C15 = "vm:prefer-inline"
+  #C16 = core::pragma {name:#C15, options:#C5}
+  #C17 = 24
+  #C18 = 20
+  #C19 = <core::int*>[#C17, #C18, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
index 8b2f96c..cc5b25d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
@@ -10,22 +10,24 @@
 
 @#C8
 class StructInlineArray extends ffi::Struct {
-  static final field core::int* #sizeOf = (#C9).{core::List::[]}(ffi::_abi())/*isLegacy*/;
   synthetic constructor •() → self::StructInlineArray
     : super ffi::Struct::•()
     ;
   constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArray
     : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C10
+  @#C9
   get a0() → ffi::Array<ffi::Uint8>
     return new ffi::Array::_<ffi::Uint8>( block {
       core::Object #typedDataBase = this.{ffi::_Compound::_typedDataBase};
-      core::int #offset = (#C12).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C3, #C13);
-  @#C10
+      core::int #offset = (#C11).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C12).{core::List::[]}(ffi::_abi())), #C3, #C13);
+  @#C9
   set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C11, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C11).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C10, (#C12).{core::List::[]}(ffi::_abi()));
+  @#C15
+  static get #sizeOf() → core::int*
+    return (#C12).{core::List::[]}(ffi::_abi());
 }
 static method main() → dynamic {}
 
@@ -38,11 +40,13 @@
   #C6 = null
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
-  #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C9 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C10 = 0
+  #C11 = <core::int*>[#C10, #C10, #C10]
+  #C12 = <core::int*>[#C3, #C3, #C3]
   #C13 = <core::int*>[]
+  #C14 = "vm:prefer-inline"
+  #C15 = core::pragma {name:#C14, options:#C6}
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
index 4d17ccf..ee37786 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
@@ -10,22 +10,24 @@
 
 @#C8
 class StructInlineArray extends ffi::Struct {
-  static final field core::int* #sizeOf = (#C9).{core::List::[]}(ffi::_abi())/*isLegacy*/;
   synthetic constructor •() → self::StructInlineArray
     : super ffi::Struct::•()
     ;
   constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArray
     : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C10
+  @#C9
   get a0() → ffi::Array<ffi::Uint8>
     return new ffi::Array::_<ffi::Uint8>( block {
       core::Object #typedDataBase = this.{ffi::_Compound::_typedDataBase};
-      core::int #offset = (#C12).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C3, #C13);
-  @#C10
+      core::int #offset = (#C11).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C12).{core::List::[]}(ffi::_abi())), #C3, #C13);
+  @#C9
   set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C11, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C11).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C10, (#C12).{core::List::[]}(ffi::_abi()));
+  @#C15
+  static get #sizeOf() → core::int*
+    return (#C12).{core::List::[]}(ffi::_abi());
 }
 static method main() → dynamic {}
 
@@ -38,11 +40,13 @@
   #C6 = null
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
-  #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C9 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C10 = 0
+  #C11 = <core::int*>[#C10, #C10, #C10]
+  #C12 = <core::int*>[#C3, #C3, #C3]
   #C13 = <core::int*>[]
+  #C14 = "vm:prefer-inline"
+  #C15 = core::pragma {name:#C14, options:#C6}
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
index 5b4a08c..9ba7eaf 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
@@ -10,32 +10,34 @@
 
 @#C8
 class StructInlineArrayMultiDimensional extends ffi::Struct {
-  static final field core::int* #sizeOf = (#C9).{core::List::[]}(ffi::_abi())/*isLegacy*/;
   synthetic constructor •() → self::StructInlineArrayMultiDimensional
     : super ffi::Struct::•()
     ;
   constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArrayMultiDimensional
     : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C11
+  @#C10
   get a0() → ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>>
     return new ffi::Array::_<ffi::Array<ffi::Array<ffi::Uint8>>>( block {
       core::Object #typedDataBase = this.{ffi::_Compound::_typedDataBase};
-      core::int #offset = (#C13).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C10, #C14);
-  @#C11
+      core::int #offset = (#C12).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C13).{core::List::[]}(ffi::_abi())), #C9, #C14);
+  @#C10
   set a0(ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C12, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C11, (#C13).{core::List::[]}(ffi::_abi()));
+  @#C16
+  static get #sizeOf() → core::int*
+    return (#C13).{core::List::[]}(ffi::_abi());
 }
 static method main() → dynamic {
-  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C15).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
+  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C17).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
   final self::StructInlineArrayMultiDimensional struct = new self::StructInlineArrayMultiDimensional::#fromTypedDataBase(pointer!);
   final ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> array = struct.{self::StructInlineArrayMultiDimensional::a0};
   final ffi::Array<ffi::Array<ffi::Uint8>> subArray = block {
     ffi::Array<dynamic> #array = array!;
     core::int #index = 0!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C16;
+    core::int #singleElementSize = #C18;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
   } =>new ffi::Array::_<ffi::Array<ffi::Uint8>>( block {
@@ -46,11 +48,11 @@
     ffi::Array<dynamic> #array = array!;
     core::int #index = 1!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C16;
+    core::int #singleElementSize = #C18;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
-  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C12, #elementSize);
-  (#C15).{ffi::Allocator::free}(pointer);
+  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C11, #elementSize);
+  (#C17).{ffi::Allocator::free}(pointer);
 }
 
 constants  {
@@ -62,14 +64,16 @@
   #C6 = null
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
-  #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = 2
-  #C11 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C10, dimension2:#C10, dimension3:#C10, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C12 = 0
-  #C13 = <core::int*>[#C12, #C12, #C12]
-  #C14 = <core::int*>[#C10, #C10]
-  #C15 = all::_CallocAllocator {}
-  #C16 = 1
+  #C9 = 2
+  #C10 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C9, dimension2:#C9, dimension3:#C9, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C11 = 0
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = <core::int*>[#C3, #C3, #C3]
+  #C14 = <core::int*>[#C9, #C9]
+  #C15 = "vm:prefer-inline"
+  #C16 = core::pragma {name:#C15, options:#C6}
+  #C17 = all::_CallocAllocator {}
+  #C18 = 1
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
index e502690..9df71b9 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
@@ -10,32 +10,34 @@
 
 @#C8
 class StructInlineArrayMultiDimensional extends ffi::Struct {
-  static final field core::int* #sizeOf = (#C9).{core::List::[]}(ffi::_abi())/*isLegacy*/;
   synthetic constructor •() → self::StructInlineArrayMultiDimensional
     : super ffi::Struct::•()
     ;
   constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArrayMultiDimensional
     : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C11
+  @#C10
   get a0() → ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>>
     return new ffi::Array::_<ffi::Array<ffi::Array<ffi::Uint8>>>( block {
       core::Object #typedDataBase = this.{ffi::_Compound::_typedDataBase};
-      core::int #offset = (#C13).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C10, #C14);
-  @#C11
+      core::int #offset = (#C12).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C13).{core::List::[]}(ffi::_abi())), #C9, #C14);
+  @#C10
   set a0(ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C12, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C11, (#C13).{core::List::[]}(ffi::_abi()));
+  @#C16
+  static get #sizeOf() → core::int*
+    return (#C13).{core::List::[]}(ffi::_abi());
 }
 static method main() → dynamic {
-  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C15).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
+  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C17).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
   final self::StructInlineArrayMultiDimensional struct = new self::StructInlineArrayMultiDimensional::#fromTypedDataBase(pointer!);
   final ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> array = struct.{self::StructInlineArrayMultiDimensional::a0};
   final ffi::Array<ffi::Array<ffi::Uint8>> subArray = block {
     ffi::Array<dynamic> #array = array!;
     core::int #index = 0!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C16;
+    core::int #singleElementSize = #C18;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
   } =>new ffi::Array::_<ffi::Array<ffi::Uint8>>( block {
@@ -46,11 +48,11 @@
     ffi::Array<dynamic> #array = array!;
     core::int #index = 1!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C16;
+    core::int #singleElementSize = #C18;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
-  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C12, #elementSize);
-  (#C15).{ffi::Allocator::free}(pointer);
+  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C11, #elementSize);
+  (#C17).{ffi::Allocator::free}(pointer);
 }
 
 constants  {
@@ -62,14 +64,16 @@
   #C6 = null
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
-  #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = 2
-  #C11 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C10, dimension2:#C10, dimension3:#C10, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C12 = 0
-  #C13 = <core::int*>[#C12, #C12, #C12]
-  #C14 = <core::int*>[#C10, #C10]
-  #C15 = all::_CallocAllocator {}
-  #C16 = 1
+  #C9 = 2
+  #C10 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C9, dimension2:#C9, dimension3:#C9, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C11 = 0
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = <core::int*>[#C3, #C3, #C3]
+  #C14 = <core::int*>[#C9, #C9]
+  #C15 = "vm:prefer-inline"
+  #C16 = core::pragma {name:#C15, options:#C6}
+  #C17 = all::_CallocAllocator {}
+  #C18 = 1
 }
 
 Extra constant evaluation status:
diff --git a/pkg/js/proposal.md b/pkg/js/proposal.md
index 381e85c..8e4ae76 100644
--- a/pkg/js/proposal.md
+++ b/pkg/js/proposal.md
@@ -283,7 +283,7 @@
 different visibility, such as names starting with underscore.
 
 Renames are made possible by taking advantage of the static type of the
-reciever. This is similar to static calls and extension methods.
+receiver. This is similar to static calls and extension methods.
 
 ```dart
 UserInfo user = someExpression;
@@ -789,7 +789,7 @@
 
 The last check is an example of one consequence of the looser checking. 
 Conceptually we have a `JSAny` type. This type only exists in runtime, and does
-not require a representation, since it results from the absense of type
+not require a representation, since it results from the absence of type
 information. This is discussed later when we look at the type system.
 
 Besides JS Arrays, Dart generic functions and methods can also be called from
@@ -1222,7 +1222,7 @@
 
 ### JS Proxy
 
-One question that comes up occassionally is how to use JS Proxy from Dart.
+One question that comes up occasionally is how to use JS Proxy from Dart.
 We can expose JSProxy from "package:js":
 
 ```dart
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index d851cb8..c6e9a9e 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -4,21 +4,16 @@
 
 part of js_ast;
 
-typedef String Renamer(Name name);
-
 class JavaScriptPrintingOptions {
   final bool shouldCompressOutput;
   final bool minifyLocalVariables;
   final bool preferSemicolonToNewlineInMinifiedOutput;
-  final Renamer renamerForNames;
 
-  const JavaScriptPrintingOptions(
-      {this.shouldCompressOutput: false,
-      this.minifyLocalVariables: false,
-      this.preferSemicolonToNewlineInMinifiedOutput: false,
-      this.renamerForNames: identityRenamer});
-
-  static String identityRenamer(Name name) => name.name;
+  const JavaScriptPrintingOptions({
+    this.shouldCompressOutput: false,
+    this.minifyLocalVariables: false,
+    this.preferSemicolonToNewlineInMinifiedOutput: false,
+  });
 }
 
 /// An environment in which JavaScript printing is done.  Provides emitting of
@@ -1148,7 +1143,7 @@
 
   @override
   visitName(Name node) {
-    out(options.renamerForNames(node));
+    out(node.name);
   }
 
   @override
diff --git a/pkg/js_runtime/lib/shared/embedded_names.dart b/pkg/js_runtime/lib/shared/embedded_names.dart
index 9538239..e2dd66d 100644
--- a/pkg/js_runtime/lib/shared/embedded_names.dart
+++ b/pkg/js_runtime/lib/shared/embedded_names.dart
@@ -218,6 +218,9 @@
   /// String representation of the type of the object class.
   OBJECT_CLASS_TYPE_NAME,
 
+  /// String representation of the type of the List class.
+  LIST_CLASS_TYPE_NAME,
+
   /// Property name for Rti._as field.
   RTI_FIELD_AS,
 
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 6322384..3007964 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -36,7 +36,7 @@
 
 type UInt14 extends UInt {
   Byte byte1(10xxxxxx); // most significant byte, discard the high bit
-  Byte byte2(xxxxxxxx); // least signficant byte
+  Byte byte2(xxxxxxxx); // least significant byte
 }
 
 type UInt30 extends UInt {
diff --git a/pkg/scrape/README.md b/pkg/scrape/README.md
index 58b0cda..384b2fe 100644
--- a/pkg/scrape/README.md
+++ b/pkg/scrape/README.md
@@ -63,7 +63,7 @@
 analysis:
 
 *   `addHistogram()` registers a new named histogram. This is the main way you
-    count occurences of datapoints you care about in the code you are analyzing.
+    count occurrences of datapoints you care about in the code you are analyzing.
     Each histogram is a named collection of datapoints. When the analysis
     completes, scrape prints out each histogram, buckets the datapoints, and
     shows how many of each datapoint occurred.
diff --git a/pkg/test_runner/lib/src/static_error.dart b/pkg/test_runner/lib/src/static_error.dart
index 8252dc5..bf3571a 100644
--- a/pkg/test_runner/lib/src/static_error.dart
+++ b/pkg/test_runner/lib/src/static_error.dart
@@ -413,8 +413,8 @@
       }
 
       if (actual.length != null && length != actual.length) {
-        expectedMismatches.add("length $column");
-        actualMismatches.add("length ${actual.column}");
+        expectedMismatches.add("length $length");
+        actualMismatches.add("length ${actual.length}");
       }
     }
 
diff --git a/pkg/test_runner/test/static_error_test.dart b/pkg/test_runner/test/static_error_test.dart
index 285e41d..e716fd5 100644
--- a/pkg/test_runner/test/static_error_test.dart
+++ b/pkg/test_runner/test/static_error_test.dart
@@ -121,7 +121,7 @@
   Expected column 2 but was column 9.
 
 - Wrong error location line 2, column 2, length 3: ERR.B
-  Expected length 2 but was length 2.
+  Expected length 3 but was length 9.
 
 - Wrong message at line 3, column 2, length 3: ERR.Z
   Expected: ERR.C""");
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 3ac5988..4655978 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -45,7 +45,7 @@
 ///   @Double()
 ///   double y;
 ///
-///   Coord next;
+///   Pointer<Coord> next;
 /// }
 ///
 /// Output:
@@ -58,10 +58,10 @@
 ///   set y(double v) => ...;
 ///   double get y => ...;
 ///
-///   set next(Coordinate v) => ...;
-///   Coordinate get next => ...;
+///   set next(Pointer<Coord> v) => ...;
+///   Pointer<Coord> get next => ...;
 ///
-///   static final int #sizeOf = 24;
+///   static int get #sizeOf => (const [24, 20, 24])[_abi()];
 /// }
 void transformLibraries(
     Component component,
@@ -739,7 +739,7 @@
   }
 
   /// Sample output:
-  /// final int #sizeOf = [24,24,16][_abi()];
+  /// int get #sizeOf => (const [24,24,16])[_abi()];
   ///
   /// If sizes are not supplied still emits a field so that the use site
   /// transformer can still rewrite to it.
@@ -748,17 +748,26 @@
     if (sizes == null) {
       sizes = Map.fromEntries(Abi.values.map((abi) => MapEntry(abi, 0)));
     }
-    var name = Name("#sizeOf");
-    var getterReference = indexedClass?.lookupGetterReference(name);
-    final Field sizeOf = Field.immutable(name,
-        isStatic: true,
-        isFinal: true,
-        initializer: runtimeBranchOnLayout(sizes),
-        type: InterfaceType(intClass, Nullability.legacy),
+    final name = Name("#sizeOf");
+    final getterReference = indexedClass?.lookupGetterReference(name);
+
+    final Procedure getter = Procedure(
+        name,
+        ProcedureKind.Getter,
+        FunctionNode(ReturnStatement(runtimeBranchOnLayout(sizes)),
+            returnType: InterfaceType(intClass, Nullability.legacy)),
         fileUri: compound.fileUri,
-        getterReference: getterReference)
-      ..fileOffset = compound.fileOffset;
-    compound.addField(sizeOf);
+        reference: getterReference,
+        isStatic: true)
+      ..fileOffset = compound.fileOffset
+      ..isNonNullableByDefault = true
+      ..addAnnotation(ConstantExpression(InstanceConstant(pragmaClass.reference,
+          /*type_arguments=*/ [], {
+        pragmaName.getterReference: StringConstant("vm:prefer-inline"),
+        pragmaOptions.getterReference: NullConstant(),
+      })));
+
+    compound.addProcedure(getter);
   }
 
   NativeType _getFieldType(Class c) {
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index 24e4b89..d1640a2 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -384,9 +384,9 @@
     final NativeType nt = getType(nativeClass);
     if (nt == null) {
       // User-defined compounds.
-      Field sizeOfField = nativeClass.fields
-          .firstWhere((field) => field.name == Name('#sizeOf'));
-      return StaticGet(sizeOfField);
+      final Procedure sizeOfGetter = nativeClass.procedures
+          .firstWhere((function) => function.name == Name('#sizeOf'));
+      return StaticGet(sizeOfGetter);
     }
     final int size = nativeTypeSizes[nt.index];
     if (size == WORD_SIZE) {
diff --git a/runtime/docs/gc.md b/runtime/docs/gc.md
index 1780c11..38bda88 100644
--- a/runtime/docs/gc.md
+++ b/runtime/docs/gc.md
@@ -4,13 +4,13 @@
 
 ## Object representation
 
-Object pointers refer either to immediate objects or heap objects, distinguished by a tag in the low bits of the pointer. The Dart VM has only one kind of immediate object, Smis (small integers), whose pointers have a tag of 0. Heap objects have a pointer tag of 1. The upper bits of a Smi pointer are its value, and the upper bits of a heap object pointer are the most signficant bits of its address (the least significant bit is always 0 because heap objects always have greater than 2-byte alignment).
+Object pointers refer either to immediate objects or heap objects, distinguished by a tag in the low bits of the pointer. The Dart VM has only one kind of immediate object, Smis (small integers), whose pointers have a tag of 0. Heap objects have a pointer tag of 1. The upper bits of a Smi pointer are its value, and the upper bits of a heap object pointer are the most significant bits of its address (the least significant bit is always 0 because heap objects always have greater than 2-byte alignment).
 
 A tag of 0 allows many operations to be performed on Smis without untagging and retagging. It also allows hiding aligned addresses to the C heap from the GC.
 
 A tag of 1 has no penalty on heap object access because removing the tag can be folded into the offset used by load and store instructions.
 
-Heap objects are always allocated in double-word increments. Objects in old-space are kept at double-word alignment (address % double-word == 0), and objects in new-space are kept offset from double-word alignment (address % double-word == word). This allows checking an object's age without comparing to a boundry address, avoiding restrictions on heap placement and avoiding loading the boundry from thread-local storage. Additionally, the scavenger can quickly skip over both immediates and old objects with a single branch.
+Heap objects are always allocated in double-word increments. Objects in old-space are kept at double-word alignment (address % double-word == 0), and objects in new-space are kept offset from double-word alignment (address % double-word == word). This allows checking an object's age without comparing to a boundary address, avoiding restrictions on heap placement and avoiding loading the boundary from thread-local storage. Additionally, the scavenger can quickly skip over both immediates and old objects with a single branch.
 
 | Pointer    | Referent                                |
 | ---        | ---                                     |
@@ -29,7 +29,7 @@
 
 A GC is said to be "precise" if when a collection happens it knows exactly what is and is not a pointer into the heap. For example, in compiled Dart code the VM tracks which stack slots contain object pointers and which contain unboxed values. This is opposed to a "conservative" collector that considers any pointer-sized value might be a pointer into the heap, though it might just be an unboxed value.
 
-In a "moving" GC, the address of an object might change, requiring pointers to that object to be updated. In the Dart VM, objects can move during a scavenge or a compaction. A moving GC must be a precise GC: if a conservative GC updates a value that is not guarenteed to be a pointer, it will corrupt execution when the value was not in fact a pointer.
+In a "moving" GC, the address of an object might change, requiring pointers to that object to be updated. In the Dart VM, objects can move during a scavenge or a compaction. A moving GC must be a precise GC: if a conservative GC updates a value that is not guaranteed to be a pointer, it will corrupt execution when the value was not in fact a pointer.
 
 The VM does not know which stack slots, globals or object fields in foreign languages contain pointers into the Dart heap, including the VM's own runtime implemented in C++. For the GC to remain precise, foreign languages reference Dart objects indirectly through "handles". Handles can be thought of as pointers to pointers. They are allocated from the VM, and the GC will visit (and possibly update) the pointers contained in handles during collections.
 
@@ -154,7 +154,7 @@
 
 New-space objects and roots are only visited during a safepoint, and safepoints establish synchronization.
 
-When the mutator's mark block becomes full, it transfered to the marker by an acquire-release operation, so the marker will see the stores into the block.
+When the mutator's mark block becomes full, it transferred to the marker by an acquire-release operation, so the marker will see the stores into the block.
 
 ## Write barrier elimination
 
diff --git a/runtime/tests/concurrency/run_stress_test_shards.dart b/runtime/tests/concurrency/run_stress_test_shards.dart
index 3157880..d2cd67f 100644
--- a/runtime/tests/concurrency/run_stress_test_shards.dart
+++ b/runtime/tests/concurrency/run_stress_test_shards.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
 import 'dart:io' as io;
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index d5a6df9..da3b618 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -194,7 +194,8 @@
       compiler::Address(dest_reg, element_size_, compiler::Address::PostIndex);
 
   // Untag length and skip copy if length is zero.
-  __ adds(length_reg, ZR, compiler::Operand(length_reg, ASR, 1));
+  __ adds(length_reg, ZR, compiler::Operand(length_reg, ASR, 1),
+          compiler::kObjectBytes);
   __ b(&done, ZERO);
 
   __ Bind(&loop);
@@ -268,9 +269,16 @@
   }
   intptr_t shift = Utils::ShiftForPowerOfTwo(element_size_) - 1;
   if (shift < 0) {
+#if defined(DART_COMPRESSED_POINTERS)
+    __ sxtw(start_reg, start_reg);
+#endif
     __ add(array_reg, array_reg, compiler::Operand(start_reg, ASR, -shift));
   } else {
+#if !defined(DART_COMPRESSED_POINTERS)
     __ add(array_reg, array_reg, compiler::Operand(start_reg, LSL, shift));
+#else
+    __ add(array_reg, array_reg, compiler::Operand(start_reg, SXTW, shift));
+#endif
   }
 }
 
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 01e23d2..0ca20ae 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -167,6 +167,10 @@
                           dest_start_reg);
   if (element_size_ <= 8) {
     __ SmiUntag(RCX);
+  } else {
+#if defined(DART_COMPRESSED_POINTERS)
+    __ orl(RCX, RCX);
+#endif
   }
   switch (element_size_) {
     case 1:
@@ -233,15 +237,29 @@
       scale = TIMES_1;
       break;
     case 2:
+#if defined(DART_COMPRESSED_POINTERS)
+      // Clear garbage upper bits, as no form of lea will ignore them. Assume
+      // start is positive to use the shorter orl over the longer movsxd.
+      __ orl(start_reg, start_reg);
+#endif
       scale = TIMES_1;
       break;
     case 4:
+#if defined(DART_COMPRESSED_POINTERS)
+      __ orl(start_reg, start_reg);
+#endif
       scale = TIMES_2;
       break;
     case 8:
+#if defined(DART_COMPRESSED_POINTERS)
+      __ orl(start_reg, start_reg);
+#endif
       scale = TIMES_4;
       break;
     case 16:
+#if defined(DART_COMPRESSED_POINTERS)
+      __ orl(start_reg, start_reg);
+#endif
       scale = TIMES_8;
       break;
     default:
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 6a402e1..da706c5 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -18838,7 +18838,7 @@
   bool has_pointers() const { return has_pointers_; }
 
   void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
-    if (first != last) {
+    if (last >= first) {
       has_pointers_ = true;
     }
   }
@@ -18846,7 +18846,7 @@
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
                                CompressedObjectPtr* last) {
-    if (first != last) {
+    if (last >= first) {
       has_pointers_ = true;
     }
   }
@@ -18882,8 +18882,9 @@
   } else {
 #if defined(DEBUG)
     // Make sure that we are not missing any fields.
-    CheckForPointers has_pointers(IsolateGroup::Current());
-    this->ptr()->untag()->VisitPointers(&has_pointers);
+    IsolateGroup* group = IsolateGroup::Current();
+    CheckForPointers has_pointers(group);
+    this->ptr()->untag()->VisitPointersPrecise(group, &has_pointers);
     ASSERT(!has_pointers.has_pointers());
 #endif  // DEBUG
   }
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 1cdaff0..410779e 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -387,7 +387,7 @@
 void UntaggedObject::VisitPointersPrecise(IsolateGroup* isolate_group,
                                           ObjectPointerVisitor* visitor) {
   intptr_t class_id = GetClassId();
-  if (class_id < kNumPredefinedCids) {
+  if ((class_id != kInstanceCid) && (class_id < kNumPredefinedCids)) {
     VisitPointersPredefined(visitor, class_id);
     return;
   }
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 3000c42..bfbf657 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -3806,7 +3806,7 @@
 
 ```
 class Timeline extends Response {
-  // A list of timeline events. No order is guarenteed for these events; in particular, these events may be unordered with respect to their timestamps.
+  // A list of timeline events. No order is guaranteed for these events; in particular, these events may be unordered with respect to their timestamps.
   TimelineEvent[] traceEvents;
 
   // The start of the period of time in which traceEvents were collected.
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_runtime/lib/rti.dart
index 53e7de9..5264f8a 100644
--- a/sdk/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/rti.dart
@@ -875,6 +875,10 @@
       String propertyName =
           '${JS_GET_NAME(JsGetName.OPERATOR_IS_PREFIX)}${name}';
       Rti._setSpecializedTestResource(testRti, propertyName);
+      if (name == JS_GET_NAME(JsGetName.LIST_CLASS_TYPE_NAME)) {
+        return _finishIsFn(
+            testRti, object, RAW_DART_FUNCTION_REF(_isListTestViaProperty));
+      }
       return _finishIsFn(
           testRti, object, RAW_DART_FUNCTION_REF(_isTestViaProperty));
     }
@@ -987,6 +991,27 @@
   return JS('bool', '!!#[#]', interceptor, tag);
 }
 
+/// Specialized version of [_isTestViaProperty] with faster path for Arrays.
+/// Called from generated code.
+bool _isListTestViaProperty(Object? object) {
+  // This static method is installed on an Rti object as a JavaScript instance
+  // method. The Rti object is 'this'.
+  Rti testRti = _Utils.asRti(JS('', 'this'));
+  if (object == null) return _nullIs(testRti);
+  if (_Utils.isArray(object)) return true;
+  var tag = Rti._getSpecializedTestResource(testRti);
+
+  // This test is redundant with getInterceptor below, but getInterceptor does
+  // the tests in the wrong order for most tags, so it is usually faster to have
+  // this check.
+  if (_isDartObject(object)) {
+    return JS('bool', '!!#[#]', object, tag);
+  }
+
+  var interceptor = getInterceptor(object);
+  return JS('bool', '!!#[#]', interceptor, tag);
+}
+
 /// General unspecialized 'as' check that works for any type.
 /// Called from generated code.
 Object? _generalAsCheckImplementation(Object? object) {
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index 9538239..e2dd66d 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -218,6 +218,9 @@
   /// String representation of the type of the object class.
   OBJECT_CLASS_TYPE_NAME,
 
+  /// String representation of the type of the List class.
+  LIST_CLASS_TYPE_NAME,
+
   /// Property name for Rti._as field.
   RTI_FIELD_AS,
 
diff --git a/tests/language/function_subtype/null_test.dart b/tests/language/function_subtype/null.dart
similarity index 100%
rename from tests/language/function_subtype/null_test.dart
rename to tests/language/function_subtype/null.dart
diff --git a/tests/language/identifier/known_prefix_error_test.dart b/tests/language/identifier/known_prefix_error_test.dart
index 458f6e0..06ec097 100644
--- a/tests/language/identifier/known_prefix_error_test.dart
+++ b/tests/language/identifier/known_prefix_error_test.dart
@@ -15,10 +15,6 @@
 import 'built_in_prefix_library_async.dart' as async;
 import 'built_in_prefix_library_await.dart' as await;
 import 'built_in_prefix_library_hide.dart' as hide;
-import 'built_in_prefix_library_library.dart' as library;
-//                                               ^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
-// [cfe] Can't use 'library' as a name here.
 import 'built_in_prefix_library_of.dart' as of;
 import 'built_in_prefix_library_on.dart' as on;
 import 'built_in_prefix_library_show.dart' as show;
@@ -26,44 +22,52 @@
 import 'built_in_prefix_library_yield.dart' as yield;
 
 async<dynamic> _async = new async.A();
-// [error line 28, column 1, length 5]
+// [error line 24, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'async' isn't a type.
+// [error line 24, column 1]
 // [cfe] Expected 0 type arguments.
 await<dynamic> _await = new await.A();
-// [error line 33, column 1, length 5]
+// [error line 30, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'await' isn't a type.
+// [error line 30, column 1]
 // [cfe] Expected 0 type arguments.
 hide<dynamic> _hide = new hide.A();
-// [error line 38, column 1, length 4]
+// [error line 36, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'hide' isn't a type.
+// [error line 36, column 1]
 // [cfe] Expected 0 type arguments.
 of<dynamic> _of = new of.A();
-// [error line 43, column 1, length 2]
+// [error line 42, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'of' isn't a type.
+// [error line 42, column 1]
 // [cfe] Expected 0 type arguments.
 on<dynamic> _on = new on.A();
 // [error line 48, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'on' isn't a type.
+// [error line 48, column 1]
 // [cfe] Expected 0 type arguments.
 show<dynamic> _show = new show.A();
-// [error line 53, column 1, length 4]
+// [error line 54, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'show' isn't a type.
+// [error line 54, column 1]
 // [cfe] Expected 0 type arguments.
 sync<dynamic> _sync = new sync.A();
-// [error line 58, column 1, length 4]
+// [error line 60, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'sync' isn't a type.
+// [error line 60, column 1]
 // [cfe] Expected 0 type arguments.
 yield<dynamic> _yield = new yield.A();
-// [error line 63, column 1, length 5]
+// [error line 66, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'yield' isn't a type.
+// [error line 66, column 1]
 // [cfe] Expected 0 type arguments.
 
 async.B<async> _B_async = new async.B();
@@ -103,41 +107,49 @@
 //      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'async' isn't a type.
+//      ^
 // [cfe] Expected 0 type arguments.
 await.B<await<dynamic>> _B2_await = new await.B();
 //      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'await' isn't a type.
+//      ^
 // [cfe] Expected 0 type arguments.
 hide.B<hide<dynamic>> _B2_hide = new hide.B();
 //     ^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'hide' isn't a type.
+//     ^
 // [cfe] Expected 0 type arguments.
 of.B<of<dynamic>> _B2_of = new of.B();
 //   ^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'of' isn't a type.
+//   ^
 // [cfe] Expected 0 type arguments.
 on.B<on<dynamic>> _B2_on = new on.B();
 //   ^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'on' isn't a type.
+//   ^
 // [cfe] Expected 0 type arguments.
 show.B<show<dynamic>> _B2_show = new show.B();
 //     ^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'show' isn't a type.
+//     ^
 // [cfe] Expected 0 type arguments.
 sync.B<sync<dynamic>> _B2_sync = new sync.B();
 //     ^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'sync' isn't a type.
+//     ^
 // [cfe] Expected 0 type arguments.
 yield.B<yield<dynamic>> _B2_yield = new yield.B();
 //      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'yield' isn't a type.
+//      ^
 // [cfe] Expected 0 type arguments.
 
 main() {
diff --git a/tests/language/library/a.dart b/tests/language/library/a.dart
new file mode 100644
index 0000000..95f855e
--- /dev/null
+++ b/tests/language/library/a.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2011, 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.
+//
+
+library libraryA.dart;
+
+import "c.dart";
+
+var fooA = fooC;
diff --git a/tests/language/library/b.dart b/tests/language/library/b.dart
new file mode 100644
index 0000000..2a36a64
--- /dev/null
+++ b/tests/language/library/b.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2011, 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.
+//
+
+library libraryB.dart;
+
+import "c.dart";
+
+var fooB = fooC;
diff --git a/tests/language/library/c.dart b/tests/language/library/c.dart
new file mode 100644
index 0000000..fcf3555
--- /dev/null
+++ b/tests/language/library/c.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2011, 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.
+//
+
+library libraryC.dart;
+
+var fooC = 10;
diff --git a/tests/language/library/d.dart b/tests/language/library/d.dart
new file mode 100644
index 0000000..054c033
--- /dev/null
+++ b/tests/language/library/d.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2011, 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.
+//
+
+library libraryD.dart;
+
+import "f.dart";
+
+var fooD = fooC;
diff --git a/tests/language/library/e.dart b/tests/language/library/e.dart
new file mode 100644
index 0000000..0332e42
--- /dev/null
+++ b/tests/language/library/e.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2011, 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.
+//
+
+library libraryE.dart;
+
+import "c.dart";
+import "f.dart";
+
+var fooE = 0;
diff --git a/tests/language/library/f.dart b/tests/language/library/f.dart
new file mode 100644
index 0000000..f73e3cb
--- /dev/null
+++ b/tests/language/library/f.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2011, 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.
+//
+
+library libraryF.dart;
+
+var fooC = 10;
diff --git a/tests/language/library/library3.dart b/tests/language/library/library3.dart
new file mode 100644
index 0000000..625f568
--- /dev/null
+++ b/tests/language/library/library3.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2011, 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.
+//
+
+library library3.dart;
+
+import "../library2.dart"; // defines "foo" and "foo1".
diff --git a/tests/language/library/library4.dart b/tests/language/library/library4.dart
new file mode 100644
index 0000000..25af011
--- /dev/null
+++ b/tests/language/library/library4.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2011, 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.
+//
+
+library library4.dart;
+
+import "../library2.dart"; // defines "foo" and "foo1".
+
+var foo;
+var foo1 = 0;
diff --git a/tests/language/library/library6_test.dart b/tests/language/library/library6.dart
similarity index 100%
rename from tests/language/library/library6_test.dart
rename to tests/language/library/library6.dart
diff --git a/tests/language/nnbd/static_errors/implicit_downcasts_test.dart b/tests/language/nnbd/static_errors/implicit_downcasts.dart
similarity index 100%
rename from tests/language/nnbd/static_errors/implicit_downcasts_test.dart
rename to tests/language/nnbd/static_errors/implicit_downcasts.dart
diff --git a/tests/language/nnbd/static_errors/late_final_without_initializer_test.dart b/tests/language/nnbd/static_errors/late_final_without_initializer.dart
similarity index 99%
rename from tests/language/nnbd/static_errors/late_final_without_initializer_test.dart
rename to tests/language/nnbd/static_errors/late_final_without_initializer.dart
index 57c0485..9938078 100644
--- a/tests/language/nnbd/static_errors/late_final_without_initializer_test.dart
+++ b/tests/language/nnbd/static_errors/late_final_without_initializer.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+
 // Test that it is not a compile time error for a `final` variable to not have
 // an initializer if that variable is declared as `late`.
 import 'package:expect/expect.dart';
diff --git a/tests/language/nnbd/static_errors/local_function_inference_test.dart b/tests/language/nnbd/static_errors/local_function_inference.dart
similarity index 92%
rename from tests/language/nnbd/static_errors/local_function_inference_test.dart
rename to tests/language/nnbd/static_errors/local_function_inference.dart
index a49ff14..af81145 100644
--- a/tests/language/nnbd/static_errors/local_function_inference_test.dart
+++ b/tests/language/nnbd/static_errors/local_function_inference.dart
@@ -24,6 +24,6 @@
     }
   }
   //  ^
-  // [analyzer] unspecified
-  // [cfe] unspecified
+  // [analyzer] undefined
+  // [cfe] undefined
 }
diff --git a/tests/language/nnbd/syntax/late_modifier_bug_39658_test.dart b/tests/language/nnbd/syntax/late_modifier_bug_39658.dart
similarity index 100%
rename from tests/language/nnbd/syntax/late_modifier_bug_39658_test.dart
rename to tests/language/nnbd/syntax/late_modifier_bug_39658.dart
diff --git a/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart b/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart
index 6c6a7ca..126ca63 100644
--- a/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart
+++ b/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart
@@ -5,7 +5,7 @@
 // Requirements=nnbd-weak
 
 
-import 'infer_aliased_factory_invocation_07_lib.dart';
+import 'infer_aliased_factory_invocation_06_lib.dart';
 
 Type typeOf<X>() => X;
 
diff --git a/tests/language/nonfunction_type_aliases/private_names/private_name_duplicate_interface_error_test.dart b/tests/language/nonfunction_type_aliases/private_names/private_name_duplicate_interface_error_test.dart
index 9939ad3..04fe02b 100644
--- a/tests/language/nonfunction_type_aliases/private_names/private_name_duplicate_interface_error_test.dart
+++ b/tests/language/nonfunction_type_aliases/private_names/private_name_duplicate_interface_error_test.dart
@@ -40,7 +40,7 @@
 /// Test that having a private generic class in the super-interface graph
 /// twice with two different generic instantiations is an error.
 class A4 extends A3 implements PublicGenericClass<String> {
-// [error line 40, column 1, length 411]
+// [error line 42, column 7, length 2]
 // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_GENERIC_INTERFACES
 //    ^
 // [cfe] 'A4' can't implement both '_PrivateGenericClass<int>' and '_PrivateGenericClass<String>'
@@ -53,7 +53,7 @@
 /// Test that having a private generic class in the implements clause twice with
 /// two different generic instantiations is an error.
 class A6 implements PublicGenericClass<int>, PublicGenericClass<String> {
-// [error line 53, column 1, length 546]
+// [error line 55, column 7, length 2]
 // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_GENERIC_INTERFACES
 //    ^
 // [cfe] 'A6' can't implement both '_PrivateGenericClass<int>' and '_PrivateGenericClass<String>'
diff --git a/tests/language/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart b/tests/language/nosuchmethod_forwarding/abstract_override_with_different_type.dart
similarity index 100%
rename from tests/language/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart
rename to tests/language/nosuchmethod_forwarding/abstract_override_with_different_type.dart
diff --git a/tests/language/prefix/new_test.dart b/tests/language/prefix/new_test.dart
index 4e13b18..23c7834 100644
--- a/tests/language/prefix/new_test.dart
+++ b/tests/language/prefix/new_test.dart
@@ -5,7 +5,7 @@
 library PrefixTest;
 
 import "package:expect/expect.dart";
-import "new_test1.dart";
+import "test1.dart";
 
 main() {
   Expect.equals(Prefix.getSource(), Prefix.getImport() + 1);
diff --git a/tests/language/prefix/new_test1.dart b/tests/language/prefix/new_test1.dart
index 812c604..106de80 100644
--- a/tests/language/prefix/new_test1.dart
+++ b/tests/language/prefix/new_test1.dart
@@ -4,7 +4,7 @@
 
 library PrefixTest1;
 
-import "new_test2.dart" as test2;
+import "test2.dart" as test2;
 
 class Prefix {
   static const int foo = 43;
diff --git a/tests/language/regress/regress22976_test.dart b/tests/language/regress/regress22976_test.dart
index de83e9b..3371f13 100644
--- a/tests/language/regress/regress22976_test.dart
+++ b/tests/language/regress/regress22976_test.dart
@@ -9,7 +9,7 @@
 class B<T> implements A<T> {}
 
 class C<S, T> implements B<S>, A<T> {}
-// [error line 11, column 1, length 38]
+// [error line 11, column 7, length 1]
 // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_GENERIC_INTERFACES
 //    ^
 // [cfe] 'C' can't implement both 'A<S>' and 'A<T>'
diff --git a/tests/language/regress/regress34091_test.dart b/tests/language/regress/regress34091.dart
similarity index 100%
rename from tests/language/regress/regress34091_test.dart
rename to tests/language/regress/regress34091.dart
diff --git a/tests/language/script/source.dart b/tests/language/script/source.dart
new file mode 100644
index 0000000..44f0d34
--- /dev/null
+++ b/tests/language/script/source.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2011, 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.
+
+// A perfectly legal dart source file for use with script and library tests.
+
+const int script_source = 1;
diff --git a/tests/language/string/overflow_test.dart b/tests/language/string/overflow.dart
similarity index 83%
rename from tests/language/string/overflow_test.dart
rename to tests/language/string/overflow.dart
index f93428a..8b01e19 100644
--- a/tests/language/string/overflow_test.dart
+++ b/tests/language/string/overflow.dart
@@ -9,15 +9,13 @@
 
 main() {
   String a = "a";
+  for (; a.length < 256 * 1024 * 1024;) a = a + a;
 
   var exception_thrown = false;
   try {
-    while (true) {
-      a = "$a$a";
-    }
+    var concat = "$a$a$a$a$a$a$a$a";
   } on OutOfMemoryError catch (exc) {
     exception_thrown = true;
   }
   Expect.isTrue(exception_thrown);
-  Expect.isTrue(a.startsWith('aaaaa') && a.length > 1024);
 }
diff --git a/tests/language/top_level/file3.dart b/tests/language/top_level/file3.dart
new file mode 100644
index 0000000..a42c558
--- /dev/null
+++ b/tests/language/top_level/file3.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2011, 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() {
+  Expect.equals(42, prefix.topLevelVar);
+}
diff --git a/tests/language/unsorted/unevaluated_field_test.dart b/tests/language/unsorted/unevaluated_field.dart
similarity index 91%
rename from tests/language/unsorted/unevaluated_field_test.dart
rename to tests/language/unsorted/unevaluated_field.dart
index f33fbb5..5c701db 100644
--- a/tests/language/unsorted/unevaluated_field_test.dart
+++ b/tests/language/unsorted/unevaluated_field.dart
@@ -6,12 +6,12 @@
 
 import "package:expect/expect.dart";
 
-const int? gx =
+const int gx =
     const bool.hasEnvironment("x") ? const int.fromEnvironment("x") : null;
 
 class A {
-  final int? x = gx;
-  final int? y =
+  final int x = gx;
+  final int y =
       const bool.hasEnvironment("y") ? const int.fromEnvironment("y") : null;
   const A();
 }
diff --git a/tests/language/vm/regression_38412_test.dart b/tests/language/vm/regression_38412.dart
similarity index 100%
rename from tests/language/vm/regression_38412_test.dart
rename to tests/language/vm/regression_38412.dart
diff --git a/tests/language_2/vm/regression_38436_test.dart b/tests/language/vm/regression_38436.dart
similarity index 98%
rename from tests/language_2/vm/regression_38436_test.dart
rename to tests/language/vm/regression_38436.dart
index bda53da..ea5fafd 100644
--- a/tests/language_2/vm/regression_38436_test.dart
+++ b/tests/language/vm/regression_38436.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.
 
-// @dart = 2.9
-
 // VMOptions=--optimization_counter_threshold=1
 
 import "package:expect/expect.dart";
@@ -530,7 +528,8 @@
                                                 57: var4,
                                                 73: var7[-43],
                                                 38: var0
-                                              }).isNotEmpty ||
+                                              })
+                                                  .isNotEmpty ||
                                               ({
                                                 67: var4,
                                                 14: 'M\u{1f600}1HNbP',
@@ -538,7 +537,8 @@
                                                 85: 'uyq',
                                                 95: var7[(-(Int32x4.wwxw))],
                                                 33: ''
-                                              }).isNotEmpty))
+                                              })
+                                                  .isNotEmpty))
                                       : false)
                                   ? var2
                                   : (++var2))
@@ -557,7 +557,8 @@
                                   51: '-8ht',
                                   26: ('(2l3\u2665h' ?? var0),
                                   79: var4
-                                }).isNotEmpty
+                                })
+                                        .isNotEmpty
                                     ? var5[(var2 % loc0)]
                                     : var2) %
                                 ((!(NetworkInterface.listSupported))
@@ -1565,8 +1566,7 @@
 
 class X3 extends X1 {
   Map<int, String> fld3_0 = {
-    if (true)
-      if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
+    if (true) if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
     if (true) 30: '6\u2665P!Pbi',
     81: 't',
     82: '17fx#!',
@@ -1738,7 +1738,8 @@
                                             7: par3,
                                             69: Uri.decodeFull(
                                                 (foo1_3() + 'LX+'))
-                                          }).isEmpty)
+                                          })
+                                            .isEmpty)
                                     ? (~((13 | 64)))
                                     : (-(var2)))),
                             (par1--),
@@ -1793,7 +1794,8 @@
                     4: 'pUc(q',
                     15: 'K\u{1f600}hmdZ\u2665',
                     95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  }).isNotEmpty
+                  })
+                              .isNotEmpty
                           ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
                               foo3_0(var3))
                           : (!(((false || true) ? var1 : false))))
@@ -1991,7 +1993,8 @@
                                   95: '\u{1f600}2tIYqE',
                                   43: (true ? 'baf-\u2665' : var4),
                                   30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                })).isNotEmpty))
+                                }))
+                                  .isNotEmpty))
                             -13
                           else
                             (var1 ? (-((-(var5[56])))) : (var2--)),
@@ -2153,7 +2156,8 @@
                                           ? ((var2--) ?? fld3_2)
                                           : var5[(fld3_2--)])],
                                       52: '(('
-                                    }).isEmpty)))
+                                    })
+                                        .isEmpty)))
                                 ? fld3_0
                                 : {
                                     39: foo1_3(),
diff --git a/tests/language/vm/regression_38436_test.dart b/tests/language/vm/regression_38436_test.dart
deleted file mode 100644
index ca7a920..0000000
--- a/tests/language/vm/regression_38436_test.dart
+++ /dev/null
@@ -1,2359 +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.
-
-// VMOptions=--optimization_counter_threshold=1
-
-import "package:expect/expect.dart";
-
-// Found by DartFuzzing: would sometimes crash on OSR
-// https://github.com/dart-lang/sdk/issues/38436
-
-// Note: When this test was migrated to null safety, changed several type
-// annotations to dynamic to fix the hundreds of null safe errors. That was a
-// less invasive change than adding `?` and `!` throughout the test.
-import 'dart:async';
-import 'dart:cli';
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:core';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-import 'dart:typed_data';
-
-dynamic var0 = '';
-dynamic var1 = true;
-int var2 = -30;
-double var3 = 0.895077679110543;
-dynamic var4 = '';
-List<int> var5 = [55, -70];
-Set<int> var6 = {
-  1024,
-  for (int loc0 in [
-    79,
-    ...[23],
-    ...[90, -89, -24],
-    -90,
-    11,
-    -19,
-    -91
-  ])
-    -55,
-  67,
-  -80,
-  for (int loc0 = 0; loc0 < 29; loc0++) 20,
-  for (int loc0 = 0; loc0 < 24; loc0++) ...{23, -41},
-  ...{
-    -75,
-    128,
-    9223372034707292159,
-    -56,
-    -59,
-    for (int loc0 in {
-      -67,
-      for (int loc1 in [-27, -59, 31, 32, -66, -87]) -9223372036854775680,
-      85,
-      -45,
-      if (false) 70,
-      13,
-      43,
-      48
-    })
-      if (true) 63,
-    ...{-90, -24, -9223372036854743041, -9223372032559808383, 86},
-    -25
-  }
-};
-dynamic var7 = {
-  6: '',
-  ...{56: 'B\u2665pwO', 73: 'ZJDi\u{1f600}m'},
-  ...{73: ')', 14: '93Q'},
-  98: 'xA0jQL',
-  21: ')\u2665TOy',
-  for (int loc0 = 0; loc0 < 82; loc0++) 34: 'Q3\u2665#61',
-  ...{70: 'XXRXl3O', 56: '\u2665lda2Zy', 38: 'Dr#mtz', 6: 'nx'},
-  27: '('
-};
-
-Set<int> foo0() {
-  var3 += ((((var0 + var7[var5[88]])).isEmpty ? true : var1)
-      ? (var1 ? (var3 ?? var3) : var3)
-      : (var1 ? 0.24414824314186978 : var3));
-  var1 ??= true;
-  return {(var2--), Duration.secondsPerHour, var5[var2]};
-}
-
-Map<int, String> foo1(List<int> par1, bool par2) {
-  throw ((-(var3)) * (-(0.943305664017911)));
-}
-
-List<int> foo2(Set<int> par1, List<int> par2, dynamic par3) {
-  switch (-49) {
-    case 4149672951:
-      {
-        for (int loc0 in foo0()) {
-          var6 = var6;
-          try {
-            for (int loc1 = 0; loc1 < 70; loc1++) {
-              switch (((var1
-                      ? ((var1 ? var1 : true) ? Float32x4.xzzw : (--var2))
-                      : (4295032831 % (loc1 + 93))))
-                  .floor()) {
-                case 3294548737:
-                  {
-                    var5[Int32x4.xxwy] ^=
-                        (loc0 * ('!').compareTo(((!(true)) ? var4 : 'S')));
-                  }
-                  break;
-                case 3294548738:
-                  {
-                    var0 = var4;
-                    loc0 <<= Int32x4.zwxz;
-                  }
-                  break;
-              }
-              {
-                int loc2 = 0;
-                do {
-                  var1 = ('Ncb\u2665P9K').isEmpty;
-                  var1 ??= (!(true));
-                } while (++loc2 < 91);
-              }
-            }
-            par3 ??= {
-              44: ((false
-                      ? false
-                      : ((true
-                              ? var7
-                              : {
-                                  17: par3[(var5[-73] - -20)],
-                                  80: var7[
-                                      ((++loc0) ~/ ((!(false)) ? 47 : var2))],
-                                  30: '8Qvz3',
-                                  36: '',
-                                  10: (('@B!0bW6' + var4)).toLowerCase(),
-                                  89: var7[-9223372036854775296],
-                                  4: ') '
-                                }) !=
-                          var7))
-                  ? ((var1 || (!(var1))) ? var7[Float32x4.wxzw] : var7[-7])
-                  : '8h'),
-              for (int loc1 in [
-                (false
-                    ? ((([
-                                  var2,
-                                  -39,
-                                  -74,
-                                  Float32x4.zzxy,
-                                  (~(var5[(67 + -86)])),
-                                  -53
-                                ] +
-                                [(var2++), var5[par2[(--loc0)]]]) !=
-                            [
-                              var5[var5[var5[(loc0++)]]],
-                              loc0,
-                              loc0,
-                              -55,
-                              -69,
-                              loc0
-                            ])
-                        ? (loc0--)
-                        : loc0)
-                    : var2),
-                (75 ^ 93),
-                (false ? var5[Float32x4.xzyw] : (loc0++)),
-                ...[
-                  for (int loc2 in {
-                    -22,
-                    (loc0 ^ 2),
-                    var5[(-((par2[-79] * 86)))],
-                    (++loc0),
-                    ((par2[var5[-45]] ?? 55) >> (true ? Int32x4.wyww : -45)),
-                    (~((++var2))),
-                    par2[var2]
-                  })
-                    (loc0--),
-                  if ((var7[(false ? (-(loc0)) : 19)]).endsWith(var4))
-                    (++var2)
-                  else
-                    (var1 ? loc0 : 39),
-                  (((var2++) & var2) & -26),
-                  if (false) (var1 ? Float32x4.wzzw : var5[129]),
-                  for (int loc2 in {
-                    (loc0--),
-                    (true ? loc0 : loc0),
-                    var2,
-                    var5[(0.4452451921266031).floor()],
-                    (~(-4294967196)),
-                    (loc0--),
-                    (--var2)
-                  })
-                    (var1 ? -30 : (loc0++)),
-                  (~((var1 ? 51 : var2))),
-                  (((var3 ?? pi) < 0.9098824013356337)
-                      ? ((true ? 57 : -48) << (--var2))
-                      : par2[-59])
-                ]
-              ])
-                84: var4,
-              57: var4
-            };
-          } catch (exception, stackTrace) {
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            for (int loc1 = 0; loc1 < 89; loc1++) {
-              switch ((var2--)) {
-                case 3807258589:
-                  {
-                    print(({
-                          (-34 ^
-                              ((false || var1)
-                                  ? 24
-                                  : (-(((-((var1
-                                          ? par2[(-(71))]
-                                          : 9223372032559808768))) +
-                                      (~(loc1))))))),
-                          (~((true ? loc0 : (false ? -75 : 33)))),
-                          Float32x4.zxwz,
-                          (false ? (15 * -83) : (var2--)),
-                          ((var7 !=
-                                  ((true ? var1 : false)
-                                      ? var7
-                                      : {
-                                          99: (true ? 'TobD' : var0),
-                                          59: (var4 ?? var4),
-                                          13: var4,
-                                          58: Uri.encodeFull(var4),
-                                          99: var7[loc1]
-                                        }))
-                              ? loc1
-                              : (var1
-                                  ? ((72 >> -15) ~/ (loc0--))
-                                  : -9223372030412324864)),
-                          32
-                        } ??
-                        par1));
-                  }
-                  break;
-                case 3807258592:
-                  {
-                    var1 ??= true;
-                    try {
-                      var7 = {9: (var1 ? 'ON' : 'f\u{1f600}b')};
-                      par2 = (true
-                          ? var5
-                          : [
-                              DateTime.january,
-                              (40 - (~(var2))),
-                              (var1 ? (--loc0) : 23),
-                              var5[(--var2)]
-                            ]);
-                    } catch (exception, stackTrace) {
-                      var3 /= 0.9998663372091022;
-                    } finally {
-                      par2 ??= ((var1
-                              ? false
-                              : (((par1 ??
-                                          {
-                                            -68,
-                                            86,
-                                            -33,
-                                            var5[(-9223372034707292159 - 90)],
-                                            (24 - (++var2)),
-                                            (-(var2)),
-                                            (loc1 * Int32x4.wyxx)
-                                          }))
-                                      .difference({
-                                    (var1 ? Float32x4.yzyw : (loc1 % loc0)),
-                                    6,
-                                    22,
-                                    91,
-                                    loc0,
-                                    (true ? loc1 : loc1)
-                                  }) ==
-                                  foo0()))
-                          ? par2
-                          : [
-                              (var2--),
-                              (-((++loc0))),
-                              ((-(var5[-52])) ~/
-                                  (true ? Int32x4.wyyy : (loc0--))),
-                              (var3).toInt()
-                            ]);
-                      var5[99] += (~(Float32x4.ywxw));
-                    }
-                  }
-                  break;
-              }
-              var5 = (par2 ??
-                  [
-                    ...[72],
-                    for (int loc2 in {Float32x4.xxwz, loc1})
-                      ((loc0--) ~/ (var2++)),
-                    par2[(++var2)],
-                    (-((--var2))),
-                    (var2++),
-                    -56,
-                    (~((~(loc0)))),
-                    for (int loc2 in {
-                      (-((~(17)))),
-                      Float32x4.zzzw,
-                      Float32x4.zyyz,
-                      (var2--),
-                      (Int32x4.wzwz % 78),
-                      loc0
-                    })
-                      Int32x4.xzzy
-                  ]);
-            }
-            {
-              int loc1 = 0;
-              do {
-                loc0 &= (-(4295000065));
-              } while (++loc1 < 94);
-            }
-          } finally {
-            var3 -= 0.020483900923215503;
-            try {
-              return [
-                ...[
-                  (loc0--),
-                  for (int loc1 in {Float32x4.yxyz})
-                    if (var1) (~(-35)) else loc0,
-                  (++loc0),
-                  for (int loc1 = 0; loc1 < 43; loc1++)
-                    (var5[var5[par2[var5[-9223372032559808384]]]] &
-                        Int32x4.yzxy),
-                  for (int loc1 = 0; loc1 < 98; loc1++) (-((~(Int32x4.xwwy)))),
-                  Float32x4.yzzz
-                ],
-                (-(Int32x4.xzxz))
-              ];
-            } catch (exception, stackTrace) {
-              for (int loc1
-                  in (((((!((((0.13101852551635873 == 0.4825498460563603)
-                                          ? var7
-                                          : var7) !=
-                                      var7)))
-                                  ? 1
-                                  : par2[var2]))
-                              .isEven
-                          ? {
-                              (var2++),
-                              (-48 | -54),
-                              (~(par2[loc0])),
-                              par2[var5[Int32x4.zyzz]],
-                              -2,
-                              (true ? (~((-(((!(false)) ? -11 : var2))))) : 73),
-                              if ((0.15992181539430828).isInfinite) (++var2)
-                            }
-                          : (false ? {-6} : {((++loc0) % 27), 92})) ??
-                      Set.identity())) {
-                var6 ??= foo0();
-              }
-              var5[(~(((true ? -10 : Float32x4.zzwy) -
-                  Duration.millisecondsPerSecond)))] = (~((var2--)));
-            }
-          }
-        }
-        par3.forEach((loc0, loc1) {
-          // Single-line comment.
-          var6 = (var6 ?? foo0());
-          par1 = {
-            if (('X2yPgV').endsWith('b'))
-              Float32x4.yxxy
-            else if (true)
-              Int32x4.xzyw
-            else
-              for (int loc2 = 0; loc2 < 9; loc2++) (++loc0),
-            (4294967551 ?? (-((loc0--)))),
-            (-69 ~/
-                ((!(false))
-                    ? ((((par2[Int32x4.zwzw]).isEven
-                                ? (var3).truncateToDouble()
-                                : 0.14035347150303745))
-                            .isInfinite
-                        ? Int32x4.yzxx
-                        : par2[loc0])
-                    : (var2++))),
-            ((loc0++) - ((++var2) >> (~(par2[(var2--)]))))
-          };
-        });
-      }
-      break;
-    case 4149672955:
-      {
-        par2[((var2 ^ (~((--var2)))) | -98)] *= -62;
-        {
-          int loc0 = 0;
-          do {
-            var0 = par3[(var5[4294967808] >> Float32x4.wwyx)];
-          } while (++loc0 < 46);
-        }
-      }
-      break;
-  }
-  var1 ??= (!((var3).isNaN));
-  return (var1
-      ? par2
-      : Uri.parseIPv6Address(
-          (var1 ? '' : '26DgiI'), (ZLibOption.maxMemLevel % 65), 68));
-}
-
-class X0 {
-  bool fld0_0 = true;
-  Set<int> fld0_1 = {
-    31,
-    if (true) ...{
-      -93,
-      -4294967041,
-      -4294934527,
-      if (false) 92,
-      if (true) 69
-    } else
-      85,
-    ...{
-      ...{73, 27},
-      for (int loc0 in {
-        for (int loc1 = 0; loc1 < 56; loc1++) -36,
-        -23,
-        -99,
-        20,
-        16,
-        11,
-        if (false) -24,
-        if (true) 14
-      })
-        if (false) 69,
-      -9223372032559808513,
-      -9223372036854775553,
-      -9223372036854774784,
-      -22
-    },
-    81,
-    ...{16, if (false) 67 else -30, if (true) 21 else -61, -84},
-    -69
-  };
-
-  List<int> foo0_0(dynamic par1) {
-    if ((var1 ? ((!(fld0_0)) ? true : false) : true)) {
-      return ((var4).trim()).codeUnits;
-    } else {
-      for (int loc0 in var6) {
-        fld0_0 ??= var1;
-        for (int loc1 = 0; loc1 < 57; loc1++) {
-          {
-            Map<int, String> loc2 = Map.identity();
-            par1 ??= Map.unmodifiable(Map.unmodifiable(Map.unmodifiable((true
-                ? loc2
-                : ((true
-                        ? loc2
-                        : foo1(
-                            [var5[-60], loc0, var5[-48], -80, var5[var5[37]]],
-                            var1)) ??
-                    {
-                      60: var0,
-                      93: ((false ? var0 : '') + 'r\u{1f600}2B#p')
-                    })))));
-            var4 = ' ';
-          }
-          try {
-            var5 = foo2(
-                ({loc0, 37, Float32x4.wwyw} ?? var6),
-                ((fld0_0
-                        ? [
-                            for (int loc2 = 0; loc2 < 1; loc2++)
-                              (~(Float32x4.zyzz)),
-                            (~((true
-                                ? (Float32x4.yyzw >> (48 - (-((var2--)))))
-                                : (~(loc0))))),
-                            ((var4 ==
-                                    String.fromEnvironment(
-                                        (var1 ? 'l9FM' : par1[var5[loc0]])))
-                                ? (++loc0)
-                                : 4),
-                            ...[
-                              (~((var5[-9223372032559808448] - (++var2)))),
-                              ...[
-                                for (int loc2 in [
-                                  ((-12 <= 55) ? 9223372032559841280 : loc0),
-                                  var5[var5[(~(var5[var5[loc1]]))]],
-                                  (var1 ? 67 : -74)
-                                ])
-                                  (var5[var2]).sign,
-                                var5[-65],
-                                if (fld0_0)
-                                  var5[(var5[var5[-90]] ~/ 22)]
-                                else
-                                  (-9223372036854775679 + var5[16]),
-                                76,
-                                7
-                              ],
-                              (++var2),
-                              -9223372034707292160,
-                              (var2--),
-                              var5[(var2--)]
-                            ],
-                            loc1,
-                            Float32x4.ywxz,
-                            ((++loc0) + (--loc0)),
-                            for (int loc2 in [
-                              for (int loc3 = 0; loc3 < 4; loc3++) loc1,
-                              ...[
-                                Float32x4.zxwy,
-                                Float32x4.xzwx,
-                                var2,
-                                (++var2),
-                                Int32x4.xzyy,
-                                (var5[loc1] | (true ? -97 : -93)),
-                                Float32x4.xwyz,
-                                ((true || var1)
-                                    ? (~((--loc0)))
-                                    : (~((var5[18] % (-55 + loc0)))))
-                              ],
-                              (~((++loc0))),
-                              -85,
-                              (~((var2++))),
-                              (true
-                                  ? ZLibOption.maxMemLevel
-                                  : var5[var5[var5[var5[var2]]]]),
-                              ((true
-                                      ? ((!((false
-                                              ? (true ? fld0_0 : (!(false)))
-                                              : fld0_0)))
-                                          ? fld0_0
-                                          : (({
-                                                96: var4,
-                                                60: '(0yBGn\u{1f600}',
-                                                57: var4,
-                                                73: var7[-43],
-                                                38: var0
-                                              }).isNotEmpty ||
-                                              ({
-                                                67: var4,
-                                                14: 'M\u{1f600}1HNbP',
-                                                6: 's',
-                                                85: 'uyq',
-                                                95: var7[(-(Int32x4.wwxw))],
-                                                33: ''
-                                              }).isNotEmpty))
-                                      : false)
-                                  ? var2
-                                  : (++var2))
-                            ]) ...[-27]
-                          ]
-                        : [
-                            for (int loc2 = 0; loc2 < 87; loc2++)
-                              (-47 * (~((((--var2) ^ loc0) ?? 78)))),
-                            (-(((({
-                                  14: (var3).toStringAsExponential(
-                                      (false ? var5[-62] : 33)),
-                                  16: '',
-                                  71: var4,
-                                  78: (([var5[(-(91))]] == var5) ? var4 : var0),
-                                  9: par1[loc1],
-                                  51: '-8ht',
-                                  26: ('(2l3\u2665h' ?? var0),
-                                  79: var4
-                                }).isNotEmpty
-                                    ? var5[(var2 % loc0)]
-                                    : var2) %
-                                ((!(NetworkInterface.listSupported))
-                                    ? -22
-                                    : ((var1
-                                            ? ([
-                                                  ZLibOption.STRATEGY_DEFAULT,
-                                                  21,
-                                                  loc1,
-                                                  loc1,
-                                                  loc0,
-                                                  5,
-                                                  loc0,
-                                                  98
-                                                ] ==
-                                                Uri.parseIPv4Address(
-                                                    var7[loc1]))
-                                            : var1)
-                                        ? (~((-20 %
-                                            (var5).removeAt(Float32x4.wyxw))))
-                                        : var5[var5[82]]))))),
-                            (-(Float32x4.wwwz)),
-                            Int32x4.wxxz,
-                            ...[
-                              (loc0++),
-                              ...[
-                                (--loc0),
-                                -2,
-                                ZLibOption.DEFAULT_WINDOW_BITS,
-                                -42,
-                                for (int loc2 = 0; loc2 < 2; loc2++) (-(-22)),
-                                (~(-81))
-                              ],
-                              (--var2)
-                            ],
-                            (++var2),
-                            ((!(false)) ? (--var2) : (((~(34)) >> 48) << 79)),
-                            loc1
-                          ]) +
-                    foo2(
-                        foo0(),
-                        ([
-                              (((~(var5[(-(var5[(87 % var5[(++var2)])]))])) ??
-                                      -11) ~/
-                                  (var2++)),
-                              ((((!(var1)) && true) ? loc1 : 98) <<
-                                  ((!((true != (var4 == par1[var5[(~(-83))]]))))
-                                      ? -44
-                                      : var5[88])),
-                              Float32x4.yyyz,
-                              -44,
-                              Int32x4.xzyx,
-                              (++loc0)
-                            ] ??
-                            [
-                              ((foo1([((!(var1)) ? 24 : 81), -93], true))
-                                      .isEmpty
-                                  ? 52
-                                  : (~(Int32x4.zyww))),
-                              Int32x4.xxwz,
-                              (-(-11)),
-                              (loc0--),
-                              ((!(bool.fromEnvironment('U\u2665')))
-                                  ? (loc0++)
-                                  : (++var2))
-                            ]),
-                        {
-                          70: var7[7],
-                          18: '\u2665(#&c\u{1f600}-',
-                          58: 'KuNr',
-                          96: '\u{1f600}2\u2665YY',
-                          94: var0,
-                          28: 'l-'
-                        })),
-                par1);
-            {
-              double loc2 = double.infinity;
-              /*
-               * Multi-line
-               * comment.
-               */
-              return ('a!wNh!').codeUnits;
-            }
-          } catch (exception, stackTrace) {
-            continue;
-          } finally {
-            fld0_0 = (!(fld0_0));
-            var5 ??= ((Uri.parseIPv4Address('H') ??
-                    (foo2({
-                          loc1,
-                          ([
-                                if (((true ? loc0 : (loc0++)) <
-                                    ((!(var1)) ? -90 : Int32x4.yyzx)))
-                                  (~(var2))
-                                else
-                                  for (int loc2 in {
-                                    if (SecurityContext.alpnSupported)
-                                      var2
-                                    else
-                                      Int32x4.wzzy,
-                                    -9223372036754112763,
-                                    (-((var1
-                                        ? var5[62]
-                                        : (-(Float32x4.wzwz))))),
-                                    (~(Float32x4.yxzy))
-                                  })
-                                    ((((true && (false ? fld0_0 : var1))
-                                                ? fld0_0
-                                                : false)
-                                            ? true
-                                            : (fld0_0 && var1))
-                                        ? (true ? (~(loc1)) : var5[-16])
-                                        : loc0),
-                                for (int loc2 = 0; loc2 < 1; loc2++)
-                                  ((false && var1) ? Float32x4.yzyy : 50)
-                              ][var2] *
-                              [
-                                ...[
-                                  (((-10 >> Int32x4.wxzw) *
-                                          ((0.42979687169554437 >=
-                                                  0.17848133910264385)
-                                              ? -4
-                                              : var5[-15])) |
-                                      var5[(loc0++)]),
-                                  ...[
-                                    (('@jcNl\u2665P')
-                                            .compareTo(var7[(loc0--)]) &
-                                        (~((~(loc0))))),
-                                    if ((!(((!(true)) && true)))) 2,
-                                    loc1,
-                                    ((var5[(loc0--)] | -38) & (loc0++)),
-                                    var2,
-                                    (~(-22)),
-                                    if (false) loc0 else 80,
-                                    (--loc0)
-                                  ],
-                                  ...[15],
-                                  ((~((~(-5)))) ^ Int32x4.xxxz),
-                                  79,
-                                  for (int loc2 in [
-                                    (fld0_0 ? -0 : (loc0++)),
-                                    -49,
-                                    for (int loc3 in [
-                                      -16,
-                                      (var2--),
-                                      35,
-                                      ((14 * -68) ~/ Int32x4.wwyy)
-                                    ])
-                                      var5[(fld0_0 ? 28 : (-41 ?? 19))],
-                                    loc0,
-                                    (var3).round(),
-                                    if ((!((!((!(false))))))) loc1,
-                                    (loc0++),
-                                    Int32x4.wyww
-                                  ])
-                                    ((--var2) * var5[(6 & var5[(~(-53))])]),
-                                  (loc0++),
-                                  Float32x4.xwxx
-                                ],
-                                Int32x4.ywyw,
-                                (-(ZLibOption.strategyFixed)),
-                                (80 % (loc0--)),
-                                var5[Int32x4.zxww]
-                              ][var5[50]]),
-                          (false ? -71 : 39),
-                          (var5[-61]).toSigned(loc0),
-                          -50,
-                          4294967296
-                        }, [
-                          (16 *
-                              (~(((var1 ? ZLibOption.STRATEGY_FIXED : -66) *
-                                  4)))),
-                          Float32x4.wwwx
-                        ], {
-                          63: var0,
-                          52: (fld0_0 ? 'uG\u2665V@4' : '62'),
-                          98: var7[var5[-83]],
-                          70: (false
-                              ? 'bSg'
-                              : base64UrlEncode(([
-                                    (~(var2)),
-                                    -52,
-                                    68,
-                                    [
-                                      10,
-                                      loc1,
-                                      92,
-                                      53,
-                                      Int32x4.zzyw,
-                                      (true ? 12 : 19),
-                                      (~(var5[(++var2)]))
-                                    ][-64],
-                                    (++loc0),
-                                    (loc0 << -26)
-                                  ] +
-                                  [
-                                    var5[(--loc0)],
-                                    (((var1 ? var5[var5[(var2--)]] : loc1) +
-                                            (--var2)) <<
-                                        Int32x4.wyyx)
-                                  ]))),
-                          16: 'YsD\u2665\u2665K',
-                          0: var0,
-                          93: var7[(-(var5[-43]))]
-                        }) ??
-                        var5)) ??
-                [
-                  if (fld0_0) -90,
-                  (--var2),
-                  ...[
-                    for (int loc2 in [
-                      (false ? (~(-9)) : -4294901760),
-                      (-(-7)),
-                      -51,
-                      (var1 ? -75 : [Float32x4.wwxw, Int32x4.zxyx][-7]),
-                      Float32x4.xyww,
-                      Int32x4.wwzx,
-                      (loc0++),
-                      (NetworkInterface.listSupported
-                          ? [1000][Float32x4.zzyx]
-                          : -71)
-                    ])
-                      -27,
-                    Float32x4.wyzy,
-                    (++var2)
-                  ]
-                ]);
-          }
-        }
-      }
-      throw Map.unmodifiable(foo1(
-          (MapBase.mapToString(foo1((false ? [var2] : var5), false))).codeUnits,
-          true));
-    }
-  }
-
-  void run() {}
-}
-
-class X1 extends X0 {
-  double fld1_0 = 0.47694301047645304;
-  bool fld1_1 = true;
-
-  Map<int, String> foo1_0(
-      Map<int, String> par1, Map<int, String> par2, double par3) {
-    // Single-line comment.
-    for (int loc0 = 0; loc0 < 91; loc0++) {
-      par2.forEach((loc1, loc2) {
-        {
-          bool loc3 = (fld1_1 || ('U\u2665').isEmpty);
-          var3 /= 0.8504341352135224;
-        }
-      });
-      {
-        int loc1 = 66;
-        while (--loc1 > 0) {
-          if (((!((true || fld1_1))) == true)) {
-            var0 ??= par2[var5[(~((false ? ((!(var1)) ? -95 : var2) : -37)))]];
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            return Map.unmodifiable({
-              55: var4,
-              73: 'c#',
-              17: (fld1_1
-                  ? '7\u{1f600}e'
-                  : ((!(var1)) ? '8E7AK2e' : 'Fm\u{1f600} F')),
-              40: 'mb(\u{1f600}\u2665l',
-              36: Uri.decodeFull((true ? par2[-32769] : var7[Float32x4.zyxz])),
-              51: ((false &&
-                      (((var1 ? true : true) || false)
-                          ? (var7[(var2--)]).isEmpty
-                          : true))
-                  ? (fld1_1
-                      ? (fld1_1 ? (var1).toString() : 'r9M')
-                      : ((true ? (0.2863696758528199 != par3) : false)
-                          ? (fld1_1 ? par1[Int32x4.zwyz] : var4)
-                          : var4))
-                  : var4),
-              8: '6G',
-              62: '+z@Gp'
-            });
-          } else {
-            var5[Int32x4.zzyy] ??= (-(var5[((!(false)) ? loc1 : -34)]));
-            {
-              int loc2 = (-(7));
-              var3 /= (true
-                  ? (-(((-9223372032459145467).isEven
-                      ? fld1_0
-                      : (-((-(0.7008573255099826)))))))
-                  : par3);
-            }
-          }
-          for (int loc2 in foo2(var6, var5, {
-            if (false) 11: par1[((var4).isEmpty ? 55 : -61)],
-            12: 'f5j2v\u{1f600}',
-            52: (((foo1(
-                            (((var1
-                                        ? {var5[-66], var2, 88, 12, 6, -96}
-                                        : (var1
-                                            ? {-25, 84, (var2--), var5[83]}
-                                            : {-36, var5[51], var2})) !=
-                                    {var5[(++var2)]})
-                                ? [-2147483648, 46, loc0, var5[loc0], -21]
-                                : foo2(
-                                    {var5[var5[loc0]]},
-                                    (true
-                                        ? var5
-                                        : [
-                                            -30,
-                                            var5[(-(-42))],
-                                            var2,
-                                            Float32x4.zywx,
-                                            loc1,
-                                            63,
-                                            -25,
-                                            -28
-                                          ]),
-                                    {30: 'j\u2665U', 98: var4})),
-                            false))
-                        .isNotEmpty
-                    ? (false ? fld1_0 : 0.3202297128057393)
-                    : 0.1301025669674245))
-                .toStringAsFixed(((fld1_1 ? 79 : -88) + Int32x4.xyzw)),
-            88: (false ? var7[(var2++)] : (var4 ?? '')),
-            31: (var1
-                ? (var1 ? par2[-87] : (true ? par2[-14] : var4))
-                : ((fld1_1 != true) ? '3nd9t&' : var4)),
-            22: ('(Czi' + '-Y')
-          })) {
-            var7[(loc2--)] = 's';
-          }
-        }
-      }
-    }
-    return par1;
-  }
-
-  String foo1_1(int par1) => var0;
-  Set<int> foo1_2(String par1) {
-    for (int loc0 = 0; loc0 < 58; loc0++) {
-      switch ((~(13))) {
-        case 746492976:
-          {
-            switch (Duration.millisecondsPerDay) {
-              case 3635015902:
-                {
-                  var7[var5[(var5[var2] * (-(var5[Float32x4.yxxz])))]] ??=
-                      (var7[-79] + '(O@');
-                  var7[loc0] ??= String.fromCharCode(var5[(true
-                      ? (var5[((var1 ? true : (false ? fld1_1 : var1))
-                              ? var5[Float32x4.wyyz]
-                              : 73)] ~/
-                          (-(84)))
-                      : -15)]);
-                }
-                break;
-              case 3635015905:
-                {
-                  var1 = (var1
-                      ? (foo1_0(
-                              (((!(false)) || fld1_1) ? var7 : var7),
-                              foo1_0(
-                                  {74: '\u2665e', 10: 'tw8jc0R'},
-                                  foo1_0(
-                                      var7,
-                                      foo1_0(
-                                          ({
-                                                17: var7[Int32x4.zyxy],
-                                                82: var7[64],
-                                                27: 'VEtj',
-                                                90: Uri.encodeQueryComponent(
-                                                    foo1_1(var2)),
-                                                68: 'wew0\u{1f600}'
-                                              } ??
-                                              foo1_0(var7, var7, var3)),
-                                          ({
-                                                65: 'mBeBfUj',
-                                                81: var4,
-                                                35: (var7[-43] + 'l'),
-                                                68: var4
-                                              } ??
-                                              {
-                                                33: ('N\u{1f600}xaY+' ?? par1),
-                                                44: var7[var5[var2]],
-                                                83: var4,
-                                                86: 'k'
-                                              }),
-                                          asin(0.4245871535895427)),
-                                      (-(0.2913717674787144))),
-                                  0.9439800024935644),
-                              (-((true
-                                  ? ((var1 ? false : var1)
-                                      ? 0.09441225978923817
-                                      : 0.42622157485045953)
-                                  : (-(0.29370792038584836)))))))
-                          .isNotEmpty
-                      : (false && true));
-                  var3 += (-(fld1_0));
-                }
-                break;
-            }
-          }
-          break;
-        case 746492979:
-          {
-            var4 = var0;
-            for (int loc1 = 0; loc1 < 88; loc1++) {
-              var2 += 32;
-            }
-          }
-          break;
-      }
-    }
-    {
-      int loc0 = 0;
-      do {
-        return foo0();
-      } while (++loc0 < 57);
-    }
-    return foo0();
-  }
-
-  String foo1_3() {
-    if ((0.42144855521066793).isNegative) {
-      print((false ? (-(fld1_0)) : (-((-((-(0.26854952952179667))))))));
-      switch (30) {
-        case 3830102525:
-          {
-            try {
-              var7.forEach((loc0, loc1) {
-                var1 = (!(true));
-                var6 = (foo1_2(var7[99]) ?? var6);
-              });
-              var6 ??= var6;
-            } catch (exception, stackTrace) {
-              var4 ??= ListBase.listToString([
-                (Duration.microsecondsPerSecond + -82),
-                (true
-                    ? var5[(var2 ~/ (false ? (~((var1 ? 46 : var2))) : var2))]
-                    : (-9223372034707292161 >> var5[var5[-86]])),
-                Float32x4.wxyx
-              ]);
-            } finally {
-              /**
-               ** Multi-line
-               ** documentation comment.
-               */
-              fld1_1 = (var5[var5[var2]]).isOdd;
-            }
-            /*
-           * Multi-line
-           * comment.
-           */
-            if ((SetBase.setToString((fld1_1
-                    ? {12, (fld1_1 ? (-(-22)) : (-(4395630341)))}
-                    : var6)))
-                .isNotEmpty) {
-              try {
-                {
-                  int loc0 = 86;
-                  while (--loc0 > 0) {
-                    {
-                      int loc1 = 0;
-                      do {
-                        var0 = var7[(-(((--var2) &
-                            ((var1 ? (fld1_0).isNaN : true)
-                                ? (-16 | -20)
-                                : ((0.7513819161190503).isNaN ? 45 : loc1)))))];
-
-                        /// Single-line documentation comment.
-                        var5[(true ? loc0 : Float32x4.zxzx)] %= loc0;
-                      } while (++loc1 < 17);
-                    }
-                    for (int loc1 = 0; loc1 < 25; loc1++) {
-                      var5[Float32x4.zywy] <<= Int32x4.ywwx;
-                    }
-                  }
-                }
-              } catch (exception, stackTrace) {
-                var7 = Map.from(foo1_0({
-                  81: (foo1_1(((++var2) * (-(var5[21])))) +
-                      (var7[8] + (var7[var5[53]] ?? var0))),
-                  for (int loc0 in [
-                    (true ? 58 : Float32x4.wyww),
-                    var5[(fld1_1 ? 46 : var2)]
-                  ])
-                    63: var7[(false
-                        ? var5[((24 >> -9223372036854710272) & var2)]
-                        : var5[(80 << var5[-31])])],
-                  67: var0,
-                  1: '3mlOA',
-                  30: ('OQbG').substring((var2--), (--var2)),
-                  93: ((var7[74] ?? var7[(++var2)])).toLowerCase(),
-                  ...{
-                    85: foo1_1(-21),
-                    if ((!((!(false))))) 86: var0,
-                    49: '62+v',
-                    59: foo1_1((--var2)),
-                    for (int loc0 in [
-                      -10,
-                      -65,
-                      (var2++),
-                      (var2++),
-                      ((({
-                                    ((var7[60] == var7[-30])
-                                        ? var5[(-((var2++)))]
-                                        : (var2--))
-                                  } ==
-                                  {var5[var2], -40, -81, (var2++), 93, 26})
-                              ? 38
-                              : (var1 ? var5[97] : -82)) *
-                          (--var2)),
-                      (~((true ? 5 : Float32x4.yxyy))),
-                      (var2++),
-                      ((++var2) << ((var2 % Int32x4.yxxw) >> (++var2)))
-                    ])
-                      54: (var0 + 'ANyqN'),
-                    94: (var1 ? '0T\u2665#w' : (var0).toUpperCase()),
-                    68: '@n',
-                    67: base64UrlEncode(((0.07857744084458451).isInfinite
-                        ? ([
-                              var2,
-                              var5[70],
-                              -32,
-                              Float32x4.yxwz,
-                              31,
-                              (~(var2)),
-                              (var2 ?? (-70 + 57)),
-                              -91
-                            ] +
-                            [
-                              var2,
-                              var5[((!(var1))
-                                  ? var5[(var2 ~/ Float32x4.zwyw)]
-                                  : var5[var5[(var5[(~(var2))] % var2)]])],
-                              (var2 | (false ? (-(var2)) : var5[80])),
-                              (var2--),
-                              DateTime.daysPerWeek,
-                              (var2 ~/ var2)
-                            ])
-                        : (var1 ? var5 : [(var2++)])))
-                  },
-                  if (false)
-                    if (false)
-                      26: (Uri.encodeComponent(foo1_1(var2)) + var7[var5[var2]])
-                    else ...{
-                      4: (double.negativeInfinity).toStringAsFixed(var2),
-                      46: Uri.decodeQueryComponent('bst3jz'),
-                      5: ((true
-                              ? (true ? '(-f' : var7[(-(Int32x4.yzxz))])
-                              : var7[(var5[(fld1_1 ? (var2--) : var2)] >>
-                                  (-((false ? 8589934591 : 33))))]) ??
-                          '4ov'),
-                      37: var7[var5[100663045]],
-                      13: '2B'
-                    }
-                }, {
-                  71: 'Hxbq',
-                  22: ('\u{1f600}Jtj').substring(
-                      (-36 | var5[(~((var2++)))]), 9223372032559874048)
-                }, 0.3710694748818374));
-                fld1_0 ??= 0.010604823956237519;
-              } finally {
-                for (int loc0 = 0; loc0 < 84; loc0++) {
-                  var5[Float32x4.xwwz] <<=
-                      ((((fld1_1 ? false : ('e\u{1f600}O+Vc').isNotEmpty) &&
-                                  (!(fld1_1)))
-                              ? (-73 | var5[Int32x4.yzwx])
-                              : Uint16List.bytesPerElement) ~/
-                          var2);
-                }
-              }
-            }
-          }
-          break;
-        case 3830102528:
-          {
-            fld1_1 ??= true;
-            throw (-((-17).ceilToDouble()));
-          }
-          break;
-      }
-    }
-    return var0;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = 61;
-      while (--loc0 > 0) {
-        {
-          int loc1 = 77;
-          while (--loc1 > 0) {
-            {
-              int loc2 = 0;
-              do {
-                break;
-              } while (++loc2 < 84);
-            }
-          }
-        }
-        if (((var1 || fld1_1) && (!((!((!((!((!(true)))))))))))) {
-          switch (Int32x4.yyzx) {
-            case 900727295:
-              {
-                /// Single-line documentation comment.
-                fld1_1 ??= (!(true));
-                for (int loc1 in ((var5 ??
-                        Uri.parseIPv6Address(
-                            foo1_3(), var5[(loc0 + var5[4096])], -34)) ??
-                    var5)) {
-                  var7[(38 << (false ? (~(-58)) : Float32x4.yyxy))] =
-                      Uri.decodeFull(foo1_3());
-                  var5 ??= var5;
-                }
-              }
-              break;
-            case 900727304:
-              {
-                fld1_1 =
-                    (SecurityContext.alpnSupported ? (var3).isFinite : var1);
-                fld1_0 += 0.3154406798513474;
-              }
-              break;
-          }
-          var2 ^= var2;
-        } else {
-          if (((-(var3)) <= (-(fld1_0)))) {
-            var6 = foo1_2('0vsDWF9');
-          } else {
-            var6 ??= ((fld1_0 <= 0.16230005903410238)
-                ? ((!((0.5144029832155854 > (0.8199455895430549 / var3))))
-                    ? foo1_2('ken')
-                    : var6)
-                : (fld1_1 ? {56, 6442450945, 2} : {34}));
-          }
-          var5[Float32x4.zwzw] += (true ? var2 : (~(Float32x4.wyyx)));
-        }
-      }
-    }
-  }
-}
-
-class X2 extends X0 with X1 {
-  dynamic fld2_0 = {for (int loc0 = 0; loc0 < 60; loc0++) -56, 29};
-
-  bool foo2_0(int par1) => var1;
-  bool foo2_1(bool par1) {
-    for (int loc0 in var6) {
-      var2 ~/= ((((((fld2_0 ?? (true ? var6 : var6)) ?? fld2_0))
-                      .union({(~(-21)), 10}) !=
-                  {(var5[90] ~/ (-(-90)))})
-              ? par1
-              : (var7[(~(82))]).isNotEmpty)
-          ? ((~(loc0)) *
-              ((true ? (-4294966272 ?? -21) : var2) +
-                  Duration.millisecondsPerMinute))
-          : (-9223372032559807488 ~/ 4294968296));
-    }
-    if (('DeAm#f' ==
-        ((Uri.encodeQueryComponent((0.3687340601979223).toString()) ??
-                var7[-23]) ??
-            foo1_3()))) {
-      throw (([Float32x4.wyyz, -9223372036854743039])
-              .sublist((--var2), (--var2)) +
-          ((true ? var1 : (!(false)))
-              ? foo2(
-                  foo1_2('JLXt'),
-                  [
-                    var5[Int32x4.zxzx],
-                    Int32x4.xxwy,
-                    (var2++),
-                    Float32x4.yzxx,
-                    (var2++),
-                    -15
-                  ],
-                  foo1_0(var7, var7, 0.7904389283184639))
-              : (var1
-                  ? [Float32x4.yzyz, Int32x4.wxxy, var2, (~(var5[-47]))]
-                  : var5)));
-    } else {
-      var7[var2] ??= ((({
-            ...{
-              for (int loc0 = 0; loc0 < 19; loc0++)
-                36: (var7[var2] ?? (par1 ? ('ccb9z' + 'iM') : var0)),
-              3: ('1sG' + var0),
-              for (int loc0 in {
-                (-(var5[var2])),
-                if (var1) Int32x4.zxxx,
-                -4294967168,
-                -61,
-                (~((par1 ? (~(-70)) : (var2--)))),
-                (-(7)),
-                -96,
-                Uint32List.bytesPerElement
-              })
-                85: var4
-            },
-            if (foo2_0(-91)) 38: (var3).toString() else 30: 'uI\u2665\u{1f600}',
-            72: '@'
-          }[(par1 ? 14 : var2)])
-                  .trim())
-              .substring((36 ~/ var5[(++var2)]), var5[((-(25)) * -53)]) ??
-          foo1_3());
-      /*
-       * Multi-line
-       * comment.
-       */
-      {
-        int loc0 = 0;
-        do {
-          {
-            String loc1 = 'jG7t';
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            {
-              int loc2 = 57;
-              while (--loc2 > 0) {
-                print((var6 ??
-                    (foo1_2(var0)).union(foo1_2(('n' + var7[(++var2)])))));
-              }
-            }
-          }
-        } while (++loc0 < 69);
-      }
-    }
-    return (!(((!((par1 && false)))
-        ? (true && foo2_0(-9223372036854771712))
-        : (!(par1)))));
-  }
-
-  double foo2_2(Map<int, String> par1, int par2) {
-    switch (var2) {
-      case 3816231196:
-        {
-          throw (-(Int32x4.xxwx));
-        }
-        break;
-      case 3816231204:
-        {
-          var7.forEach((loc0, loc1) {
-            switch ((-43 ^ (-(Float32x4.wwxx)))) {
-              case 2839002105:
-                {
-                  var0 ??= (SetBase.setToString(((var1 ? var1 : (true || var1))
-                          ? fld2_0
-                          : {
-                              Int32x4.yyzw,
-                              Int32x4.yyxy,
-                              (2 >> Int32x4.ywzx),
-                              (var1
-                                  ? ((foo2_1(var1) ? 17 : loc0) ~/
-                                      (-(var5[var2])))
-                                  : par2),
-                              Float32x4.zwwx,
-                              par2,
-                              Int32x4.wzzz,
-                              Int32x4.zyzw
-                            })) ??
-                      (loc1 +
-                          var7[((true
-                                  ? (var1 &&
-                                      bool.fromEnvironment(var7[(var2--)]))
-                                  : foo2_1(false))
-                              ? 35
-                              : (-(66)))]));
-                  for (int loc2 = 0; loc2 < 23; loc2++) {
-                    switch ((-73 ^ (Int32x4.xyzz >> Float32x4.yzzz))) {
-                      case 1710454916:
-                        {
-                          var3 = 0.3372913861348876;
-                          print(((-(var3)) * var3));
-                        }
-                        break;
-                      case 1710454922:
-                        {
-                          var4 ??= ((false
-                                  ? (var1
-                                      ? var1
-                                      : (fld2_0 ==
-                                          {
-                                            (false ? -27 : (-(92))),
-                                            loc2,
-                                            var5[loc2],
-                                            (var1
-                                                ? Float32x4.yywy
-                                                : (false ? -74 : 2)),
-                                            ((-(-50)) ^ 32),
-                                            (var2++)
-                                          }))
-                                  : var1)
-                              ? base64UrlEncode([
-                                  for (int loc3 in {
-                                    (-(par2)),
-                                    loc0,
-                                    (-((par2++))),
-                                    Float32x4.yyyx
-                                  })
-                                    (par2--),
-                                  (-((-(var5[var5[var5[-41]]])))),
-                                  if (({
-                                        loc2,
-                                        Duration.microsecondsPerSecond,
-                                        (([
-                                                  (par2++),
-                                                  (-90 ^ -5),
-                                                  var5[(~(0))],
-                                                  loc2
-                                                ] !=
-                                                var5)
-                                            ? -9223372032559808512
-                                            : (par2++))
-                                      } ==
-                                      {
-                                        (var1 ? (-((loc2 % loc2))) : loc2),
-                                        -94,
-                                        -62
-                                      }))
-                                    (++var2),
-                                  loc2,
-                                  for (int loc3 in {
-                                    55,
-                                    (~(var5[var5[(++par2)]])),
-                                    ((var1
-                                            ? (-((++var2)))
-                                            : var5[(true ? var5[68] : 10)]) -
-                                        par2),
-                                    (-(Float32x4.wzxx))
-                                  })
-                                    (Int32x4.yxzy | var5[-1]),
-                                  (foo2_1(false) ? (-(32)) : loc0),
-                                  (--par2),
-                                  if ((!(false))) (var1 ? var5[loc0] : 30)
-                                ])
-                              : ('b1TKp3' ??
-                                  (var4 +
-                                      var7[(~(var5[
-                                          ((var1 ? var2 : loc2) - 72)]))])));
-                        }
-                        break;
-                    }
-                    fld2_0 = ((!((false
-                            ? false
-                            : (false ? (!((var7[-28] != ''))) : var1))))
-                        ? (((var1
-                                    ? (true ? Set.identity() : var6)
-                                    : {
-                                        -63,
-                                        Int32x4.xxyx,
-                                        var5[((var1
-                                                ? (var5[-9223372032559808496] >>
-                                                    59)
-                                                : Int32x4.wxxy) ~/
-                                            var5[var5[-48]])],
-                                        (par2 ?? par2),
-                                        44,
-                                        var5[(var1 ? -26 : (-(par2)))]
-                                      }) ??
-                                ({
-                                      loc2,
-                                      var2,
-                                      ZLibOption.defaultMemLevel,
-                                      (true ? Int32x4.wyzz : 40),
-                                      (false ? loc2 : var5[42]),
-                                      -16
-                                    } ??
-                                    var6)))
-                            .union({loc0, (var2++), (-1 * (~(var2)))})
-                        : (bool.fromEnvironment((var3)
-                                .toStringAsFixed(Uint64List.bytesPerElement))
-                            ? fld2_0
-                            : {
-                                (par2++),
-                                (var1 ? loc2 : (++var2)),
-                                ((false || false) ? Int32x4.xyyz : (++par2)),
-                                var5[-98],
-                                Float32x4.zwwy,
-                                var5[var5[62]],
-                                (~(Float32x4.ywww))
-                              }));
-                  }
-                }
-                break;
-              case 2839002106:
-                {
-                  for (int loc2 = 0; loc2 < 13; loc2++) {
-                    {
-                      int loc3 = 0;
-                      do {
-                        switch ((loc3 | -76)) {
-                          case 2164097105:
-                            {
-                              var4 ??= (var1).toString();
-                              var5 = ((!(((true || var1) !=
-                                      (false ? var1 : (!(foo2_1(var1)))))))
-                                  ? foo2(
-                                      ((var6).union(foo1_2(loc1))).toSet(),
-                                      [
-                                        -67,
-                                        if (((var1
-                                                ? 59
-                                                : (-((false ? -97 : par2)))) !=
-                                            (false
-                                                ? ((var1 || var1)
-                                                    ? (-((par2++)))
-                                                    : 4)
-                                                : (--var2)))) ...[
-                                          ((92 ~/ Int32x4.yzwx) << 70),
-                                          Float32x4.xxyz,
-                                          Int8List.bytesPerElement
-                                        ] else
-                                          69
-                                      ],
-                                      var7)
-                                  : foo2(foo0(), Uri.parseIPv4Address(var0),
-                                      var7));
-                            }
-                            break;
-                          case 2164097111:
-                            {
-                              var4 ??= var7[Float32x4.zxzw];
-                            }
-                            break;
-                        }
-                      } while (++loc3 < 96);
-                    }
-                    fld2_0 = var6;
-                  }
-                }
-                break;
-            }
-          });
-          for (int loc0 in (foo2_1((var5 !=
-                  (false
-                      ? [par2]
-                      : foo2(
-                          var6,
-                          [20],
-                          ({
-                                21: var0,
-                                68: foo1_3(),
-                                24: ('1MF' + '8s\u2665yx+ ')
-                              } ??
-                              {
-                                9: var7[var2],
-                                48: 'mB(wW\u{1f600}',
-                                74: 'ojEw\u{1f600}\u{1f600}',
-                                80: '\u26655E-hj\u{1f600}',
-                                10: (false ? 'W7i5\u2665YX' : '! Ed9&'),
-                                88: (false ? var0 : 'N0D9(H\u{1f600}'),
-                                5: 'QZ'
-                              })))))
-              ? foo1_2('XP')
-              : {
-                  if ((foo2_1(var1)
-                      ? (foo2_1((fld2_0).add(-9223372036854774784)) || var1)
-                      : var1))
-                    (~(Float32x4.zyww)),
-                  Float32x4.xwyw,
-                  ((((var1 ? true : var1) ? 0.3447071353935154 : var3) >=
-                          0.5995056331958718)
-                      ? ZLibOption.MAX_LEVEL
-                      : 16),
-                  9223372032559841279,
-                  Int32x4.zwyy
-                })) {
-            for (int loc1 = 0; loc1 < 19; loc1++) {
-              var1 = (!(bool.fromEnvironment(MapBase.mapToString({
-                1: '4',
-                56: var0,
-                85: var0,
-                51: var7[-4],
-                42: ((!((!(false)))) ? par1[72] : MapBase.mapToString(var7))
-              }))));
-            }
-          }
-        }
-        break;
-    }
-    print((((var1 ? 'kP' : (var1 ? 'irjF' : var7[var5[90]])) ??
-            ((!(false)) ? 'vWa\u{1f600}' : var0)) +
-        'xzpK'));
-    return var3;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = (~(-24));
-      var0 ??= ((false
-              ? foo2_1((true
-                  ? (var1 && (var2).isOdd)
-                  : (('dTYR' ?? 'G\u{1f600}P14\u{1f600}a')).isEmpty))
-              : ((var1 && true) || (!(var1))))
-          ? (var4 ?? 'I')
-          : 'QO');
-    }
-  }
-}
-
-class X3 extends X1 {
-  dynamic fld3_0 = {
-    if (true)
-      if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
-    if (true) 30: '6\u2665P!Pbi',
-    81: 't',
-    82: '17fx#!',
-    92: 'H',
-    if (true) 69: ')Ls'
-  };
-  Set<int> fld3_1 = {27};
-  int fld3_2 = 34;
-
-  String foo1_1(int par1) {
-    throw (ListBase.listToString(foo2({
-          -4294967169,
-          par1
-        }, [
-          -97,
-          (var5[(var1 ? var5[87] : Int32x4.yxxy)] * Int32x4.yyxx),
-          var2,
-          (false ? 10 : var5[var5[(par1++)]])
-        ], var7)) ??
-        'o');
-  }
-
-  bool foo3_0(double par1) {
-    {
-      Set<int> loc0 = (true ? fld3_1 : var6);
-      {
-        Set<int> loc1 = (false
-            ? foo0()
-            : {
-                for (int loc2 in [var2, (-(Float32x4.xzzw))])
-                  if (false) Float32x4.wxyz else (++fld3_2),
-                ((var1
-                        ? 5
-                        : var5[(((var5[(true ? fld3_2 : fld3_2)] ~/ 48) | 56) %
-                            var5[-4])]) ??
-                    (var2++))
-              });
-        for (int loc2 = 0; loc2 < 90; loc2++) {
-          {
-            int loc3 = 95;
-            while (--loc3 > 0) {
-              return (((0.7073184699576396).isNaN
-                      ? var7
-                      : (Map.of(Map.from(var7)) ??
-                          Map.unmodifiable(Map.identity()))))
-                  .isEmpty;
-            }
-          }
-          try {
-            var1 = (((12 >= Int32x4.ywxx) ? true : true)
-                ? false
-                : (((var1 ? fld3_0[Int32x4.wyxy] : '') ?? var7[Float32x4.xwwx]))
-                    .isEmpty);
-            var2 |= ((fld3_2++) ?? (fld3_2--));
-          } catch (exception, stackTrace) {
-            var5 ??= var5;
-          } finally {
-            var4 = 'A';
-            break;
-          }
-        }
-        {
-          double loc2 = (-(exp((acos(0.06129144867031855) ?? var3))));
-          fld3_0 = (((({Int32x4.ywxw, 6442450943}).union(foo0()))
-                      .add((++fld3_2))
-                  ? false
-                  : false)
-              ? foo1_0(
-                  (foo1([var5[var2], var5[75], 42], false) ?? var7), var7, loc2)
-              : (var1
-                  ? {
-                      for (int loc3 = 0; loc3 < 48; loc3++) 78: 'dWek8',
-                      40: fld3_0[(var5[-81] & Int32x4.xzyw)],
-                      73: (' )G\u2665-d(').substring(
-                          (NetworkInterface.listSupported
-                              ? (~(((++var2) ?? (fld3_2 * fld3_2))))
-                              : var5[-75]),
-                          fld3_2),
-                      74: ('k9O\u2665').trimLeft(),
-                      88: var7[(++var2)],
-                      for (int loc3 = 0; loc3 < 27; loc3++)
-                        60: ((false || var1) ? var7[46] : var0),
-                      99: ((var3).isNaN
-                          ? (Uri.decodeComponent(foo1_3()) + var4)
-                          : var7[-77]),
-                      92: (true
-                          ? ('').padLeft(82, '')
-                          : ('' ?? var7[(false ? 94 : 58)]))
-                    }
-                  : var7));
-
-          /// Single-line documentation comment.
-          fld3_1 ??= ((loc1 ?? foo1_2(fld3_0[(var2--)])) ?? foo1_2(foo1_3()));
-        }
-      }
-    }
-    return (var1 ? (!(var1)) : var1);
-  }
-
-  String foo3_1(int par1, String par2, String par3) {
-    switch (var2) {
-      case 3768780679:
-        {
-          {
-            int loc0 = (++par1);
-            var0 ??= ListBase.listToString(var5);
-            if (true) {
-              var5 = [
-                Float32x4.xyxz,
-                (var1
-                    ? ((!(false)) ? Float32x4.xyyw : (++fld3_2))
-                    : var5[fld3_2]),
-                par1,
-                (~(Float32x4.zxwy)),
-                if ((foo3_0(var3)
-                    ? ([
-                          (++fld3_2),
-                          ...[
-                            ...[
-                              var5[(true ? Float32x4.xxzx : (--fld3_2))],
-                              54,
-                              (-((((foo3_0(var3)
-                                          ? (!(false))
-                                          : ((var1 ? (~(-63)) : var5[-40]))
-                                              .isOdd)
-                                      ? ((0.8329420640871532 != var3) && var1)
-                                      : var1)
-                                  ? 43
-                                  : (Float32x4.zxxy - Float32x4.zxxw)))),
-                              Int32x4.zzwx
-                            ],
-                            ...[
-                              (var5[-48] * (fld3_2++)),
-                              Int32x4.wyyw,
-                              (~(-76)),
-                              ((par1).isEven ? (--par1) : -13),
-                              Float32x4.wxyx
-                            ],
-                            for (int loc1 in [
-                              (++fld3_2),
-                              -15,
-                              (SecurityContext.alpnSupported
-                                  ? Int32x4.yxyw
-                                  : Float32x4.yxxw),
-                              if (true) var5[(var1 ? -32768 : par1)],
-                              ((--var2) ^ (++fld3_2))
-                            ])
-                              (fld3_2--),
-                            93,
-                            (~((-(ZLibOption.minMemLevel)))),
-                            ((Float32x4.zyzx >> -14) & Float32x4.yxxw)
-                          ],
-                          (var1
-                              ? (++par1)
-                              : ((var3).isInfinite ? Float32x4.zwww : -84)),
-                          var2
-                        ] ==
-                        [
-                          9223372032559808639,
-                          -85,
-                          Float32x4.wzyy,
-                          loc0,
-                          [
-                            ((-(36)) <<
-                                ((var1
-                                        ? var1
-                                        : ({
-                                            45: 'ay',
-                                            7: par3,
-                                            69: Uri.decodeFull(
-                                                (foo1_3() + 'LX+'))
-                                          }).isEmpty)
-                                    ? (~((13 | 64)))
-                                    : (-(var2)))),
-                            (par1--),
-                            ((~((true ? (var2--) : -31))) >> 9),
-                            (-((35 % (~(var5[var5[39]]))))),
-                            4395630341,
-                            Int32x4.zxxy,
-                            if ((var1
-                                ? foo3_0(var3)
-                                : (0.6201792653929837).isInfinite)) ...[
-                              Int32x4.wxxx,
-                              (fld3_2 * (--fld3_2)),
-                              var5[((~(var5[var5[var5[(-(-23))]]])) +
-                                  (~(-4294966296)))],
-                              loc0,
-                              for (int loc1 in [var5[Float32x4.yzww]]) 17,
-                              (~(var5[(++par1)])),
-                              -58,
-                              ((!(('').isEmpty))
-                                  ? ((-(Float32x4.ywwx)) * (++par1))
-                                  : Int32x4.yxyz)
-                            ]
-                          ][((var1 ? var1 : var1) ? var5[0] : par1)],
-                          ((~(70)) +
-                              (par1 + (-77 | ZLibOption.MAX_WINDOW_BITS))),
-                          (-(Int32x4.zywy)),
-                          (~(Float32x4.zywz))
-                        ])
-                    : (var1 ? true : true)))
-                  fld3_2
-              ];
-            }
-          }
-          var3 *= ((var3 + 0.6761038672016147) ?? (-(double.minPositive)));
-        }
-        break;
-      case 3768780685:
-        {
-          {
-            int loc0 = 67;
-            while (--loc0 > 0) {
-              {
-                Map<int, String> loc1 = foo1(
-                    Uri.parseIPv4Address(('E Hu\u{1f600}' + '\u2665l&#!')),
-                    (!(false)));
-                var3 ??= var3;
-              }
-              var5 = (var5 +
-                  ((({
-                    79: (foo1_3() ?? 'eD'),
-                    73: (var1 ? par2 : ' xdXgW'),
-                    4: 'pUc(q',
-                    15: 'K\u{1f600}hmdZ\u2665',
-                    95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  }).isNotEmpty
-                          ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
-                              foo3_0(var3))
-                          : (!(((false || true) ? var1 : false))))
-                      ? [
-                          (~((-61 ??
-                              (~((-(var5[(var1 ? fld3_2 : var5[34])]))))))),
-                          (var5[13] ^ (var1 ? 35 : -76)),
-                          (-(((~(-47)) ~/ (--par1))))
-                        ]
-                      : foo2({
-                          -36,
-                          ((0.3910802543332075).isNegative
-                              ? (~((var2++)))
-                              : (var2 &
-                                  (var1
-                                      ? [
-                                          -67,
-                                          (fld3_2++),
-                                          if ((!((!((var1
-                                              ? true
-                                              : (!(false))))))))
-                                            (false
-                                                ? (~(Float32x4.wyyy))
-                                                : (var1
-                                                    ? (1 ^ (-(16)))
-                                                    : var5[94])),
-                                          fld3_2,
-                                          var2,
-                                          67
-                                        ][-12]
-                                      : Float32x4.wwxw))),
-                          26,
-                          [
-                            (var1
-                                ? (--fld3_2)
-                                : (((!(var1))
-                                        ? (~((foo3_0(0.9959805940480148)
-                                            ? (33 ~/ loc0)
-                                            : Float32x4.xywx)))
-                                        : (15 % var5[var5[-47]])) <<
-                                    -86)),
-                            (-((~(RawSocketOption.levelIPv6))))
-                          ][var5[var5[(ZLibOption.maxMemLevel ^ -3)]]],
-                          -29
-                        }, [
-                          (var1 ? Float32x4.wxxw : (--par1)),
-                          ...[
-                            52,
-                            (-((true ? -12 : 44))),
-                            var5[((var5[34] * 30) >> 4294967360)],
-                            ((--var2) <<
-                                (true
-                                    ? var5[(-4 ~/ Int32x4.yyww)]
-                                    : (bool.fromEnvironment(var7[fld3_2])
-                                        ? (~((false ? loc0 : var5[(++par1)])))
-                                        : ((!(false))
-                                            ? (var5[var5[loc0]] ^ Int32x4.wxzz)
-                                            : par1)))),
-                            (((false ? var0 : '') !=
-                                    (true
-                                        ? MapBase.mapToString(({
-                                              7: 'WTT7\u{1f600}e3',
-                                              22: '',
-                                              36: (var1
-                                                  ? 'F'
-                                                  : (var1 ? fld3_0[var2] : '')),
-                                              37: 'l@a',
-                                              85: (var1 ? '' : par3),
-                                              82: 'eb',
-                                              37: '11',
-                                              41: var7[94]
-                                            } ??
-                                            var7))
-                                        : (var1 ? var4 : par2)))
-                                ? (~(var5[-71]))
-                                : 9),
-                            32,
-                            if (bool.fromEnvironment(
-                                fld3_0[var5[ZLibOption.MIN_MEM_LEVEL]]))
-                              var5[(--par1)],
-                            (par1--)
-                          ],
-                          for (int loc1 in {
-                            for (int loc2 in [
-                              ((!((Map.unmodifiable({
-                                        86: var4,
-                                        31: var0,
-                                        85: (par3 + ''),
-                                        91: (var1
-                                            ? fld3_0[4]
-                                            : '!M\u{1f600}!vOw'),
-                                        45: '7T',
-                                        19: 'fha+',
-                                        38: (false ? '' : fld3_0[70])
-                                      }) !=
-                                      {
-                                        92: '@4',
-                                        41: var7[loc0],
-                                        24: (foo3_0(0.06591134699771606)
-                                            ? '\u2665)\u2665NnO+'
-                                            : 'JM3Hn\u{1f600}'),
-                                        26: 'aQ51Yz',
-                                        64: var7[
-                                            (-((var5[18] & (36).bitLength)))]
-                                      })))
-                                  ? (89 ^
-                                      (((44 - par1) * -9223372034707292160) &
-                                          var5[128]))
-                                  : -46),
-                              (fld3_2++),
-                              ((([
-                                            -89,
-                                            var2,
-                                            (fld3_2++),
-                                            var5[-4294967264],
-                                            -25,
-                                            var2,
-                                            var5[((!(var1))
-                                                ? (var1 ? -3 : -81)
-                                                : var5[loc0])],
-                                            (var1
-                                                ? par1
-                                                : ((~((fld3_2++))) >>
-                                                    (-((-(-64))))))
-                                          ] ??
-                                          foo2(var6, [
-                                            4295032831
-                                          ], {
-                                            53: foo1_3(),
-                                            94: var7[13],
-                                            82: var7[-60],
-                                            30: fld3_0[-9223372032559742976],
-                                            98: foo1_3()
-                                          })) !=
-                                      var5)
-                                  ? (--par1)
-                                  : loc0),
-                              56,
-                              if (((var5[21]).isOdd ? true : false))
-                                ((++par1) -
-                                    (var1 ? var5[DateTime.january] : (par1--)))
-                              else
-                                fld3_2,
-                              if ((!(var1))) 74,
-                              (par1 ^ var5[26])
-                            ])
-                              (~(var2)),
-                            for (int loc2 in {
-                              6442450944,
-                              Float32x4.ywyw,
-                              -9223372032559804416,
-                              (~(var5[var5[26]])),
-                              Float32x4.xyxy,
-                              (--fld3_2),
-                              var5[98]
-                            })
-                              if (false) -26,
-                            (~((-((-((-48 - -9223372036854775680))))))),
-                            ...{
-                              (-((var2--))),
-                              if (true) -100663046 else var5[(~(par1))]
-                            },
-                            (~((~((fld3_2++))))),
-                            ...{
-                              ((List.filled(0, 26) ==
-                                      [
-                                        (-(-52)),
-                                        -29,
-                                        (--fld3_2),
-                                        (0.22302566014161784).floor(),
-                                        (par1 % -56)
-                                      ])
-                                  ? (var1
-                                      ? (var2++)
-                                      : ((!((!(true))))
-                                          ? ((var1 || foo3_0(var3)) ? 76 : par1)
-                                          : (-(-13))))
-                                  : ((foo1_0((var1 ? fld3_0 : var7), var7,
-                                              var3))
-                                          .isEmpty
-                                      ? 97
-                                      : (var1 ? var2 : -9223372036854774784))),
-                              (-(Float32x4.zyzw)),
-                              (--var2)
-                            }
-                          })
-                            ((var3 < (-(var3))) ? -9223372032559808000 : -71),
-                          -100663046,
-                          if ((var1
-                              ? bool.fromEnvironment('vV0')
-                              : (Map.from({
-                                  78: '',
-                                  49: '\u{1f600}\u{1f600}4Mz',
-                                  70: fld3_0[par1],
-                                  95: '\u{1f600}2tIYqE',
-                                  43: (true ? 'baf-\u2665' : var4),
-                                  30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                })).isNotEmpty))
-                            -13
-                          else
-                            (var1 ? (-((-(var5[56])))) : (var2--)),
-                          (~((~((-((var2++)))))))
-                        ], {
-                          88: ('bV\u{1f600}iqO').toLowerCase(),
-                          42: '(hZ4S',
-                          37: var7[-79],
-                          36: var0
-                        })));
-            }
-          }
-          {
-            int loc0 = 0;
-            do {
-              try {
-                print(foo2(
-                    fld3_1,
-                    (fld3_0[var5[-12]]).codeUnits,
-                    (({
-                              36: var4,
-                              30: '0\u{1f600}EYWqr',
-                              66: 'S',
-                              3: '+J3Gj',
-                              71: '\u{1f600}-q',
-                              13: 'V3QN',
-                              34: ''
-                            } ??
-                            {
-                              54: fld3_0[(var2--)],
-                              74: (foo3_0(
-                                      ((-(var3)) * (0.8613045491468889 + var3)))
-                                  ? var7[78]
-                                  : (((var1 ? (47).isEven : var1) ? true : true)
-                                      ? (var4 ?? 'UzK')
-                                      : 'fH1smd')),
-                              12: '\u2665',
-                              18: 'V'
-                            }) ??
-                        var7)));
-              } catch (exception, stackTrace) {
-                fld3_1 = foo0();
-                for (int loc1 = 0; loc1 < 29; loc1++) {
-                  if (var1) {
-                    {
-                      int loc2 = 0;
-                      do {
-                        var5 = (foo3_0(var3)
-                            ? [
-                                ((--par1) ^ (~(93))),
-                                if ((var3).isFinite)
-                                  for (int loc3 in [
-                                    -5,
-                                    Int32x4.zxyy,
-                                    (true
-                                        ? var5[var5[(var1 ? -23 : var5[68])]]
-                                        : -99),
-                                    ((!(var1))
-                                        ? ((false
-                                                ? var1
-                                                : foo3_0(0.3133865362301862))
-                                            ? Float64List.bytesPerElement
-                                            : [
-                                                Float32x4.yxzx,
-                                                if (var1)
-                                                  (false ? 40 : 85)
-                                                else
-                                                  ((String.fromCharCode((foo3_0(
-                                                                  0.414460580942719)
-                                                              ? var5[-14]
-                                                              : var2)) ==
-                                                          'mII\u{1f600}zkM')
-                                                      ? var5[(~(-51))]
-                                                      : ((var1
-                                                              ? (!(var1))
-                                                              : var1)
-                                                          ? var5[0]
-                                                          : (-(var2))))
-                                              ][5])
-                                        : fld3_2),
-                                    (par1++),
-                                    -72,
-                                    Int32x4.zzxy
-                                  ])
-                                    Int32x4.zyww
-                                else
-                                  Int32x4.wxyz
-                              ]
-                            : [
-                                ...[
-                                  if ((false ? false : var1)) (-(52)),
-                                  (++par1),
-                                  (par1--),
-                                  (-((-([
-                                    (((var0 + fld3_0[(++var2)])).isNotEmpty
-                                        ? Float32x4.yzxw
-                                        : var5[35])
-                                  ][loc0])))),
-                                  (~(-17))
-                                ],
-                                38,
-                                ...[
-                                  (var1 ? (par1++) : -10),
-                                  if (true) -62 else var2,
-                                  if ((!((var3).isFinite)))
-                                    Int32x4.xxzz
-                                  else
-                                    -45
-                                ],
-                                if ((true || false)) (-(-93)),
-                                (--fld3_2),
-                                ([
-                                      (fld3_2--),
-                                      if ((base64UrlEncode(var5) == 'RY'))
-                                        (++fld3_2)
-                                      else
-                                        -9223372032559808383,
-                                      Float32x4.zyxy,
-                                      loc0,
-                                      -55,
-                                      if (('O \u{1f600}e\u2665').isNotEmpty)
-                                        if (var1)
-                                          (--var2)
-                                        else
-                                          for (int loc3 in {
-                                            loc0,
-                                            (~((--var2))),
-                                            (-(-35)),
-                                            Float32x4.xxyw,
-                                            65,
-                                            -4,
-                                            -4194304251,
-                                            -54
-                                          })
-                                            (((0.671280258888436 ==
-                                                        (0.16535430333243706 *
-                                                            0.18316039550464436)) ||
-                                                    var1)
-                                                ? var5[12]
-                                                : (~((--var2))))
-                                      else if (false)
-                                        if (var1) (-(Int32x4.zzwx)) else loc2
-                                      else
-                                        Int32x4.yzyw
-                                    ][loc1] *
-                                    (--par1)),
-                                (-71 * 38)
-                              ]);
-                      } while (++loc2 < 89);
-                    }
-                  } else {
-                    {
-                      int loc2 = 0;
-                      do {
-                        fld3_0 ??= ((((Map.unmodifiable(var7)).isEmpty ||
-                                    (!(({
-                                      11: 'v+MHeiB',
-                                      48: var7[(true
-                                          ? ((var2--) ?? fld3_2)
-                                          : var5[(fld3_2--)])],
-                                      52: '(('
-                                    }).isEmpty)))
-                                ? fld3_0
-                                : {
-                                    39: foo1_3(),
-                                    21: 'IXzJ+',
-                                    76: 'K2C#',
-                                    16: ('\u{1f600}Gh' + '#i'),
-                                    62: foo1_3(),
-                                    19: foo1_3(),
-                                    32: par3,
-                                    for (int loc3 in [
-                                      (par1--),
-                                      -66,
-                                      -96,
-                                      -35,
-                                      Float32x4.zzyz
-                                    ])
-                                      72: 'y vxi'
-                                  }) ??
-                            {13: par2});
-                        switch (4096) {
-                          case 3159134388:
-                            {
-                              /// Single-line documentation comment.
-                              {
-                                int loc3 = 0;
-                                do {
-                                  fld3_0 ??= foo1(
-                                      var5,
-                                      ((((true ? par2 : var7[var5[loc1]]))
-                                                  .isNotEmpty
-                                              ? 9
-                                              : -55) !=
-                                          var5[-36]));
-                                  fld3_1 = foo0();
-                                } while (++loc3 < 79);
-                              }
-                            }
-                            break;
-                          case 3159134393:
-                            {
-                              throw Int32x4.zxxw;
-                            }
-                            break;
-                        }
-                      } while (++loc2 < 77);
-                    }
-                  }
-                }
-              }
-            } while (++loc0 < 98);
-          }
-        }
-        break;
-    }
-    /*
-     * Multi-line
-     * comment.
-     */
-    return ((0.7728524536008519).isNaN ? 'BjzeSsJ' : foo1_3());
-  }
-
-  void run() {
-    super.run();
-    var5 ??= var5;
-    print({4294968296});
-  }
-}
-
-main() {
-  int count = 0;
-  try {
-    foo0();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo1(('  MQz').codeUnits, var1);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo2(
-        (var6).toSet(),
-        (var1
-            ? [-9223372036854775681, -66, 9223372032559874047, -3, 74]
-            : var5),
-        Map.identity());
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X0().foo0_0(var7);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_0(
-        (false
-            ? {
-                7: 'QMNg',
-                12: 'wzc5-Iq',
-                63: '29an-z',
-                86: 'sF5',
-                59: '\u2665L',
-                43: 'k',
-                62: 'NvF\u{1f600}k',
-                84: 'ZW 1-o'
-              }
-            : var7),
-        {
-          28: '@smXqKl',
-          66: 'oL',
-          if (false) 74: 'B' else 81: 'X',
-          if (false) 18: 'j' else 25: 'N',
-          44: '\u{1f600}lrx8m',
-          20: 'hC',
-          73: 'q',
-          63: '\u{1f600}nE'
-        },
-        0.18875619647922648);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_1((-((++var2))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_2((var1
-        ? (false
-            ? (true ? var7[((!(var1)) ? var5[Int32x4.xxyx] : 3)] : var4)
-            : Uri.encodeComponent(('yd' ?? (var0).padLeft(1, 'Q'))))
-        : var7[-2147483649]));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_3();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_0(Int32x4.xyyw);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_1((!(((!(var1)) && (!((var1 ? false : var1)))))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_2(var7, ((-(var5[(--var2)])) << 98));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_0(0.37767598562234317);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_1(
-        -6, var0, (Uri.decodeComponent('yQg') + ((var4 ?? var4) + var0)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo1_0(
-        Map.unmodifiable({77: 'hG'}),
-        ((false
-                ? {
-                    88: 'Sv-EbnG',
-                    73: 'G',
-                    46: 'O#',
-                    16: 'm1nf(',
-                    91: 'F',
-                    11: 'Q+O@K',
-                    70: '3q\u2665BJ'
-                  }
-                : Map.identity()) ??
-            {
-              68: 'r',
-              56: 'IH&',
-              31: '9cqu',
-              49: '8ug',
-              84: 'mR2VyC',
-              41: 'gk&(asy'
-            }),
-        (var3 * sin(var3)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().run();
-  } catch (e, st) {
-    count++;
-  } finally {}
-  Expect.equals(-47639, var2);
-  Expect.equals(9, count);
-}
diff --git a/tests/language/vm/regression_38741_test.dart b/tests/language/vm/regression_38741.dart
similarity index 96%
rename from tests/language/vm/regression_38741_test.dart
rename to tests/language/vm/regression_38741.dart
index 246a7b9..2dd1223 100644
--- a/tests/language/vm/regression_38741_test.dart
+++ b/tests/language/vm/regression_38741.dart
@@ -10,7 +10,7 @@
 import 'package:expect/expect.dart';
 
 @pragma('vm:prefer-inline')
-bool foo(dynamic x) => x < 10;
+bool foo(int x) => x < 10;
 
 @pragma('vm:never-inline')
 bool bar(bool f) => f && foo(1);
diff --git a/tests/language/why_not_promoted/nullable_operator_call_error_test.dart b/tests/language/why_not_promoted/nullable_operator_call_error.dart
similarity index 100%
rename from tests/language/why_not_promoted/nullable_operator_call_error_test.dart
rename to tests/language/why_not_promoted/nullable_operator_call_error.dart
diff --git a/tests/language_2/function_subtype/null_test.dart b/tests/language_2/function_subtype/null.dart
similarity index 100%
rename from tests/language_2/function_subtype/null_test.dart
rename to tests/language_2/function_subtype/null.dart
diff --git a/tests/language_2/identifier/known_prefix_error_test.dart b/tests/language_2/identifier/known_prefix_error_test.dart
index 2cc7982..73a5e97 100644
--- a/tests/language_2/identifier/known_prefix_error_test.dart
+++ b/tests/language_2/identifier/known_prefix_error_test.dart
@@ -17,10 +17,6 @@
 import 'built_in_prefix_library_async.dart' as async;
 import 'built_in_prefix_library_await.dart' as await;
 import 'built_in_prefix_library_hide.dart' as hide;
-import 'built_in_prefix_library_library.dart' as library;
-//                                               ^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
-// [cfe] Can't use 'library' as a name here.
 import 'built_in_prefix_library_of.dart' as of;
 import 'built_in_prefix_library_on.dart' as on;
 import 'built_in_prefix_library_show.dart' as show;
@@ -28,42 +24,42 @@
 import 'built_in_prefix_library_yield.dart' as yield;
 
 async<dynamic> _async = new async.A();
-// [error line 30, column 1, length 5]
+// [error line 26, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'async' isn't a type.
 // [cfe] Expected 0 type arguments.
 await<dynamic> _await = new await.A();
-// [error line 35, column 1, length 5]
+// [error line 31, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'await' isn't a type.
 // [cfe] Expected 0 type arguments.
 hide<dynamic> _hide = new hide.A();
-// [error line 40, column 1, length 4]
+// [error line 36, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'hide' isn't a type.
 // [cfe] Expected 0 type arguments.
 of<dynamic> _of = new of.A();
-// [error line 45, column 1, length 2]
+// [error line 41, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'of' isn't a type.
 // [cfe] Expected 0 type arguments.
 on<dynamic> _on = new on.A();
-// [error line 50, column 1, length 2]
+// [error line 46, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'on' isn't a type.
 // [cfe] Expected 0 type arguments.
 show<dynamic> _show = new show.A();
-// [error line 55, column 1, length 4]
+// [error line 51, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'show' isn't a type.
 // [cfe] Expected 0 type arguments.
 sync<dynamic> _sync = new sync.A();
-// [error line 60, column 1, length 4]
+// [error line 56, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'sync' isn't a type.
 // [cfe] Expected 0 type arguments.
 yield<dynamic> _yield = new yield.A();
-// [error line 65, column 1, length 5]
+// [error line 61, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'yield' isn't a type.
 // [cfe] Expected 0 type arguments.
diff --git a/tests/language_2/library/a.dart b/tests/language_2/library/a.dart
new file mode 100644
index 0000000..1b7fc61
--- /dev/null
+++ b/tests/language_2/library/a.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library libraryA.dart;
+
+import "c.dart";
+
+var fooA = fooC;
diff --git a/tests/language_2/library/b.dart b/tests/language_2/library/b.dart
new file mode 100644
index 0000000..dfc7b36
--- /dev/null
+++ b/tests/language_2/library/b.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library libraryB.dart;
+
+import "c.dart";
+
+var fooB = fooC;
diff --git a/tests/language_2/library/c.dart b/tests/language_2/library/c.dart
new file mode 100644
index 0000000..cc212ff
--- /dev/null
+++ b/tests/language_2/library/c.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library libraryC.dart;
+
+var fooC = 10;
diff --git a/tests/language_2/library/d.dart b/tests/language_2/library/d.dart
new file mode 100644
index 0000000..25ec2a9
--- /dev/null
+++ b/tests/language_2/library/d.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library libraryD.dart;
+
+import "f.dart";
+
+var fooD = fooC;
diff --git a/tests/language_2/library/e.dart b/tests/language_2/library/e.dart
new file mode 100644
index 0000000..c00631e
--- /dev/null
+++ b/tests/language_2/library/e.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library libraryE.dart;
+
+import "c.dart";
+import "f.dart";
+
+var fooE = 0;
diff --git a/tests/language_2/library/f.dart b/tests/language_2/library/f.dart
new file mode 100644
index 0000000..085bea4
--- /dev/null
+++ b/tests/language_2/library/f.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library libraryF.dart;
+
+var fooC = 10;
diff --git a/tests/language_2/library/library3.dart b/tests/language_2/library/library3.dart
new file mode 100644
index 0000000..96a979f
--- /dev/null
+++ b/tests/language_2/library/library3.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library library3.dart;
+
+import "../library2.dart"; // defines "foo" and "foo1".
diff --git a/tests/language_2/library/library4.dart b/tests/language_2/library/library4.dart
new file mode 100644
index 0000000..f4d701e
--- /dev/null
+++ b/tests/language_2/library/library4.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+// @dart = 2.9
+
+library library4.dart;
+
+import "../library2.dart"; // defines "foo" and "foo1".
+
+var foo;
+var foo1 = 0;
diff --git a/tests/language_2/library/library6_test.dart b/tests/language_2/library/library6.dart
similarity index 100%
rename from tests/language_2/library/library6_test.dart
rename to tests/language_2/library/library6.dart
diff --git a/tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart b/tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type.dart
similarity index 100%
rename from tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart
rename to tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type.dart
diff --git a/tests/language_2/prefix/new_test.dart b/tests/language_2/prefix/new_test.dart
index 8eac176..a056bdf 100644
--- a/tests/language_2/prefix/new_test.dart
+++ b/tests/language_2/prefix/new_test.dart
@@ -7,7 +7,7 @@
 library PrefixTest;
 
 import "package:expect/expect.dart";
-import "new_test1.dart";
+import "test1.dart";
 
 main() {
   Expect.equals(Prefix.getSource(), Prefix.getImport() + 1);
diff --git a/tests/language_2/prefix/new_test1.dart b/tests/language_2/prefix/new_test1.dart
index 05681ee..98c0e76 100644
--- a/tests/language_2/prefix/new_test1.dart
+++ b/tests/language_2/prefix/new_test1.dart
@@ -6,7 +6,7 @@
 
 library PrefixTest1;
 
-import "new_test2.dart" as test2;
+import "test2.dart" as test2;
 
 class Prefix {
   static const int foo = 43;
diff --git a/tests/language_2/regress/regress22976_test.dart b/tests/language_2/regress/regress22976_test.dart
index 4a954e6..dc9a53f 100644
--- a/tests/language_2/regress/regress22976_test.dart
+++ b/tests/language_2/regress/regress22976_test.dart
@@ -11,7 +11,7 @@
 class B<T> implements A<T> {}
 
 class C<S, T> implements B<S>, A<T> {}
-// [error line 13, column 1, length 38]
+// [error line 13, column 7, length 1]
 // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_GENERIC_INTERFACES
 //    ^
 // [cfe] 'C' can't implement both 'A<S>' and 'A<T>'
diff --git a/tests/language_2/regress/regress34091_test.dart b/tests/language_2/regress/regress34091.dart
similarity index 100%
rename from tests/language_2/regress/regress34091_test.dart
rename to tests/language_2/regress/regress34091.dart
diff --git a/tests/language_2/script/source.dart b/tests/language_2/script/source.dart
new file mode 100644
index 0000000..b9861c7
--- /dev/null
+++ b/tests/language_2/script/source.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+// A perfectly legal dart source file for use with script and library tests.
+
+const int script_source = 1;
diff --git a/tests/language_2/string/overflow_test.dart b/tests/language_2/string/overflow.dart
similarity index 84%
rename from tests/language_2/string/overflow_test.dart
rename to tests/language_2/string/overflow.dart
index ad4a332..ad58981 100644
--- a/tests/language_2/string/overflow_test.dart
+++ b/tests/language_2/string/overflow.dart
@@ -11,15 +11,13 @@
 
 main() {
   String a = "a";
+  for (; a.length < 256 * 1024 * 1024;) a = a + a;
 
   var exception_thrown = false;
   try {
-    while (true) {
-      a = "$a$a";
-    }
+    var concat = "$a$a$a$a$a$a$a$a";
   } on OutOfMemoryError catch (exc) {
     exception_thrown = true;
   }
   Expect.isTrue(exception_thrown);
-  Expect.isTrue(a.startsWith('aaaaa') && a.length > 1024);
 }
diff --git a/tests/language_2/top_level/file3.dart b/tests/language_2/top_level/file3.dart
new file mode 100644
index 0000000..d9ffab6
--- /dev/null
+++ b/tests/language_2/top_level/file3.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+main() {
+  Expect.equals(42, prefix.topLevelVar);
+}
diff --git a/tests/language_2/unsorted/unevaluated_field_test.dart b/tests/language_2/unsorted/unevaluated_field.dart
similarity index 100%
rename from tests/language_2/unsorted/unevaluated_field_test.dart
rename to tests/language_2/unsorted/unevaluated_field.dart
diff --git a/tests/language_2/vm/regression_38412_test.dart b/tests/language_2/vm/regression_38412.dart
similarity index 100%
rename from tests/language_2/vm/regression_38412_test.dart
rename to tests/language_2/vm/regression_38412.dart
diff --git a/tests/language_2/vm/regression_38436_test.dart b/tests/language_2/vm/regression_38436.dart
similarity index 98%
copy from tests/language_2/vm/regression_38436_test.dart
copy to tests/language_2/vm/regression_38436.dart
index bda53da..f350f6c 100644
--- a/tests/language_2/vm/regression_38436_test.dart
+++ b/tests/language_2/vm/regression_38436.dart
@@ -530,7 +530,8 @@
                                                 57: var4,
                                                 73: var7[-43],
                                                 38: var0
-                                              }).isNotEmpty ||
+                                              })
+                                                  .isNotEmpty ||
                                               ({
                                                 67: var4,
                                                 14: 'M\u{1f600}1HNbP',
@@ -538,7 +539,8 @@
                                                 85: 'uyq',
                                                 95: var7[(-(Int32x4.wwxw))],
                                                 33: ''
-                                              }).isNotEmpty))
+                                              })
+                                                  .isNotEmpty))
                                       : false)
                                   ? var2
                                   : (++var2))
@@ -557,7 +559,8 @@
                                   51: '-8ht',
                                   26: ('(2l3\u2665h' ?? var0),
                                   79: var4
-                                }).isNotEmpty
+                                })
+                                        .isNotEmpty
                                     ? var5[(var2 % loc0)]
                                     : var2) %
                                 ((!(NetworkInterface.listSupported))
@@ -1565,8 +1568,7 @@
 
 class X3 extends X1 {
   Map<int, String> fld3_0 = {
-    if (true)
-      if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
+    if (true) if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
     if (true) 30: '6\u2665P!Pbi',
     81: 't',
     82: '17fx#!',
@@ -1738,7 +1740,8 @@
                                             7: par3,
                                             69: Uri.decodeFull(
                                                 (foo1_3() + 'LX+'))
-                                          }).isEmpty)
+                                          })
+                                            .isEmpty)
                                     ? (~((13 | 64)))
                                     : (-(var2)))),
                             (par1--),
@@ -1793,7 +1796,8 @@
                     4: 'pUc(q',
                     15: 'K\u{1f600}hmdZ\u2665',
                     95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  }).isNotEmpty
+                  })
+                              .isNotEmpty
                           ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
                               foo3_0(var3))
                           : (!(((false || true) ? var1 : false))))
@@ -1991,7 +1995,8 @@
                                   95: '\u{1f600}2tIYqE',
                                   43: (true ? 'baf-\u2665' : var4),
                                   30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                })).isNotEmpty))
+                                }))
+                                  .isNotEmpty))
                             -13
                           else
                             (var1 ? (-((-(var5[56])))) : (var2--)),
@@ -2153,7 +2158,8 @@
                                           ? ((var2--) ?? fld3_2)
                                           : var5[(fld3_2--)])],
                                       52: '(('
-                                    }).isEmpty)))
+                                    })
+                                        .isEmpty)))
                                 ? fld3_0
                                 : {
                                     39: foo1_3(),
diff --git a/tests/language_2/vm/regression_38741_test.dart b/tests/language_2/vm/regression_38741.dart
similarity index 100%
rename from tests/language_2/vm/regression_38741_test.dart
rename to tests/language_2/vm/regression_38741.dart
diff --git a/tools/VERSION b/tools/VERSION
index 83dfa8e..b2d68f0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 125
+PRERELEASE 126
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index bc961e1..83064f4 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -3105,6 +3105,14 @@
           ]
         },
         {
+          "name": "analyze runtime/tests/concurrency/run_stress_test_shards.dart",
+          "script": "out/ReleaseX64/dart-sdk/bin/dart",
+          "arguments": [
+            "analyze",
+            "runtime/tests/concurrency/run_stress_test_shards.dart"
+          ]
+        },
+        {
           "name": "analyze pkg/analysis_server",
           "script": "out/ReleaseX64/dart-sdk/bin/dart",
           "arguments": [
diff --git a/tools/package_deps/bin/package_deps.dart b/tools/package_deps/bin/package_deps.dart
index ad73069..eab4201 100644
--- a/tools/package_deps/bin/package_deps.dart
+++ b/tools/package_deps/bin/package_deps.dart
@@ -247,9 +247,9 @@
 
     var extraDevDeclarations = Set<String>.from(_declaredDevDependencies)
       ..removeAll(devdeps);
-    // Remove package:pedantic as it is often declared as a dev dependency in
-    // order to bring in its analysis_options.yaml file.
-    extraDevDeclarations.remove('pedantic');
+    // Remove package:pedantic and package:lints as they are often declared as
+    // dev dependencies in order to bring in their analysis_options.yaml files.
+    extraDevDeclarations.removeAll(['lints', 'pedantic']);
     if (extraDevDeclarations.isNotEmpty) {
       out('  ${_printSet(extraDevDeclarations)} declared in '
           "'dev_dependencies:' but not used in dev dirs.");
