diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9a9d3ac..9b818c8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,12 @@
     daylight saving changes that are not precisely one hour.
     (No change on the Web which uses the JavaScript `Date` object.)
 
+#### `dart:io`
+
+*   BREAKING CHANGE (for pre-migrated null safe code):
+    `HttpClient`'s `.authenticate`  and `.authenticateProxy` setter callbacks
+    must now accept a nullable `realm` argument.
+
 #### `dart:typed_data`
 
 *   **BREAKING CHANGE** (https://github.com/dart-lang/sdk/issues/45115)
diff --git a/DEPS b/DEPS
index 4c1a614..cfd9878 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "055b5c984613ec1b8ef76516db3ea99fee63acb9",
+  "co19_rev": "26019f5b2efb294eacddfef6ce443083979feff5",
   "co19_2_rev": "1c2e425f461bfae7de6db7014fc44a58fc72b4a8",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
diff --git a/build/toolchain/win/tool_wrapper.py b/build/toolchain/win/tool_wrapper.py
index b094b2bf..652a879 100644
--- a/build/toolchain/win/tool_wrapper.py
+++ b/build/toolchain/win/tool_wrapper.py
@@ -225,7 +225,7 @@
         env = self._GetEnv(arch)
         # TODO(scottmg): This is a temporary hack to get some specific variables
         # through to actions that are set after GN-time. http://crbug.com/333738.
-        for k, v in os.environ.iteritems():
+        for k, v in os.environ.items():
             if k not in env:
                 env[k] = v
         args = open(rspfile).read()
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 1cba6ec..e748921 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -10,7 +10,7 @@
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart'
     show SemanticTokenTypes, SemanticTokenModifiers;
 import 'package:analysis_server/src/lsp/constants.dart'
-    show CustomSemanticTokenModifiers;
+    show CustomSemanticTokenModifiers, CustomSemanticTokenTypes;
 import 'package:analysis_server/src/lsp/semantic_tokens/encoder.dart'
     show SemanticTokenInfo;
 import 'package:analysis_server/src/lsp/semantic_tokens/mapping.dart'
@@ -819,6 +819,31 @@
   }
 
   @override
+  void visitInterpolationExpression(InterpolationExpression node) {
+    if (computer._computeSemanticTokens) {
+      // Interpolation expressions may include uncolored code, but clients may
+      // be providing their own basic coloring for strings that would leak
+      // into those uncolored parts so we mark them up to allow the client to
+      // reset the coloring if required.
+      //
+      // Using the String token type with a modifier would work for VS Code but
+      // would cause other editors that don't know about the modifier (and also
+      // do not have their own local coloring) to color the tokens as a string,
+      // which is exactly what we'd like to avoid).
+
+      computer._addRegion_node(
+        node,
+        // The HighlightRegionType here is not used because of the
+        // computer._computeSemanticTokens check above.
+        HighlightRegionType.LITERAL_STRING,
+        semanticTokenType: CustomSemanticTokenTypes.source,
+        semanticTokenModifiers: {CustomSemanticTokenModifiers.interpolation},
+      );
+    }
+    super.visitInterpolationExpression(node);
+  }
+
+  @override
   void visitInterpolationString(InterpolationString node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_STRING);
     super.visitInterpolationString(node);
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index 02479bd..d13b6a8 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -91,7 +91,7 @@
 
 abstract class CustomSemanticTokenModifiers {
   /// A modifier applied to control keywords like if/for/etc. so they can be
-  /// coloured differently to other keywords (void, import, etc), matching the
+  /// colored differently to other keywords (void, import, etc), matching the
   /// original Dart textmate grammar.
   /// https://github.com/dart-lang/dart-syntax-highlight/blob/84a8e84f79bc917ebd959a4587349c865dc945e0/grammars/dart.json#L244-L261
   static const control = SemanticTokenModifiers('control');
@@ -104,26 +104,52 @@
   /// - parameter
   static const label = SemanticTokenModifiers('label');
 
-  /// A modifier applied to constructors to allow colouring them differently
+  /// A modifier applied to constructors to allow coloring them differently
   /// to class names that are not constructors.
   static const constructor = SemanticTokenModifiers('constructor');
 
-  /// A modifier applied to escape characters within a string to allow colouring
+  /// A modifier applied to escape characters within a string to allow coloring
   /// them differently.
   static const escape = SemanticTokenModifiers('escape');
 
-  /// All custom semantic token modifiers, used to populate the LSP Legend which must
-  /// include all used modifiers.
-  static const values = [control, label, constructor];
+  /// A modifier applied to an interpolation expression in a string to allow
+  /// coloring it differently to the literal parts of the string.
+  ///
+  /// Many tokens within interpolation expressions will get their own semantic
+  /// tokens so this is mainly to account for the the surrounding `${}` and
+  /// tokens like parens and operators that may not get their own.
+  ///
+  /// This is useful for editors that supply their own basic coloring initially
+  /// (for faster coloring) and then layer semantic tokens over the top. Without
+  /// some marker for interpolation expressions, all otherwise-uncolored parts
+  /// of the expression would show through the simple-colorings "string" colors.
+  static const interpolation = SemanticTokenModifiers('interpolation');
+
+  /// All custom semantic token modifiers, used to populate the LSP Legend.
+  ///
+  /// The legend must include all used modifiers. Modifiers used in the
+  /// HighlightRegion mappings will be automatically included, but should still
+  /// be listed here in case they are removed from mappings in the future.
+  static const values = [control, label, constructor, escape, interpolation];
 }
 
 abstract class CustomSemanticTokenTypes {
   static const annotation = SemanticTokenTypes('annotation');
   static const boolean = SemanticTokenTypes('boolean');
 
+  /// A placeholder token type for basic source code that is not usually colored.
+  ///
+  /// This is used only where clients might otherwise provide their own coloring
+  /// (for example coloring whole strings that may include interpolated code).
+  ///
+  /// Tokens using this type should generally also provide a custom
+  /// [CustomSemanticTokenModifiers] to give the client more information about
+  /// the reason for this token and allow specific coloring if desired.
+  static const source = SemanticTokenTypes('source');
+
   /// All custom semantic token types, used to populate the LSP Legend which must
   /// include all used types.
-  static const values = [annotation, boolean];
+  static const values = [annotation, boolean, source];
 }
 
 /// CodeActionKinds supported by the server that are not declared in the LSP spec.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
index 407685f..c88cbcf 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
@@ -57,7 +57,9 @@
     }
 
     var widgetName = widgetClassElement.displayName;
-    var stateName = '_${widgetName}State';
+    var stateName = widgetClassElement.isPrivate
+        ? '${widgetName}State'
+        : '_${widgetName}State';
 
     // Find fields assigned in constructors.
     var visitor = _FieldFinder();
diff --git a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
index 107872f..a966f00 100644
--- a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
+++ b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
@@ -465,7 +465,7 @@
 
   Future<void> test_keywords() async {
     // "control" keywords should be tagged with a modifier so the client
-    // can colour them differently to other keywords.
+    // can color them differently to other keywords.
     final content = r'''
     void main() async {
       var a = new Object();
@@ -804,7 +804,7 @@
     final content = '''
 String foo(String c) => c;
 const string1 = 'test';
-const string2 = 'test1 \$string1 test2 \${foo('test3')}';
+const string2 = 'test1 \$string1 test2 \${foo('a' + 'b')}';
 const string3 = r'\$string1 \${string1.length}';
 const string4 = \'\'\'
 multi
@@ -821,25 +821,40 @@
       _Token('c', SemanticTokenTypes.parameter,
           [SemanticTokenModifiers.declaration]),
       _Token('c', SemanticTokenTypes.parameter),
+
       _Token('const', SemanticTokenTypes.keyword),
       _Token('string1', SemanticTokenTypes.variable,
           [SemanticTokenModifiers.declaration]),
       _Token("'test'", SemanticTokenTypes.string),
+
       _Token('const', SemanticTokenTypes.keyword),
       _Token('string2', SemanticTokenTypes.variable,
           [SemanticTokenModifiers.declaration]),
       _Token(r"'test1 ", SemanticTokenTypes.string),
+      _Token(r'$', CustomSemanticTokenTypes.source,
+          [CustomSemanticTokenModifiers.interpolation]),
       _Token('string1', SemanticTokenTypes.property),
       _Token(' test2 ', SemanticTokenTypes.string),
+      _Token(r'${', CustomSemanticTokenTypes.source,
+          [CustomSemanticTokenModifiers.interpolation]),
       _Token('foo', SemanticTokenTypes.function),
-      _Token("'test3'", SemanticTokenTypes.string),
+      _Token('(', CustomSemanticTokenTypes.source,
+          [CustomSemanticTokenModifiers.interpolation]),
+      _Token("'a'", SemanticTokenTypes.string),
+      _Token(' + ', CustomSemanticTokenTypes.source,
+          [CustomSemanticTokenModifiers.interpolation]),
+      _Token("'b'", SemanticTokenTypes.string),
+      _Token(')}', CustomSemanticTokenTypes.source,
+          [CustomSemanticTokenModifiers.interpolation]),
       _Token("'", SemanticTokenTypes.string),
-      _Token('const', SemanticTokenTypes.keyword),
+
       // string3 is raw and should be treated as a single string.
+      _Token('const', SemanticTokenTypes.keyword),
       _Token('string3', SemanticTokenTypes.variable,
           [SemanticTokenModifiers.declaration]),
       _Token(r"r'$string1 ${string1.length}'", SemanticTokenTypes.string),
       _Token('const', SemanticTokenTypes.keyword),
+
       _Token('string4', SemanticTokenTypes.variable,
           [SemanticTokenModifiers.declaration]),
       _Token("'''\n", SemanticTokenTypes.string),
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
index 85126d4..036db53 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
@@ -310,6 +310,34 @@
 ''');
   }
 
+  Future<void> test_noExtraUnderscore() async {
+    await resolveTestCode(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/_MyWidget extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return Container();
+  }
+}
+''');
+    await assertHasAssist(r'''
+import 'package:flutter/material.dart';
+
+class _MyWidget extends StatefulWidget {
+  @override
+  State<_MyWidget> createState() => _MyWidgetState();
+}
+
+class _MyWidgetState extends State<_MyWidget> {
+  @override
+  Widget build(BuildContext context) {
+    return Container();
+  }
+}
+''');
+  }
+
   Future<void> test_notClass() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index daea242..b286788 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 138;
+  static const int DATA_VERSION = 139;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 2d9f7ff..5db427d 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1865,10 +1865,6 @@
   /// [nameOffset].
   DefaultFieldFormalParameterElementImpl(String name, int nameOffset)
       : super(name, nameOffset);
-
-  DefaultFieldFormalParameterElementImpl.forLinkedNode(ElementImpl enclosing,
-      Reference? reference, FormalParameterImpl linkedNode)
-      : super.forLinkedNode(enclosing, reference, linkedNode);
 }
 
 /// A [ParameterElement] for parameters that have an initializer.
@@ -1879,10 +1875,6 @@
   DefaultParameterElementImpl(String? name, int nameOffset)
       : super(name, nameOffset);
 
-  DefaultParameterElementImpl.forLinkedNode(ElementImpl enclosing,
-      Reference? reference, FormalParameterImpl linkedNode)
-      : super.forLinkedNode(enclosing, reference, linkedNode);
-
   @override
   String? get defaultValueCode {
     var ast = constantInitializer;
@@ -3050,7 +3042,7 @@
     implements ExecutableElement, ElementImplWithFunctionType {
   /// A list containing all of the parameters defined by this executable
   /// element.
-  List<ParameterElement> _parameters = _Sentinel.parameterElement;
+  List<ParameterElement> _parameters = const [];
 
   /// The inferred return type of this executable element.
   DartType? _returnType;
@@ -3535,45 +3527,14 @@
 /// [FieldElement] associated with the parameter.
 class FieldFormalParameterElementImpl extends ParameterElementImpl
     implements FieldFormalParameterElement {
-  /// The field associated with this field formal parameter.
-  FieldElement? _field;
+  @override
+  FieldElement? field;
 
   /// Initialize a newly created parameter element to have the given [name] and
   /// [nameOffset].
   FieldFormalParameterElementImpl(String name, int nameOffset)
       : super(name, nameOffset);
 
-  FieldFormalParameterElementImpl.forLinkedNode(ElementImpl enclosing,
-      Reference? reference, FormalParameterImpl linkedNode)
-      : super.forLinkedNode(enclosing, reference, linkedNode);
-
-  @override
-  FieldElement? get field {
-    if (_field == null) {
-      String? fieldName;
-      if (linkedNode != null) {
-        fieldName = linkedContext!.getFieldFormalParameterName(linkedNode!);
-      }
-      if (fieldName != null) {
-        Element enclosingConstructor = enclosingElement!;
-        if (enclosingConstructor is ConstructorElement) {
-          Element enclosingClass = enclosingConstructor.enclosingElement;
-          if (enclosingClass is ClassElement) {
-            var field = enclosingClass.getField(fieldName);
-            if (field != null && !field.isSynthetic) {
-              _field = field;
-            }
-          }
-        }
-      }
-    }
-    return _field;
-  }
-
-  set field(FieldElement? field) {
-    _field = field;
-  }
-
   /// Initializing formals are visible only in the "formal parameter
   /// initializer scope", which is the current scope of the initializer list
   /// of the constructor, and which is enclosed in the scope where the
@@ -5070,12 +5031,12 @@
   /// A list containing all of the parameters defined by this parameter element.
   /// There will only be parameters if this parameter is a function typed
   /// parameter.
-  List<ParameterElement> _parameters = _Sentinel.parameterElement;
+  List<ParameterElement> _parameters = const [];
 
   /// A list containing all of the type parameters defined for this parameter
   /// element. There will only be parameters if this parameter is a function
   /// typed parameter.
-  List<TypeParameterElement> _typeParameters = _Sentinel.typeParameterElement;
+  List<TypeParameterElement> _typeParameters = const [];
 
   /// The kind of this parameter.
   ParameterKind? _parameterKind;
@@ -5092,29 +5053,6 @@
   /// [nameOffset].
   ParameterElementImpl(String? name, int nameOffset) : super(name, nameOffset);
 
-  ParameterElementImpl.forLinkedNode(ElementImpl enclosing,
-      Reference? reference, FormalParameterImpl linkedNode)
-      : super.forLinkedNode(enclosing, reference, linkedNode) {
-    assert(linkedNode.isNamed || reference == null);
-    FormalParameterImpl.setDeclaredElement(linkedNode, this);
-  }
-
-  factory ParameterElementImpl.forLinkedNodeFactory(
-      ElementImpl enclosing, Reference? reference, FormalParameterImpl node) {
-    if (node is FieldFormalParameter) {
-      return FieldFormalParameterElementImpl.forLinkedNode(
-        enclosing,
-        reference,
-        node,
-      );
-    } else if (node is FunctionTypedFormalParameter ||
-        node is SimpleFormalParameter) {
-      return ParameterElementImpl.forLinkedNode(enclosing, reference, node);
-    } else {
-      throw UnimplementedError('${node.runtimeType}');
-    }
-  }
-
   /// Creates a synthetic parameter with [name], [type] and [kind].
   factory ParameterElementImpl.synthetic(
       String? name, DartType type, ParameterKind kind) {
@@ -5130,11 +5068,6 @@
 
   @override
   String? get defaultValueCode {
-    final linkedNode = this.linkedNode;
-    if (linkedNode is DefaultFormalParameter) {
-      return linkedNode.defaultValue?.toSource();
-    }
-
     return _defaultValueCode;
   }
 
@@ -5151,14 +5084,6 @@
   }
 
   @override
-  bool get hasImplicitType {
-    if (linkedNode != null) {
-      return linkedContext!.hasImplicitType(linkedNode!);
-    }
-    return super.hasImplicitType;
-  }
-
-  @override
   bool get isCovariant {
     if (isExplicitlyCovariant || inheritsCovariant) {
       return true;
@@ -5168,9 +5093,6 @@
 
   /// Return true if this parameter is explicitly marked as being covariant.
   bool get isExplicitlyCovariant {
-    if (linkedNode != null) {
-      return linkedContext!.isExplicitlyCovariant(linkedNode!);
-    }
     return hasModifier(Modifier.COVARIANT);
   }
 
@@ -5181,15 +5103,6 @@
   }
 
   @override
-  bool get isFinal {
-    if (linkedNode != null) {
-      final linkedNode = this.linkedNode as FormalParameter;
-      return linkedNode.isFinal;
-    }
-    return super.isFinal;
-  }
-
-  @override
   bool get isInitializingFormal => false;
 
   @override
@@ -5199,32 +5112,9 @@
   ElementKind get kind => ElementKind.PARAMETER;
 
   @override
-  String get name {
-    if (linkedNode != null) {
-      return linkedContext!
-          .getFormalParameterName(linkedNode as FormalParameter);
-    }
-    return super.name;
-  }
-
-  @override
-  int get nameOffset {
-    if (linkedNode != null) {
-      return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
-    }
-
-    return super.nameOffset;
-  }
-
-  @override
   ParameterKind get parameterKind {
     if (_parameterKind != null) return _parameterKind!;
 
-    if (linkedNode != null) {
-      final linkedNode = this.linkedNode as FormalParameterImpl;
-      return linkedNode.kind;
-    }
-
     // TODO(migration): Make it impossible by construction.
     throw StateError('The kind must set.');
   }
@@ -5235,25 +5125,6 @@
 
   @override
   List<ParameterElement> get parameters {
-    if (!identical(_parameters, _Sentinel.parameterElement)) {
-      return _parameters;
-    }
-
-    if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext!;
-      var formalParameters = context.getFormalParameters(linkedNode!);
-      if (formalParameters != null) {
-        return _parameters = ParameterElementImpl.forLinkedNodeList(
-          this,
-          context,
-          null,
-          formalParameters,
-        );
-      } else {
-        return _parameters;
-      }
-    }
-
     return _parameters;
   }
 
@@ -5268,24 +5139,6 @@
 
   @override
   List<TypeParameterElement> get typeParameters {
-    if (!identical(_typeParameters, _Sentinel.typeParameterElement)) {
-      return _typeParameters;
-    }
-
-    if (linkedNode != null) {
-      var typeParameters = linkedContext!.getTypeParameters2(linkedNode!);
-      if (typeParameters == null) {
-        return _typeParameters = const [];
-      }
-      return _typeParameters = typeParameters.typeParameters
-          .cast<TypeParameterImpl>()
-          .map<TypeParameterElement>((node) {
-        var element = node.declaredElement;
-        element ??= TypeParameterElementImpl.forLinkedNode(this, node);
-        return element;
-      }).toList();
-    }
-
     return _typeParameters;
   }
 
@@ -5312,52 +5165,6 @@
     super.visitChildren(visitor);
     safelyVisitChildren(parameters, visitor);
   }
-
-  /// TODO(scheglov) Do we need this method at all?
-  /// We should create all parameter elements during applying resolution.
-  /// Or when we build elements before linking.
-  static List<ParameterElement> forLinkedNodeList(
-      ElementImpl enclosing,
-      LinkedUnitContext context,
-      Reference? containerRef,
-      List<FormalParameter>? formalParameters) {
-    if (formalParameters == null) {
-      return const [];
-    }
-
-    return formalParameters.map((node) {
-      var element = node.declaredElement;
-      if (element != null) {
-        return element;
-      }
-
-      if (node is DefaultFormalParameterImpl) {
-        NormalFormalParameter parameterNode = node.parameter;
-        Reference? reference;
-        if (node.isNamed) {
-          var name = parameterNode.identifier?.name ?? '';
-          reference = containerRef?.getChild(name);
-          reference?.node = node;
-        }
-        if (parameterNode is FieldFormalParameter) {
-          return DefaultFieldFormalParameterElementImpl.forLinkedNode(
-            enclosing,
-            reference,
-            node,
-          );
-        } else {
-          return DefaultParameterElementImpl.forLinkedNode(
-            enclosing,
-            reference,
-            node,
-          );
-        }
-      } else {
-        return ParameterElementImpl.forLinkedNodeFactory(
-            enclosing, null, node as FormalParameterImpl);
-      }
-    }).toList();
-  }
 }
 
 /// The parameter of an implicit setter.
@@ -5709,7 +5516,7 @@
 
   @override
   List<ParameterElement> get parametersInternal {
-    if (!identical(_parameters, _Sentinel.parameterElement)) {
+    if (_parameters.isNotEmpty) {
       return _parameters;
     }
 
@@ -6374,16 +6181,7 @@
 
   /// Initialize a newly created variable element to have the given [name] and
   /// [offset].
-  VariableElementImpl(String? name, int offset, {Reference? reference})
-      : super(name, offset, reference: reference);
-
-  VariableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference? reference, AstNode linkedNode)
-      : super.forLinkedNode(enclosing, reference, linkedNode);
-
-  /// Initialize using the given serialized information.
-  VariableElementImpl.forSerialized(ElementImpl enclosingElement)
-      : super.forSerialized(enclosingElement);
+  VariableElementImpl(String? name, int offset) : super(name, offset);
 
   /// If this element represents a constant variable, and it has an initializer,
   /// a copy of the initializer for the constant.  Otherwise `null`.
@@ -6535,7 +6333,6 @@
   static final List<ImportElement> importElement = List.unmodifiable([]);
   static final List<InterfaceType> interfaceType = List.unmodifiable([]);
   static final List<MethodElement> methodElement = List.unmodifiable([]);
-  static final List<ParameterElement> parameterElement = List.unmodifiable([]);
   static final List<PropertyAccessorElement> propertyAccessorElement =
       List.unmodifiable([]);
   static final List<TypeAliasElement> typeAliasElement = List.unmodifiable([]);
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 9304693..b03f8b8 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -1584,6 +1584,8 @@
     } else if (target is FunctionTypeAlias || target is GenericTypeAlias) {
       return kinds.contains(TargetKind.typedefType) ||
           kinds.contains(TargetKind.type);
+    } else if (target is TopLevelVariableDeclaration) {
+      return kinds.contains(TargetKind.topLevelVariable);
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 422e337..ca2d949 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1535,6 +1535,7 @@
     return List.generate(formalParameterCount, (_) {
       var kindIndex = _reader.readByte();
       var kind = _formalParameterKind(kindIndex);
+      var hasImplicitType = _reader.readBool();
       var isInitializingFormal = _reader.readBool();
       var typeParameters = _readTypeParameters(unitElement);
       var type = readRequiredType();
@@ -1550,6 +1551,7 @@
             ..parameterKind = kind
             ..type = type;
         }
+        element.hasImplicitType = hasImplicitType;
         element.typeParameters = typeParameters;
         element.parameters = _readFormalParameters(unitElement);
         // TODO(scheglov) reuse for formal parameters
@@ -1562,6 +1564,7 @@
         var element = DefaultParameterElementImpl(name, -1)
           ..parameterKind = kind
           ..type = type;
+        element.hasImplicitType = hasImplicitType;
         element.typeParameters = typeParameters;
         element.parameters = _readFormalParameters(unitElement);
         // TODO(scheglov) reuse for formal parameters
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 9dc8c56..e6ca6ed 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -657,6 +657,7 @@
     writeUInt30(parameters.length);
     for (var parameter in parameters) {
       _writeFormalParameterKind(parameter);
+      writeBool(parameter.hasImplicitType);
       writeBool(parameter.isInitializingFormal);
       _writeTypeParameters(parameter.typeParameters, () {
         writeType(parameter.type);
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
index 1ca267c..2bf9161 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
@@ -606,6 +606,40 @@
 ''');
   }
 
+  void test_topLevelVariable_field() async {
+    writeTestPackageConfigWithMeta();
+    await assertErrorsInCode('''
+import 'package:meta/meta_meta.dart';
+
+@Target({TargetKind.topLevelVariable})
+class A {
+  const A();
+}
+
+class B {
+  @A()
+  int f = 0;
+}
+''', [
+      error(HintCode.INVALID_ANNOTATION_TARGET, 117, 1),
+    ]);
+  }
+
+  void test_topLevelVariable_topLevelVariable() async {
+    writeTestPackageConfigWithMeta();
+    await assertNoErrorsInCode('''
+import 'package:meta/meta_meta.dart';
+
+@Target({TargetKind.topLevelVariable})
+class A {
+  const A();
+}
+
+@A()
+int f = 0;
+''');
+  }
+
   void test_type_class() async {
     writeTestPackageConfigWithMeta();
     await assertNoErrorsInCode('''
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index ef090f9..925dec6 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -14560,6 +14560,19 @@
 ''');
   }
 
+  test_typedef_parameter_hasImplicitType() async {
+    var library = await checkLibrary(r'''
+typedef void F(int a, b, [int c, d]);
+''');
+    var F = library.definingCompilationUnit.typeAliases.single;
+    var function = F.aliasedElement as GenericFunctionTypeElement;
+    // TODO(scheglov) Use better textual presentation with all information.
+    expect(function.parameters[0].hasImplicitType, false);
+    expect(function.parameters[1].hasImplicitType, true);
+    expect(function.parameters[2].hasImplicitType, false);
+    expect(function.parameters[3].hasImplicitType, true);
+  }
+
   test_typedef_parameter_parameters() async {
     var library = await checkLibrary('typedef F(g(x, y));');
     checkElementText(library, r'''
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
index fe06b76..1424749 100644
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
+++ b/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.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
-
 import 'package:_fe_analyzer_shared/src/parser/assert.dart';
 import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
 import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
@@ -29,8 +27,8 @@
 abstract class DirectParserASTContent {
   final String what;
   final DirectParserASTType type;
-  Map<String, Object> get deprecatedArguments;
-  List<DirectParserASTContent> children;
+  Map<String, Object?> get deprecatedArguments;
+  List<DirectParserASTContent>? children;
 
   DirectParserASTContent(this.what, this.type);
 
@@ -58,7 +56,7 @@
     seen(data);
   }
 
-  void handleAsyncModifier(Token asyncToken, Token starToken) {
+  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
     DirectParserASTContentAsyncModifierHandle data =
         new DirectParserASTContentAsyncModifierHandle(
             DirectParserASTType.HANDLE,
@@ -174,7 +172,7 @@
     seen(data);
   }
 
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
     DirectParserASTContentClassDeclarationBegin data =
         new DirectParserASTContentClassDeclarationBegin(
             DirectParserASTType.BEGIN,
@@ -184,7 +182,7 @@
     seen(data);
   }
 
-  void handleClassExtends(Token extendsKeyword, int typeCount) {
+  void handleClassExtends(Token? extendsKeyword, int typeCount) {
     DirectParserASTContentClassExtendsHandle data =
         new DirectParserASTContentClassExtendsHandle(DirectParserASTType.HANDLE,
             extendsKeyword: extendsKeyword, typeCount: typeCount);
@@ -192,7 +190,7 @@
   }
 
   void handleClassOrMixinImplements(
-      Token implementsKeyword, int interfacesCount) {
+      Token? implementsKeyword, int interfacesCount) {
     DirectParserASTContentClassOrMixinImplementsHandle data =
         new DirectParserASTContentClassOrMixinImplementsHandle(
             DirectParserASTType.HANDLE,
@@ -201,7 +199,7 @@
     seen(data);
   }
 
-  void handleClassHeader(Token begin, Token classKeyword, Token nativeToken) {
+  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     DirectParserASTContentClassHeaderHandle data =
         new DirectParserASTContentClassHeaderHandle(DirectParserASTType.HANDLE,
             begin: begin, classKeyword: classKeyword, nativeToken: nativeToken);
@@ -231,7 +229,7 @@
     seen(data);
   }
 
-  void handleMixinOn(Token onKeyword, int typeCount) {
+  void handleMixinOn(Token? onKeyword, int typeCount) {
     DirectParserASTContentMixinOnHandle data =
         new DirectParserASTContentMixinOnHandle(DirectParserASTType.HANDLE,
             onKeyword: onKeyword, typeCount: typeCount);
@@ -275,7 +273,7 @@
     seen(data);
   }
 
-  void beginExtensionDeclaration(Token extensionKeyword, Token name) {
+  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
     DirectParserASTContentExtensionDeclarationBegin data =
         new DirectParserASTContentExtensionDeclarationBegin(
             DirectParserASTType.BEGIN,
@@ -354,7 +352,7 @@
   }
 
   void endConstructorReference(
-      Token start, Token periodBeforeName, Token endToken) {
+      Token start, Token? periodBeforeName, Token endToken) {
     DirectParserASTContentConstructorReferenceEnd data =
         new DirectParserASTContentConstructorReferenceEnd(
             DirectParserASTType.END,
@@ -462,7 +460,7 @@
   }
 
   void beginFactoryMethod(
-      Token lastConsumed, Token externalToken, Token constToken) {
+      Token lastConsumed, Token? externalToken, Token? constToken) {
     DirectParserASTContentFactoryMethodBegin data =
         new DirectParserASTContentFactoryMethodBegin(DirectParserASTType.BEGIN,
             lastConsumed: lastConsumed,
@@ -502,8 +500,8 @@
     seen(data);
   }
 
-  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
-      Token covariantToken, Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
     DirectParserASTContentFormalParameterBegin data =
         new DirectParserASTContentFormalParameterBegin(
             DirectParserASTType.BEGIN,
@@ -516,11 +514,11 @@
   }
 
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? periodAfterThis,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     DirectParserASTContentFormalParameterEnd data =
@@ -565,12 +563,12 @@
   }
 
   void endClassFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -589,12 +587,12 @@
   }
 
   void endMixinFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -613,12 +611,12 @@
   }
 
   void endExtensionFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -702,7 +700,7 @@
     seen(data);
   }
 
-  void handleForInLoopParts(Token awaitToken, Token forToken,
+  void handleForInLoopParts(Token? awaitToken, Token forToken,
       Token leftParenthesis, Token inKeyword) {
     DirectParserASTContentForInLoopPartsHandle data =
         new DirectParserASTContentForInLoopPartsHandle(
@@ -837,7 +835,7 @@
   }
 
   void endFunctionTypeAlias(
-      Token typedefKeyword, Token equals, Token endToken) {
+      Token typedefKeyword, Token? equals, Token endToken) {
     DirectParserASTContentFunctionTypeAliasEnd data =
         new DirectParserASTContentFunctionTypeAliasEnd(DirectParserASTType.END,
             typedefKeyword: typedefKeyword, equals: equals, endToken: endToken);
@@ -860,7 +858,7 @@
   }
 
   void beginNamedMixinApplication(
-      Token begin, Token abstractToken, Token name) {
+      Token begin, Token? abstractToken, Token name) {
     DirectParserASTContentNamedMixinApplicationBegin data =
         new DirectParserASTContentNamedMixinApplicationBegin(
             DirectParserASTType.BEGIN,
@@ -879,7 +877,7 @@
   }
 
   void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
-      Token implementsKeyword, Token endToken) {
+      Token? implementsKeyword, Token endToken) {
     DirectParserASTContentNamedMixinApplicationEnd data =
         new DirectParserASTContentNamedMixinApplicationEnd(
             DirectParserASTType.END,
@@ -934,7 +932,7 @@
     seen(data);
   }
 
-  void endIfStatement(Token ifToken, Token elseToken) {
+  void endIfStatement(Token ifToken, Token? elseToken) {
     DirectParserASTContentIfStatementEnd data =
         new DirectParserASTContentIfStatementEnd(DirectParserASTType.END,
             ifToken: ifToken, elseToken: elseToken);
@@ -976,14 +974,14 @@
     seen(data);
   }
 
-  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
+  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     DirectParserASTContentImportPrefixHandle data =
         new DirectParserASTContentImportPrefixHandle(DirectParserASTType.HANDLE,
             deferredKeyword: deferredKeyword, asKeyword: asKeyword);
     seen(data);
   }
 
-  void endImport(Token importKeyword, Token semicolon) {
+  void endImport(Token importKeyword, Token? semicolon) {
     DirectParserASTContentImportEnd data = new DirectParserASTContentImportEnd(
         DirectParserASTType.END,
         importKeyword: importKeyword,
@@ -991,7 +989,7 @@
     seen(data);
   }
 
-  void handleRecoverImport(Token semicolon) {
+  void handleRecoverImport(Token? semicolon) {
     DirectParserASTContentRecoverImportHandle data =
         new DirectParserASTContentRecoverImportHandle(
             DirectParserASTType.HANDLE,
@@ -1021,7 +1019,7 @@
     seen(data);
   }
 
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
     DirectParserASTContentConditionalUriEnd data =
         new DirectParserASTContentConditionalUriEnd(DirectParserASTType.END,
             ifKeyword: ifKeyword, leftParen: leftParen, equalSign: equalSign);
@@ -1226,7 +1224,7 @@
     seen(data);
   }
 
-  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
+  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
     DirectParserASTContentInterpolationExpressionHandle data =
         new DirectParserASTContentInterpolationExpressionHandle(
             DirectParserASTType.HANDLE,
@@ -1271,8 +1269,13 @@
     seen(data);
   }
 
-  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
-      Token varFinalOrConst, Token getOrSet, Token name) {
+  void beginMethod(
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
     DirectParserASTContentMethodBegin data =
         new DirectParserASTContentMethodBegin(DirectParserASTType.BEGIN,
             externalToken: externalToken,
@@ -1284,8 +1287,8 @@
     seen(data);
   }
 
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     DirectParserASTContentClassMethodEnd data =
         new DirectParserASTContentClassMethodEnd(DirectParserASTType.END,
             getOrSet: getOrSet,
@@ -1296,8 +1299,8 @@
     seen(data);
   }
 
-  void endMixinMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     DirectParserASTContentMixinMethodEnd data =
         new DirectParserASTContentMixinMethodEnd(DirectParserASTType.END,
             getOrSet: getOrSet,
@@ -1308,8 +1311,8 @@
     seen(data);
   }
 
-  void endExtensionMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     DirectParserASTContentExtensionMethodEnd data =
         new DirectParserASTContentExtensionMethodEnd(DirectParserASTType.END,
             getOrSet: getOrSet,
@@ -1320,8 +1323,8 @@
     seen(data);
   }
 
-  void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     DirectParserASTContentClassConstructorEnd data =
         new DirectParserASTContentClassConstructorEnd(DirectParserASTType.END,
             getOrSet: getOrSet,
@@ -1332,8 +1335,8 @@
     seen(data);
   }
 
-  void endMixinConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     DirectParserASTContentMixinConstructorEnd data =
         new DirectParserASTContentMixinConstructorEnd(DirectParserASTType.END,
             getOrSet: getOrSet,
@@ -1344,8 +1347,8 @@
     seen(data);
   }
 
-  void endExtensionConstructor(Token getOrSet, Token beginToken,
-      Token beginParam, Token beginInitializers, Token endToken) {
+  void endExtensionConstructor(Token? getOrSet, Token beginToken,
+      Token beginParam, Token? beginInitializers, Token endToken) {
     DirectParserASTContentExtensionConstructorEnd data =
         new DirectParserASTContentExtensionConstructorEnd(
             DirectParserASTType.END,
@@ -1378,7 +1381,7 @@
     seen(data);
   }
 
-  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
     DirectParserASTContentMetadataEnd data =
         new DirectParserASTContentMetadataEnd(DirectParserASTType.END,
             beginToken: beginToken,
@@ -1499,7 +1502,7 @@
     seen(data);
   }
 
-  void handleExpressionFunctionBody(Token arrowToken, Token endToken) {
+  void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
     DirectParserASTContentExpressionFunctionBodyHandle data =
         new DirectParserASTContentExpressionFunctionBodyHandle(
             DirectParserASTType.HANDLE,
@@ -1637,11 +1640,11 @@
   }
 
   void endTopLevelFields(
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -1658,14 +1661,14 @@
     seen(data);
   }
 
-  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
     DirectParserASTContentTopLevelMethodBegin data =
         new DirectParserASTContentTopLevelMethodBegin(DirectParserASTType.BEGIN,
             lastConsumed: lastConsumed, externalToken: externalToken);
     seen(data);
   }
 
-  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
     DirectParserASTContentTopLevelMethodEnd data =
         new DirectParserASTContentTopLevelMethodEnd(DirectParserASTType.END,
             beginToken: beginToken, getOrSet: getOrSet, endToken: endToken);
@@ -1700,7 +1703,7 @@
     seen(data);
   }
 
-  void handleCatchBlock(Token onKeyword, Token catchKeyword, Token comma) {
+  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
     DirectParserASTContentCatchBlockHandle data =
         new DirectParserASTContentCatchBlockHandle(DirectParserASTType.HANDLE,
             onKeyword: onKeyword, catchKeyword: catchKeyword, comma: comma);
@@ -1714,7 +1717,8 @@
     seen(data);
   }
 
-  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
+  void endTryStatement(
+      int catchCount, Token tryKeyword, Token? finallyKeyword) {
     DirectParserASTContentTryStatementEnd data =
         new DirectParserASTContentTryStatementEnd(DirectParserASTType.END,
             catchCount: catchCount,
@@ -1723,7 +1727,7 @@
     seen(data);
   }
 
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     DirectParserASTContentTypeHandle data =
         new DirectParserASTContentTypeHandle(DirectParserASTType.HANDLE,
             beginToken: beginToken, questionMark: questionMark);
@@ -1752,7 +1756,7 @@
     seen(data);
   }
 
-  void endFunctionType(Token functionToken, Token questionMark) {
+  void endFunctionType(Token functionToken, Token? questionMark) {
     DirectParserASTContentFunctionTypeEnd data =
         new DirectParserASTContentFunctionTypeEnd(DirectParserASTType.END,
             functionToken: functionToken, questionMark: questionMark);
@@ -1806,7 +1810,7 @@
   }
 
   void endTypeVariable(
-      Token token, int index, Token extendsOrSuper, Token variance) {
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
     DirectParserASTContentTypeVariableEnd data =
         new DirectParserASTContentTypeVariableEnd(DirectParserASTType.END,
             token: token,
@@ -1846,7 +1850,7 @@
   }
 
   void beginVariablesDeclaration(
-      Token token, Token lateToken, Token varFinalOrConst) {
+      Token token, Token? lateToken, Token? varFinalOrConst) {
     DirectParserASTContentVariablesDeclarationBegin data =
         new DirectParserASTContentVariablesDeclarationBegin(
             DirectParserASTType.BEGIN,
@@ -1856,7 +1860,7 @@
     seen(data);
   }
 
-  void endVariablesDeclaration(int count, Token endToken) {
+  void endVariablesDeclaration(int count, Token? endToken) {
     DirectParserASTContentVariablesDeclarationEnd data =
         new DirectParserASTContentVariablesDeclarationEnd(
             DirectParserASTType.END,
@@ -1977,7 +1981,7 @@
     seen(data);
   }
 
-  void beginForControlFlow(Token awaitToken, Token forToken) {
+  void beginForControlFlow(Token? awaitToken, Token forToken) {
     DirectParserASTContentForControlFlowBegin data =
         new DirectParserASTContentForControlFlowBegin(DirectParserASTType.BEGIN,
             awaitToken: awaitToken, forToken: forToken);
@@ -2051,7 +2055,7 @@
     seen(data);
   }
 
-  void endFunctionTypedFormalParameter(Token nameToken, Token question) {
+  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
     DirectParserASTContentFunctionTypedFormalParameterEnd data =
         new DirectParserASTContentFunctionTypedFormalParameterEnd(
             DirectParserASTType.END,
@@ -2068,7 +2072,7 @@
   }
 
   void handleIndexedExpression(
-      Token question, Token openSquareBracket, Token closeSquareBracket) {
+      Token? question, Token openSquareBracket, Token closeSquareBracket) {
     DirectParserASTContentIndexedExpressionHandle data =
         new DirectParserASTContentIndexedExpressionHandle(
             DirectParserASTType.HANDLE,
@@ -2092,7 +2096,7 @@
     seen(data);
   }
 
-  void handleIsOperator(Token isOperator, Token not) {
+  void handleIsOperator(Token isOperator, Token? not) {
     DirectParserASTContentIsOperatorHandle data =
         new DirectParserASTContentIsOperatorHandle(DirectParserASTType.HANDLE,
             isOperator: isOperator, not: not);
@@ -2144,7 +2148,7 @@
   }
 
   void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
-      Token commaToken, Token semicolonToken) {
+      Token? commaToken, Token semicolonToken) {
     DirectParserASTContentAssertEnd data = new DirectParserASTContentAssertEnd(
         DirectParserASTType.END,
         assertKeyword: assertKeyword,
@@ -2171,7 +2175,7 @@
   }
 
   void handleLiteralList(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
     DirectParserASTContentLiteralListHandle data =
         new DirectParserASTContentLiteralListHandle(DirectParserASTType.HANDLE,
             count: count,
@@ -2184,7 +2188,7 @@
   void handleLiteralSetOrMap(
     int count,
     Token leftBrace,
-    Token constKeyword,
+    Token? constKeyword,
     Token rightBrace,
     bool hasSetEntry,
   ) {
@@ -2347,8 +2351,8 @@
   void endSwitchCase(
       int labelCount,
       int expressionCount,
-      Token defaultKeyword,
-      Token colonAfterDefault,
+      Token? defaultKeyword,
+      Token? colonAfterDefault,
       int statementCount,
       Token firstToken,
       Token endToken) {
@@ -2450,14 +2454,14 @@
     seen(data);
   }
 
-  void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
+  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
     DirectParserASTContentYieldStatementEnd data =
         new DirectParserASTContentYieldStatementEnd(DirectParserASTType.END,
             yieldToken: yieldToken, starToken: starToken, endToken: endToken);
     seen(data);
   }
 
-  void endInvalidYieldStatement(Token beginToken, Token starToken,
+  void endInvalidYieldStatement(Token beginToken, Token? starToken,
       Token endToken, MessageCode errorCode) {
     DirectParserASTContentInvalidYieldStatementEnd data =
         new DirectParserASTContentInvalidYieldStatementEnd(
@@ -2525,7 +2529,7 @@
   }
 
   void handleCommentReference(
-      Token newKeyword, Token prefix, Token period, Token token) {
+      Token? newKeyword, Token? prefix, Token? period, Token token) {
     DirectParserASTContentCommentReferenceHandle data =
         new DirectParserASTContentCommentReferenceHandle(
             DirectParserASTType.HANDLE,
@@ -2547,10 +2551,11 @@
 class DirectParserASTContentArgumentsBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentArgumentsBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentArgumentsBegin(DirectParserASTType type,
+      {required this.token})
       : super("Arguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -2561,10 +2566,10 @@
   final Token endToken;
 
   DirectParserASTContentArgumentsEnd(DirectParserASTType type,
-      {this.count, this.beginToken, this.endToken})
+      {required this.count, required this.beginToken, required this.endToken})
       : super("Arguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -2572,14 +2577,14 @@
 }
 
 class DirectParserASTContentAsyncModifierHandle extends DirectParserASTContent {
-  final Token asyncToken;
-  final Token starToken;
+  final Token? asyncToken;
+  final Token? starToken;
 
   DirectParserASTContentAsyncModifierHandle(DirectParserASTType type,
       {this.asyncToken, this.starToken})
       : super("AsyncModifier", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "asyncToken": asyncToken,
         "starToken": starToken,
       };
@@ -2590,10 +2595,10 @@
   final Token token;
 
   DirectParserASTContentAwaitExpressionBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("AwaitExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -2603,10 +2608,10 @@
   final Token endToken;
 
   DirectParserASTContentAwaitExpressionEnd(DirectParserASTType type,
-      {this.beginToken, this.endToken})
+      {required this.beginToken, required this.endToken})
       : super("AwaitExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "endToken": endToken,
       };
@@ -2619,10 +2624,12 @@
   final MessageCode errorCode;
 
   DirectParserASTContentInvalidAwaitExpressionEnd(DirectParserASTType type,
-      {this.beginToken, this.endToken, this.errorCode})
+      {required this.beginToken,
+      required this.endToken,
+      required this.errorCode})
       : super("InvalidAwaitExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "endToken": endToken,
         "errorCode": errorCode,
@@ -2634,10 +2641,10 @@
   final BlockKind blockKind;
 
   DirectParserASTContentBlockBegin(DirectParserASTType type,
-      {this.token, this.blockKind})
+      {required this.token, required this.blockKind})
       : super("Block", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "blockKind": blockKind,
       };
@@ -2650,10 +2657,13 @@
   final BlockKind blockKind;
 
   DirectParserASTContentBlockEnd(DirectParserASTType type,
-      {this.count, this.beginToken, this.endToken, this.blockKind})
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.blockKind})
       : super("Block", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -2666,10 +2676,10 @@
   final Token token;
 
   DirectParserASTContentInvalidTopLevelBlockHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("InvalidTopLevelBlock", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -2677,10 +2687,11 @@
 class DirectParserASTContentCascadeBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentCascadeBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentCascadeBegin(DirectParserASTType type,
+      {required this.token})
       : super("Cascade", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -2689,17 +2700,17 @@
   DirectParserASTContentCascadeEnd(DirectParserASTType type)
       : super("Cascade", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentCaseExpressionBegin extends DirectParserASTContent {
   final Token caseKeyword;
 
   DirectParserASTContentCaseExpressionBegin(DirectParserASTType type,
-      {this.caseKeyword})
+      {required this.caseKeyword})
       : super("CaseExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "caseKeyword": caseKeyword,
       };
 }
@@ -2708,10 +2719,10 @@
   final Token colon;
 
   DirectParserASTContentCaseExpressionEnd(DirectParserASTType type,
-      {this.colon})
+      {required this.colon})
       : super("CaseExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "colon": colon,
       };
 }
@@ -2722,10 +2733,10 @@
   final Token token;
 
   DirectParserASTContentClassOrMixinBodyBegin(DirectParserASTType type,
-      {this.kind, this.token})
+      {required this.kind, required this.token})
       : super("ClassOrMixinBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "kind": kind,
         "token": token,
       };
@@ -2738,10 +2749,13 @@
   final Token endToken;
 
   DirectParserASTContentClassOrMixinBodyEnd(DirectParserASTType type,
-      {this.kind, this.memberCount, this.beginToken, this.endToken})
+      {required this.kind,
+      required this.memberCount,
+      required this.beginToken,
+      required this.endToken})
       : super("ClassOrMixinBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "kind": kind,
         "memberCount": memberCount,
         "beginToken": beginToken,
@@ -2755,10 +2769,10 @@
 
   DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ClassOrNamedMixinApplicationPrelude", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -2766,14 +2780,14 @@
 class DirectParserASTContentClassDeclarationBegin
     extends DirectParserASTContent {
   final Token begin;
-  final Token abstractToken;
+  final Token? abstractToken;
   final Token name;
 
   DirectParserASTContentClassDeclarationBegin(DirectParserASTType type,
-      {this.begin, this.abstractToken, this.name})
+      {required this.begin, this.abstractToken, required this.name})
       : super("ClassDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "begin": begin,
         "abstractToken": abstractToken,
         "name": name,
@@ -2781,14 +2795,14 @@
 }
 
 class DirectParserASTContentClassExtendsHandle extends DirectParserASTContent {
-  final Token extendsKeyword;
+  final Token? extendsKeyword;
   final int typeCount;
 
   DirectParserASTContentClassExtendsHandle(DirectParserASTType type,
-      {this.extendsKeyword, this.typeCount})
+      {this.extendsKeyword, required this.typeCount})
       : super("ClassExtends", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "extendsKeyword": extendsKeyword,
         "typeCount": typeCount,
       };
@@ -2796,14 +2810,14 @@
 
 class DirectParserASTContentClassOrMixinImplementsHandle
     extends DirectParserASTContent {
-  final Token implementsKeyword;
+  final Token? implementsKeyword;
   final int interfacesCount;
 
   DirectParserASTContentClassOrMixinImplementsHandle(DirectParserASTType type,
-      {this.implementsKeyword, this.interfacesCount})
+      {this.implementsKeyword, required this.interfacesCount})
       : super("ClassOrMixinImplements", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "implementsKeyword": implementsKeyword,
         "interfacesCount": interfacesCount,
       };
@@ -2812,13 +2826,13 @@
 class DirectParserASTContentClassHeaderHandle extends DirectParserASTContent {
   final Token begin;
   final Token classKeyword;
-  final Token nativeToken;
+  final Token? nativeToken;
 
   DirectParserASTContentClassHeaderHandle(DirectParserASTType type,
-      {this.begin, this.classKeyword, this.nativeToken})
+      {required this.begin, required this.classKeyword, this.nativeToken})
       : super("ClassHeader", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "begin": begin,
         "classKeyword": classKeyword,
         "nativeToken": nativeToken,
@@ -2830,7 +2844,7 @@
   DirectParserASTContentRecoverClassHeaderHandle(DirectParserASTType type)
       : super("RecoverClassHeader", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentClassDeclarationEnd extends DirectParserASTContent {
@@ -2838,10 +2852,10 @@
   final Token endToken;
 
   DirectParserASTContentClassDeclarationEnd(DirectParserASTType type,
-      {this.beginToken, this.endToken})
+      {required this.beginToken, required this.endToken})
       : super("ClassDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "endToken": endToken,
       };
@@ -2853,24 +2867,24 @@
   final Token name;
 
   DirectParserASTContentMixinDeclarationBegin(DirectParserASTType type,
-      {this.mixinKeyword, this.name})
+      {required this.mixinKeyword, required this.name})
       : super("MixinDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "mixinKeyword": mixinKeyword,
         "name": name,
       };
 }
 
 class DirectParserASTContentMixinOnHandle extends DirectParserASTContent {
-  final Token onKeyword;
+  final Token? onKeyword;
   final int typeCount;
 
   DirectParserASTContentMixinOnHandle(DirectParserASTType type,
-      {this.onKeyword, this.typeCount})
+      {this.onKeyword, required this.typeCount})
       : super("MixinOn", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "onKeyword": onKeyword,
         "typeCount": typeCount,
       };
@@ -2880,10 +2894,10 @@
   final Token mixinKeyword;
 
   DirectParserASTContentMixinHeaderHandle(DirectParserASTType type,
-      {this.mixinKeyword})
+      {required this.mixinKeyword})
       : super("MixinHeader", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "mixinKeyword": mixinKeyword,
       };
 }
@@ -2893,7 +2907,7 @@
   DirectParserASTContentRecoverMixinHeaderHandle(DirectParserASTType type)
       : super("RecoverMixinHeader", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentMixinDeclarationEnd extends DirectParserASTContent {
@@ -2901,10 +2915,10 @@
   final Token endToken;
 
   DirectParserASTContentMixinDeclarationEnd(DirectParserASTType type,
-      {this.mixinKeyword, this.endToken})
+      {required this.mixinKeyword, required this.endToken})
       : super("MixinDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "mixinKeyword": mixinKeyword,
         "endToken": endToken,
       };
@@ -2916,10 +2930,10 @@
 
   DirectParserASTContentUncategorizedTopLevelDeclarationBegin(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("UncategorizedTopLevelDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -2930,10 +2944,10 @@
 
   DirectParserASTContentExtensionDeclarationPreludeBegin(
       DirectParserASTType type,
-      {this.extensionKeyword})
+      {required this.extensionKeyword})
       : super("ExtensionDeclarationPrelude", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "extensionKeyword": extensionKeyword,
       };
 }
@@ -2941,13 +2955,13 @@
 class DirectParserASTContentExtensionDeclarationBegin
     extends DirectParserASTContent {
   final Token extensionKeyword;
-  final Token name;
+  final Token? name;
 
   DirectParserASTContentExtensionDeclarationBegin(DirectParserASTType type,
-      {this.extensionKeyword, this.name})
+      {required this.extensionKeyword, this.name})
       : super("ExtensionDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "extensionKeyword": extensionKeyword,
         "name": name,
       };
@@ -2960,10 +2974,12 @@
   final Token endToken;
 
   DirectParserASTContentExtensionDeclarationEnd(DirectParserASTType type,
-      {this.extensionKeyword, this.onKeyword, this.endToken})
+      {required this.extensionKeyword,
+      required this.onKeyword,
+      required this.endToken})
       : super("ExtensionDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "extensionKeyword": extensionKeyword,
         "onKeyword": onKeyword,
         "endToken": endToken,
@@ -2973,10 +2989,11 @@
 class DirectParserASTContentCombinatorsBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentCombinatorsBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentCombinatorsBegin(DirectParserASTType type,
+      {required this.token})
       : super("Combinators", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -2984,10 +3001,11 @@
 class DirectParserASTContentCombinatorsEnd extends DirectParserASTContent {
   final int count;
 
-  DirectParserASTContentCombinatorsEnd(DirectParserASTType type, {this.count})
+  DirectParserASTContentCombinatorsEnd(DirectParserASTType type,
+      {required this.count})
       : super("Combinators", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
       };
 }
@@ -2997,10 +3015,10 @@
   final Token token;
 
   DirectParserASTContentCompilationUnitBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("CompilationUnit", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3010,7 +3028,7 @@
   DirectParserASTContentDirectivesOnlyHandle(DirectParserASTType type)
       : super("DirectivesOnly", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentCompilationUnitEnd extends DirectParserASTContent {
@@ -3018,10 +3036,10 @@
   final Token token;
 
   DirectParserASTContentCompilationUnitEnd(DirectParserASTType type,
-      {this.count, this.token})
+      {required this.count, required this.token})
       : super("CompilationUnit", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "token": token,
       };
@@ -3031,10 +3049,10 @@
   final Token token;
 
   DirectParserASTContentConstLiteralBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ConstLiteral", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3042,10 +3060,11 @@
 class DirectParserASTContentConstLiteralEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentConstLiteralEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentConstLiteralEnd(DirectParserASTType type,
+      {required this.token})
       : super("ConstLiteral", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3055,10 +3074,10 @@
   final Token start;
 
   DirectParserASTContentConstructorReferenceBegin(DirectParserASTType type,
-      {this.start})
+      {required this.start})
       : super("ConstructorReference", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "start": start,
       };
 }
@@ -3066,14 +3085,14 @@
 class DirectParserASTContentConstructorReferenceEnd
     extends DirectParserASTContent {
   final Token start;
-  final Token periodBeforeName;
+  final Token? periodBeforeName;
   final Token endToken;
 
   DirectParserASTContentConstructorReferenceEnd(DirectParserASTType type,
-      {this.start, this.periodBeforeName, this.endToken})
+      {required this.start, this.periodBeforeName, required this.endToken})
       : super("ConstructorReference", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "start": start,
         "periodBeforeName": periodBeforeName,
         "endToken": endToken,
@@ -3085,10 +3104,10 @@
   final Token token;
 
   DirectParserASTContentDoWhileStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("DoWhileStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3099,10 +3118,12 @@
   final Token endToken;
 
   DirectParserASTContentDoWhileStatementEnd(DirectParserASTType type,
-      {this.doKeyword, this.whileKeyword, this.endToken})
+      {required this.doKeyword,
+      required this.whileKeyword,
+      required this.endToken})
       : super("DoWhileStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "doKeyword": doKeyword,
         "whileKeyword": whileKeyword,
         "endToken": endToken,
@@ -3114,10 +3135,10 @@
   final Token token;
 
   DirectParserASTContentDoWhileStatementBodyBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("DoWhileStatementBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3127,10 +3148,10 @@
   final Token token;
 
   DirectParserASTContentDoWhileStatementBodyEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("DoWhileStatementBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3140,10 +3161,10 @@
   final Token token;
 
   DirectParserASTContentWhileStatementBodyBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("WhileStatementBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3153,10 +3174,10 @@
   final Token token;
 
   DirectParserASTContentWhileStatementBodyEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("WhileStatementBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3164,10 +3185,11 @@
 class DirectParserASTContentEnumBegin extends DirectParserASTContent {
   final Token enumKeyword;
 
-  DirectParserASTContentEnumBegin(DirectParserASTType type, {this.enumKeyword})
+  DirectParserASTContentEnumBegin(DirectParserASTType type,
+      {required this.enumKeyword})
       : super("Enum", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "enumKeyword": enumKeyword,
       };
 }
@@ -3178,10 +3200,10 @@
   final int count;
 
   DirectParserASTContentEnumEnd(DirectParserASTType type,
-      {this.enumKeyword, this.leftBrace, this.count})
+      {required this.enumKeyword, required this.leftBrace, required this.count})
       : super("Enum", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "enumKeyword": enumKeyword,
         "leftBrace": leftBrace,
         "count": count,
@@ -3191,10 +3213,11 @@
 class DirectParserASTContentExportBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentExportBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentExportBegin(DirectParserASTType type,
+      {required this.token})
       : super("Export", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3204,10 +3227,10 @@
   final Token semicolon;
 
   DirectParserASTContentExportEnd(DirectParserASTType type,
-      {this.exportKeyword, this.semicolon})
+      {required this.exportKeyword, required this.semicolon})
       : super("Export", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "exportKeyword": exportKeyword,
         "semicolon": semicolon,
       };
@@ -3219,10 +3242,10 @@
   final Message message;
 
   DirectParserASTContentExtraneousExpressionHandle(DirectParserASTType type,
-      {this.token, this.message})
+      {required this.token, required this.message})
       : super("ExtraneousExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "message": message,
       };
@@ -3233,24 +3256,24 @@
   final Token token;
 
   DirectParserASTContentExpressionStatementHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ExpressionStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
 
 class DirectParserASTContentFactoryMethodBegin extends DirectParserASTContent {
   final Token lastConsumed;
-  final Token externalToken;
-  final Token constToken;
+  final Token? externalToken;
+  final Token? constToken;
 
   DirectParserASTContentFactoryMethodBegin(DirectParserASTType type,
-      {this.lastConsumed, this.externalToken, this.constToken})
+      {required this.lastConsumed, this.externalToken, this.constToken})
       : super("FactoryMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "lastConsumed": lastConsumed,
         "externalToken": externalToken,
         "constToken": constToken,
@@ -3264,10 +3287,12 @@
   final Token endToken;
 
   DirectParserASTContentClassFactoryMethodEnd(DirectParserASTType type,
-      {this.beginToken, this.factoryKeyword, this.endToken})
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
       : super("ClassFactoryMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "factoryKeyword": factoryKeyword,
         "endToken": endToken,
@@ -3281,10 +3306,12 @@
   final Token endToken;
 
   DirectParserASTContentMixinFactoryMethodEnd(DirectParserASTType type,
-      {this.beginToken, this.factoryKeyword, this.endToken})
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
       : super("MixinFactoryMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "factoryKeyword": factoryKeyword,
         "endToken": endToken,
@@ -3298,10 +3325,12 @@
   final Token endToken;
 
   DirectParserASTContentExtensionFactoryMethodEnd(DirectParserASTType type,
-      {this.beginToken, this.factoryKeyword, this.endToken})
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
       : super("ExtensionFactoryMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "factoryKeyword": factoryKeyword,
         "endToken": endToken,
@@ -3312,19 +3341,19 @@
     extends DirectParserASTContent {
   final Token token;
   final MemberKind kind;
-  final Token requiredToken;
-  final Token covariantToken;
-  final Token varFinalOrConst;
+  final Token? requiredToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
 
   DirectParserASTContentFormalParameterBegin(DirectParserASTType type,
-      {this.token,
-      this.kind,
+      {required this.token,
+      required this.kind,
       this.requiredToken,
       this.covariantToken,
       this.varFinalOrConst})
       : super("FormalParameter", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "kind": kind,
         "requiredToken": requiredToken,
@@ -3334,25 +3363,25 @@
 }
 
 class DirectParserASTContentFormalParameterEnd extends DirectParserASTContent {
-  final Token thisKeyword;
-  final Token periodAfterThis;
+  final Token? thisKeyword;
+  final Token? periodAfterThis;
   final Token nameToken;
-  final Token initializerStart;
-  final Token initializerEnd;
+  final Token? initializerStart;
+  final Token? initializerEnd;
   final FormalParameterKind kind;
   final MemberKind memberKind;
 
   DirectParserASTContentFormalParameterEnd(DirectParserASTType type,
       {this.thisKeyword,
       this.periodAfterThis,
-      this.nameToken,
+      required this.nameToken,
       this.initializerStart,
       this.initializerEnd,
-      this.kind,
-      this.memberKind})
+      required this.kind,
+      required this.memberKind})
       : super("FormalParameter", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "thisKeyword": thisKeyword,
         "periodAfterThis": periodAfterThis,
         "nameToken": nameToken,
@@ -3369,10 +3398,10 @@
   final MemberKind kind;
 
   DirectParserASTContentNoFormalParametersHandle(DirectParserASTType type,
-      {this.token, this.kind})
+      {required this.token, required this.kind})
       : super("NoFormalParameters", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "kind": kind,
       };
@@ -3384,10 +3413,10 @@
   final MemberKind kind;
 
   DirectParserASTContentFormalParametersBegin(DirectParserASTType type,
-      {this.token, this.kind})
+      {required this.token, required this.kind})
       : super("FormalParameters", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "kind": kind,
       };
@@ -3400,10 +3429,13 @@
   final MemberKind kind;
 
   DirectParserASTContentFormalParametersEnd(DirectParserASTType type,
-      {this.count, this.beginToken, this.endToken, this.kind})
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.kind})
       : super("FormalParameters", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -3412,12 +3444,12 @@
 }
 
 class DirectParserASTContentClassFieldsEnd extends DirectParserASTContent {
-  final Token abstractToken;
-  final Token externalToken;
-  final Token staticToken;
-  final Token covariantToken;
-  final Token lateToken;
-  final Token varFinalOrConst;
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
   final int count;
   final Token beginToken;
   final Token endToken;
@@ -3429,12 +3461,12 @@
       this.covariantToken,
       this.lateToken,
       this.varFinalOrConst,
-      this.count,
-      this.beginToken,
-      this.endToken})
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
       : super("ClassFields", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "abstractToken": abstractToken,
         "externalToken": externalToken,
         "staticToken": staticToken,
@@ -3448,12 +3480,12 @@
 }
 
 class DirectParserASTContentMixinFieldsEnd extends DirectParserASTContent {
-  final Token abstractToken;
-  final Token externalToken;
-  final Token staticToken;
-  final Token covariantToken;
-  final Token lateToken;
-  final Token varFinalOrConst;
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
   final int count;
   final Token beginToken;
   final Token endToken;
@@ -3465,12 +3497,12 @@
       this.covariantToken,
       this.lateToken,
       this.varFinalOrConst,
-      this.count,
-      this.beginToken,
-      this.endToken})
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
       : super("MixinFields", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "abstractToken": abstractToken,
         "externalToken": externalToken,
         "staticToken": staticToken,
@@ -3484,12 +3516,12 @@
 }
 
 class DirectParserASTContentExtensionFieldsEnd extends DirectParserASTContent {
-  final Token abstractToken;
-  final Token externalToken;
-  final Token staticToken;
-  final Token covariantToken;
-  final Token lateToken;
-  final Token varFinalOrConst;
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
   final int count;
   final Token beginToken;
   final Token endToken;
@@ -3501,12 +3533,12 @@
       this.covariantToken,
       this.lateToken,
       this.varFinalOrConst,
-      this.count,
-      this.beginToken,
-      this.endToken})
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
       : super("ExtensionFields", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "abstractToken": abstractToken,
         "externalToken": externalToken,
         "staticToken": staticToken,
@@ -3525,10 +3557,10 @@
 
   DirectParserASTContentForInitializerEmptyStatementHandle(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForInitializerEmptyStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3540,11 +3572,11 @@
 
   DirectParserASTContentForInitializerExpressionStatementHandle(
       DirectParserASTType type,
-      {this.token,
-      this.forIn})
+      {required this.token,
+      required this.forIn})
       : super("ForInitializerExpressionStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "forIn": forIn,
       };
@@ -3557,11 +3589,11 @@
 
   DirectParserASTContentForInitializerLocalVariableDeclarationHandle(
       DirectParserASTType type,
-      {this.token,
-      this.forIn})
+      {required this.token,
+      required this.forIn})
       : super("ForInitializerLocalVariableDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "forIn": forIn,
       };
@@ -3571,10 +3603,10 @@
   final Token token;
 
   DirectParserASTContentForStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3586,13 +3618,13 @@
   final int updateExpressionCount;
 
   DirectParserASTContentForLoopPartsHandle(DirectParserASTType type,
-      {this.forKeyword,
-      this.leftParen,
-      this.leftSeparator,
-      this.updateExpressionCount})
+      {required this.forKeyword,
+      required this.leftParen,
+      required this.leftSeparator,
+      required this.updateExpressionCount})
       : super("ForLoopParts", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "forKeyword": forKeyword,
         "leftParen": leftParen,
         "leftSeparator": leftSeparator,
@@ -3604,10 +3636,10 @@
   final Token endToken;
 
   DirectParserASTContentForStatementEnd(DirectParserASTType type,
-      {this.endToken})
+      {required this.endToken})
       : super("ForStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "endToken": endToken,
       };
 }
@@ -3617,10 +3649,10 @@
   final Token token;
 
   DirectParserASTContentForStatementBodyBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForStatementBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3629,26 +3661,29 @@
   final Token token;
 
   DirectParserASTContentForStatementBodyEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForStatementBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
 
 class DirectParserASTContentForInLoopPartsHandle
     extends DirectParserASTContent {
-  final Token awaitToken;
+  final Token? awaitToken;
   final Token forToken;
   final Token leftParenthesis;
   final Token inKeyword;
 
   DirectParserASTContentForInLoopPartsHandle(DirectParserASTType type,
-      {this.awaitToken, this.forToken, this.leftParenthesis, this.inKeyword})
+      {this.awaitToken,
+      required this.forToken,
+      required this.leftParenthesis,
+      required this.inKeyword})
       : super("ForInLoopParts", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "awaitToken": awaitToken,
         "forToken": forToken,
         "leftParenthesis": leftParenthesis,
@@ -3659,10 +3694,11 @@
 class DirectParserASTContentForInEnd extends DirectParserASTContent {
   final Token endToken;
 
-  DirectParserASTContentForInEnd(DirectParserASTType type, {this.endToken})
+  DirectParserASTContentForInEnd(DirectParserASTType type,
+      {required this.endToken})
       : super("ForIn", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "endToken": endToken,
       };
 }
@@ -3672,10 +3708,10 @@
   final Token token;
 
   DirectParserASTContentForInExpressionBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForInExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3684,10 +3720,10 @@
   final Token token;
 
   DirectParserASTContentForInExpressionEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForInExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3695,10 +3731,11 @@
 class DirectParserASTContentForInBodyBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentForInBodyBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentForInBodyBegin(DirectParserASTType type,
+      {required this.token})
       : super("ForInBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3706,10 +3743,11 @@
 class DirectParserASTContentForInBodyEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentForInBodyEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentForInBodyEnd(DirectParserASTType type,
+      {required this.token})
       : super("ForInBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3719,10 +3757,10 @@
   final Token token;
 
   DirectParserASTContentNamedFunctionExpressionBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NamedFunctionExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3732,10 +3770,10 @@
   final Token endToken;
 
   DirectParserASTContentNamedFunctionExpressionEnd(DirectParserASTType type,
-      {this.endToken})
+      {required this.endToken})
       : super("NamedFunctionExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "endToken": endToken,
       };
 }
@@ -3745,10 +3783,10 @@
   final Token token;
 
   DirectParserASTContentLocalFunctionDeclarationBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("LocalFunctionDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3758,10 +3796,10 @@
   final Token endToken;
 
   DirectParserASTContentLocalFunctionDeclarationEnd(DirectParserASTType type,
-      {this.endToken})
+      {required this.endToken})
       : super("LocalFunctionDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "endToken": endToken,
       };
 }
@@ -3771,10 +3809,10 @@
   final Token token;
 
   DirectParserASTContentBlockFunctionBodyBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("BlockFunctionBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3786,10 +3824,10 @@
   final Token endToken;
 
   DirectParserASTContentBlockFunctionBodyEnd(DirectParserASTType type,
-      {this.count, this.beginToken, this.endToken})
+      {required this.count, required this.beginToken, required this.endToken})
       : super("BlockFunctionBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -3801,10 +3839,10 @@
   final Token token;
 
   DirectParserASTContentNoFunctionBodyHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NoFunctionBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3815,10 +3853,10 @@
   final bool isExpressionBody;
 
   DirectParserASTContentFunctionBodySkippedHandle(DirectParserASTType type,
-      {this.token, this.isExpressionBody})
+      {required this.token, required this.isExpressionBody})
       : super("FunctionBodySkipped", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "isExpressionBody": isExpressionBody,
       };
@@ -3828,10 +3866,10 @@
   final Token token;
 
   DirectParserASTContentFunctionNameBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("FunctionName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3841,10 +3879,10 @@
   final Token token;
 
   DirectParserASTContentFunctionNameEnd(DirectParserASTType type,
-      {this.beginToken, this.token})
+      {required this.beginToken, required this.token})
       : super("FunctionName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "token": token,
       };
@@ -3855,10 +3893,10 @@
   final Token token;
 
   DirectParserASTContentFunctionTypeAliasBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("FunctionTypeAlias", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -3866,14 +3904,14 @@
 class DirectParserASTContentFunctionTypeAliasEnd
     extends DirectParserASTContent {
   final Token typedefKeyword;
-  final Token equals;
+  final Token? equals;
   final Token endToken;
 
   DirectParserASTContentFunctionTypeAliasEnd(DirectParserASTType type,
-      {this.typedefKeyword, this.equals, this.endToken})
+      {required this.typedefKeyword, this.equals, required this.endToken})
       : super("FunctionTypeAlias", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "typedefKeyword": typedefKeyword,
         "equals": equals,
         "endToken": endToken,
@@ -3885,10 +3923,10 @@
   final Token withKeyword;
 
   DirectParserASTContentClassWithClauseHandle(DirectParserASTType type,
-      {this.withKeyword})
+      {required this.withKeyword})
       : super("ClassWithClause", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "withKeyword": withKeyword,
       };
 }
@@ -3898,20 +3936,20 @@
   DirectParserASTContentClassNoWithClauseHandle(DirectParserASTType type)
       : super("ClassNoWithClause", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentNamedMixinApplicationBegin
     extends DirectParserASTContent {
   final Token begin;
-  final Token abstractToken;
+  final Token? abstractToken;
   final Token name;
 
   DirectParserASTContentNamedMixinApplicationBegin(DirectParserASTType type,
-      {this.begin, this.abstractToken, this.name})
+      {required this.begin, this.abstractToken, required this.name})
       : super("NamedMixinApplication", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "begin": begin,
         "abstractToken": abstractToken,
         "name": name,
@@ -3924,10 +3962,10 @@
 
   DirectParserASTContentNamedMixinApplicationWithClauseHandle(
       DirectParserASTType type,
-      {this.withKeyword})
+      {required this.withKeyword})
       : super("NamedMixinApplicationWithClause", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "withKeyword": withKeyword,
       };
 }
@@ -3937,18 +3975,18 @@
   final Token begin;
   final Token classKeyword;
   final Token equals;
-  final Token implementsKeyword;
+  final Token? implementsKeyword;
   final Token endToken;
 
   DirectParserASTContentNamedMixinApplicationEnd(DirectParserASTType type,
-      {this.begin,
-      this.classKeyword,
-      this.equals,
+      {required this.begin,
+      required this.classKeyword,
+      required this.equals,
       this.implementsKeyword,
-      this.endToken})
+      required this.endToken})
       : super("NamedMixinApplication", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "begin": begin,
         "classKeyword": classKeyword,
         "equals": equals,
@@ -3960,10 +3998,11 @@
 class DirectParserASTContentHideBegin extends DirectParserASTContent {
   final Token hideKeyword;
 
-  DirectParserASTContentHideBegin(DirectParserASTType type, {this.hideKeyword})
+  DirectParserASTContentHideBegin(DirectParserASTType type,
+      {required this.hideKeyword})
       : super("Hide", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "hideKeyword": hideKeyword,
       };
 }
@@ -3971,10 +4010,11 @@
 class DirectParserASTContentHideEnd extends DirectParserASTContent {
   final Token hideKeyword;
 
-  DirectParserASTContentHideEnd(DirectParserASTType type, {this.hideKeyword})
+  DirectParserASTContentHideEnd(DirectParserASTType type,
+      {required this.hideKeyword})
       : super("Hide", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "hideKeyword": hideKeyword,
       };
 }
@@ -3984,10 +4024,10 @@
   final int count;
 
   DirectParserASTContentIdentifierListHandle(DirectParserASTType type,
-      {this.count})
+      {required this.count})
       : super("IdentifierList", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
       };
 }
@@ -3995,10 +4035,11 @@
 class DirectParserASTContentTypeListBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentTypeListBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentTypeListBegin(DirectParserASTType type,
+      {required this.token})
       : super("TypeList", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4006,10 +4047,11 @@
 class DirectParserASTContentTypeListEnd extends DirectParserASTContent {
   final int count;
 
-  DirectParserASTContentTypeListEnd(DirectParserASTType type, {this.count})
+  DirectParserASTContentTypeListEnd(DirectParserASTType type,
+      {required this.count})
       : super("TypeList", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
       };
 }
@@ -4017,23 +4059,24 @@
 class DirectParserASTContentIfStatementBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentIfStatementBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentIfStatementBegin(DirectParserASTType type,
+      {required this.token})
       : super("IfStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
 
 class DirectParserASTContentIfStatementEnd extends DirectParserASTContent {
   final Token ifToken;
-  final Token elseToken;
+  final Token? elseToken;
 
   DirectParserASTContentIfStatementEnd(DirectParserASTType type,
-      {this.ifToken, this.elseToken})
+      {required this.ifToken, this.elseToken})
       : super("IfStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "ifToken": ifToken,
         "elseToken": elseToken,
       };
@@ -4043,10 +4086,10 @@
   final Token token;
 
   DirectParserASTContentThenStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ThenStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4054,10 +4097,11 @@
 class DirectParserASTContentThenStatementEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentThenStatementEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentThenStatementEnd(DirectParserASTType type,
+      {required this.token})
       : super("ThenStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4066,10 +4110,10 @@
   final Token token;
 
   DirectParserASTContentElseStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ElseStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4077,10 +4121,11 @@
 class DirectParserASTContentElseStatementEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentElseStatementEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentElseStatementEnd(DirectParserASTType type,
+      {required this.token})
       : super("ElseStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4089,23 +4134,23 @@
   final Token importKeyword;
 
   DirectParserASTContentImportBegin(DirectParserASTType type,
-      {this.importKeyword})
+      {required this.importKeyword})
       : super("Import", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "importKeyword": importKeyword,
       };
 }
 
 class DirectParserASTContentImportPrefixHandle extends DirectParserASTContent {
-  final Token deferredKeyword;
-  final Token asKeyword;
+  final Token? deferredKeyword;
+  final Token? asKeyword;
 
   DirectParserASTContentImportPrefixHandle(DirectParserASTType type,
       {this.deferredKeyword, this.asKeyword})
       : super("ImportPrefix", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "deferredKeyword": deferredKeyword,
         "asKeyword": asKeyword,
       };
@@ -4113,26 +4158,26 @@
 
 class DirectParserASTContentImportEnd extends DirectParserASTContent {
   final Token importKeyword;
-  final Token semicolon;
+  final Token? semicolon;
 
   DirectParserASTContentImportEnd(DirectParserASTType type,
-      {this.importKeyword, this.semicolon})
+      {required this.importKeyword, this.semicolon})
       : super("Import", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "importKeyword": importKeyword,
         "semicolon": semicolon,
       };
 }
 
 class DirectParserASTContentRecoverImportHandle extends DirectParserASTContent {
-  final Token semicolon;
+  final Token? semicolon;
 
   DirectParserASTContentRecoverImportHandle(DirectParserASTType type,
       {this.semicolon})
       : super("RecoverImport", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "semicolon": semicolon,
       };
 }
@@ -4142,10 +4187,10 @@
   final Token token;
 
   DirectParserASTContentConditionalUrisBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ConditionalUris", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4154,10 +4199,10 @@
   final int count;
 
   DirectParserASTContentConditionalUrisEnd(DirectParserASTType type,
-      {this.count})
+      {required this.count})
       : super("ConditionalUris", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
       };
 }
@@ -4166,10 +4211,10 @@
   final Token ifKeyword;
 
   DirectParserASTContentConditionalUriBegin(DirectParserASTType type,
-      {this.ifKeyword})
+      {required this.ifKeyword})
       : super("ConditionalUri", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "ifKeyword": ifKeyword,
       };
 }
@@ -4177,13 +4222,13 @@
 class DirectParserASTContentConditionalUriEnd extends DirectParserASTContent {
   final Token ifKeyword;
   final Token leftParen;
-  final Token equalSign;
+  final Token? equalSign;
 
   DirectParserASTContentConditionalUriEnd(DirectParserASTType type,
-      {this.ifKeyword, this.leftParen, this.equalSign})
+      {required this.ifKeyword, required this.leftParen, this.equalSign})
       : super("ConditionalUri", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "ifKeyword": ifKeyword,
         "leftParen": leftParen,
         "equalSign": equalSign,
@@ -4195,10 +4240,10 @@
   final Token firstIdentifier;
 
   DirectParserASTContentDottedNameHandle(DirectParserASTType type,
-      {this.count, this.firstIdentifier})
+      {required this.count, required this.firstIdentifier})
       : super("DottedName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "firstIdentifier": firstIdentifier,
       };
@@ -4210,10 +4255,10 @@
 
   DirectParserASTContentImplicitCreationExpressionBegin(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ImplicitCreationExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4223,10 +4268,10 @@
   final Token token;
 
   DirectParserASTContentImplicitCreationExpressionEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ImplicitCreationExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4236,10 +4281,10 @@
   final Token token;
 
   DirectParserASTContentInitializedIdentifierBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("InitializedIdentifier", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4249,10 +4294,10 @@
   final Token nameToken;
 
   DirectParserASTContentInitializedIdentifierEnd(DirectParserASTType type,
-      {this.nameToken})
+      {required this.nameToken})
       : super("InitializedIdentifier", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "nameToken": nameToken,
       };
 }
@@ -4262,10 +4307,10 @@
   final Token token;
 
   DirectParserASTContentFieldInitializerBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("FieldInitializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4275,10 +4320,10 @@
   final Token token;
 
   DirectParserASTContentFieldInitializerEnd(DirectParserASTType type,
-      {this.assignment, this.token})
+      {required this.assignment, required this.token})
       : super("FieldInitializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "assignment": assignment,
         "token": token,
       };
@@ -4289,10 +4334,10 @@
   final Token token;
 
   DirectParserASTContentNoFieldInitializerHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NoFieldInitializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4302,10 +4347,10 @@
   final Token token;
 
   DirectParserASTContentVariableInitializerBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("VariableInitializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4315,10 +4360,10 @@
   final Token assignmentOperator;
 
   DirectParserASTContentVariableInitializerEnd(DirectParserASTType type,
-      {this.assignmentOperator})
+      {required this.assignmentOperator})
       : super("VariableInitializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "assignmentOperator": assignmentOperator,
       };
 }
@@ -4328,10 +4373,10 @@
   final Token token;
 
   DirectParserASTContentNoVariableInitializerHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NoVariableInitializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4339,10 +4384,11 @@
 class DirectParserASTContentInitializerBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentInitializerBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentInitializerBegin(DirectParserASTType type,
+      {required this.token})
       : super("Initializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4350,10 +4396,11 @@
 class DirectParserASTContentInitializerEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentInitializerEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentInitializerEnd(DirectParserASTType type,
+      {required this.token})
       : super("Initializer", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4362,10 +4409,10 @@
   final Token token;
 
   DirectParserASTContentInitializersBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("Initializers", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4376,10 +4423,10 @@
   final Token endToken;
 
   DirectParserASTContentInitializersEnd(DirectParserASTType type,
-      {this.count, this.beginToken, this.endToken})
+      {required this.count, required this.beginToken, required this.endToken})
       : super("Initializers", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -4391,7 +4438,7 @@
   DirectParserASTContentNoInitializersHandle(DirectParserASTType type)
       : super("NoInitializers", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentInvalidExpressionHandle
@@ -4399,10 +4446,10 @@
   final Token token;
 
   DirectParserASTContentInvalidExpressionHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("InvalidExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4412,10 +4459,10 @@
   final Token token;
 
   DirectParserASTContentInvalidFunctionBodyHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("InvalidFunctionBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4425,10 +4472,10 @@
   final Token token;
 
   DirectParserASTContentInvalidTypeReferenceHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("InvalidTypeReference", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4436,10 +4483,11 @@
 class DirectParserASTContentLabelHandle extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentLabelHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentLabelHandle(DirectParserASTType type,
+      {required this.token})
       : super("Label", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4450,10 +4498,10 @@
   final int labelCount;
 
   DirectParserASTContentLabeledStatementBegin(DirectParserASTType type,
-      {this.token, this.labelCount})
+      {required this.token, required this.labelCount})
       : super("LabeledStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "labelCount": labelCount,
       };
@@ -4463,10 +4511,10 @@
   final int labelCount;
 
   DirectParserASTContentLabeledStatementEnd(DirectParserASTType type,
-      {this.labelCount})
+      {required this.labelCount})
       : super("LabeledStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "labelCount": labelCount,
       };
 }
@@ -4474,10 +4522,11 @@
 class DirectParserASTContentLibraryNameBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentLibraryNameBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentLibraryNameBegin(DirectParserASTType type,
+      {required this.token})
       : super("LibraryName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4487,10 +4536,10 @@
   final Token semicolon;
 
   DirectParserASTContentLibraryNameEnd(DirectParserASTType type,
-      {this.libraryKeyword, this.semicolon})
+      {required this.libraryKeyword, required this.semicolon})
       : super("LibraryName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "libraryKeyword": libraryKeyword,
         "semicolon": semicolon,
       };
@@ -4502,10 +4551,10 @@
   final Token endToken;
 
   DirectParserASTContentLiteralMapEntryHandle(DirectParserASTType type,
-      {this.colon, this.endToken})
+      {required this.colon, required this.endToken})
       : super("LiteralMapEntry", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "colon": colon,
         "endToken": endToken,
       };
@@ -4515,10 +4564,10 @@
   final Token token;
 
   DirectParserASTContentLiteralStringBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("LiteralString", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4526,13 +4575,13 @@
 class DirectParserASTContentInterpolationExpressionHandle
     extends DirectParserASTContent {
   final Token leftBracket;
-  final Token rightBracket;
+  final Token? rightBracket;
 
   DirectParserASTContentInterpolationExpressionHandle(DirectParserASTType type,
-      {this.leftBracket, this.rightBracket})
+      {required this.leftBracket, this.rightBracket})
       : super("InterpolationExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "leftBracket": leftBracket,
         "rightBracket": rightBracket,
       };
@@ -4543,10 +4592,10 @@
   final Token endToken;
 
   DirectParserASTContentLiteralStringEnd(DirectParserASTType type,
-      {this.interpolationCount, this.endToken})
+      {required this.interpolationCount, required this.endToken})
       : super("LiteralString", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "interpolationCount": interpolationCount,
         "endToken": endToken,
       };
@@ -4558,10 +4607,10 @@
   final int literalCount;
 
   DirectParserASTContentStringJuxtapositionHandle(DirectParserASTType type,
-      {this.startToken, this.literalCount})
+      {required this.startToken, required this.literalCount})
       : super("StringJuxtaposition", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "startToken": startToken,
         "literalCount": literalCount,
       };
@@ -4571,17 +4620,17 @@
   DirectParserASTContentMemberBegin(DirectParserASTType type)
       : super("Member", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentInvalidMemberHandle extends DirectParserASTContent {
   final Token endToken;
 
   DirectParserASTContentInvalidMemberHandle(DirectParserASTType type,
-      {this.endToken})
+      {required this.endToken})
       : super("InvalidMember", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "endToken": endToken,
       };
 }
@@ -4590,15 +4639,15 @@
   DirectParserASTContentMemberEnd(DirectParserASTType type)
       : super("Member", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentMethodBegin extends DirectParserASTContent {
-  final Token externalToken;
-  final Token staticToken;
-  final Token covariantToken;
-  final Token varFinalOrConst;
-  final Token getOrSet;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
+  final Token? getOrSet;
   final Token name;
 
   DirectParserASTContentMethodBegin(DirectParserASTType type,
@@ -4607,10 +4656,10 @@
       this.covariantToken,
       this.varFinalOrConst,
       this.getOrSet,
-      this.name})
+      required this.name})
       : super("Method", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "externalToken": externalToken,
         "staticToken": staticToken,
         "covariantToken": covariantToken,
@@ -4621,21 +4670,21 @@
 }
 
 class DirectParserASTContentClassMethodEnd extends DirectParserASTContent {
-  final Token getOrSet;
+  final Token? getOrSet;
   final Token beginToken;
   final Token beginParam;
-  final Token beginInitializers;
+  final Token? beginInitializers;
   final Token endToken;
 
   DirectParserASTContentClassMethodEnd(DirectParserASTType type,
       {this.getOrSet,
-      this.beginToken,
-      this.beginParam,
+      required this.beginToken,
+      required this.beginParam,
       this.beginInitializers,
-      this.endToken})
+      required this.endToken})
       : super("ClassMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "getOrSet": getOrSet,
         "beginToken": beginToken,
         "beginParam": beginParam,
@@ -4645,21 +4694,21 @@
 }
 
 class DirectParserASTContentMixinMethodEnd extends DirectParserASTContent {
-  final Token getOrSet;
+  final Token? getOrSet;
   final Token beginToken;
   final Token beginParam;
-  final Token beginInitializers;
+  final Token? beginInitializers;
   final Token endToken;
 
   DirectParserASTContentMixinMethodEnd(DirectParserASTType type,
       {this.getOrSet,
-      this.beginToken,
-      this.beginParam,
+      required this.beginToken,
+      required this.beginParam,
       this.beginInitializers,
-      this.endToken})
+      required this.endToken})
       : super("MixinMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "getOrSet": getOrSet,
         "beginToken": beginToken,
         "beginParam": beginParam,
@@ -4669,21 +4718,21 @@
 }
 
 class DirectParserASTContentExtensionMethodEnd extends DirectParserASTContent {
-  final Token getOrSet;
+  final Token? getOrSet;
   final Token beginToken;
   final Token beginParam;
-  final Token beginInitializers;
+  final Token? beginInitializers;
   final Token endToken;
 
   DirectParserASTContentExtensionMethodEnd(DirectParserASTType type,
       {this.getOrSet,
-      this.beginToken,
-      this.beginParam,
+      required this.beginToken,
+      required this.beginParam,
       this.beginInitializers,
-      this.endToken})
+      required this.endToken})
       : super("ExtensionMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "getOrSet": getOrSet,
         "beginToken": beginToken,
         "beginParam": beginParam,
@@ -4693,21 +4742,21 @@
 }
 
 class DirectParserASTContentClassConstructorEnd extends DirectParserASTContent {
-  final Token getOrSet;
+  final Token? getOrSet;
   final Token beginToken;
   final Token beginParam;
-  final Token beginInitializers;
+  final Token? beginInitializers;
   final Token endToken;
 
   DirectParserASTContentClassConstructorEnd(DirectParserASTType type,
       {this.getOrSet,
-      this.beginToken,
-      this.beginParam,
+      required this.beginToken,
+      required this.beginParam,
       this.beginInitializers,
-      this.endToken})
+      required this.endToken})
       : super("ClassConstructor", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "getOrSet": getOrSet,
         "beginToken": beginToken,
         "beginParam": beginParam,
@@ -4717,21 +4766,21 @@
 }
 
 class DirectParserASTContentMixinConstructorEnd extends DirectParserASTContent {
-  final Token getOrSet;
+  final Token? getOrSet;
   final Token beginToken;
   final Token beginParam;
-  final Token beginInitializers;
+  final Token? beginInitializers;
   final Token endToken;
 
   DirectParserASTContentMixinConstructorEnd(DirectParserASTType type,
       {this.getOrSet,
-      this.beginToken,
-      this.beginParam,
+      required this.beginToken,
+      required this.beginParam,
       this.beginInitializers,
-      this.endToken})
+      required this.endToken})
       : super("MixinConstructor", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "getOrSet": getOrSet,
         "beginToken": beginToken,
         "beginParam": beginParam,
@@ -4742,21 +4791,21 @@
 
 class DirectParserASTContentExtensionConstructorEnd
     extends DirectParserASTContent {
-  final Token getOrSet;
+  final Token? getOrSet;
   final Token beginToken;
   final Token beginParam;
-  final Token beginInitializers;
+  final Token? beginInitializers;
   final Token endToken;
 
   DirectParserASTContentExtensionConstructorEnd(DirectParserASTType type,
       {this.getOrSet,
-      this.beginToken,
-      this.beginParam,
+      required this.beginToken,
+      required this.beginParam,
       this.beginInitializers,
-      this.endToken})
+      required this.endToken})
       : super("ExtensionConstructor", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "getOrSet": getOrSet,
         "beginToken": beginToken,
         "beginParam": beginParam,
@@ -4769,10 +4818,10 @@
   final Token token;
 
   DirectParserASTContentMetadataStarBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("MetadataStar", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4780,10 +4829,11 @@
 class DirectParserASTContentMetadataStarEnd extends DirectParserASTContent {
   final int count;
 
-  DirectParserASTContentMetadataStarEnd(DirectParserASTType type, {this.count})
+  DirectParserASTContentMetadataStarEnd(DirectParserASTType type,
+      {required this.count})
       : super("MetadataStar", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
       };
 }
@@ -4791,24 +4841,25 @@
 class DirectParserASTContentMetadataBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentMetadataBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentMetadataBegin(DirectParserASTType type,
+      {required this.token})
       : super("Metadata", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
 
 class DirectParserASTContentMetadataEnd extends DirectParserASTContent {
   final Token beginToken;
-  final Token periodBeforeName;
+  final Token? periodBeforeName;
   final Token endToken;
 
   DirectParserASTContentMetadataEnd(DirectParserASTType type,
-      {this.beginToken, this.periodBeforeName, this.endToken})
+      {required this.beginToken, this.periodBeforeName, required this.endToken})
       : super("Metadata", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "periodBeforeName": periodBeforeName,
         "endToken": endToken,
@@ -4820,10 +4871,10 @@
   final Token token;
 
   DirectParserASTContentOptionalFormalParametersBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("OptionalFormalParameters", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4835,10 +4886,10 @@
   final Token endToken;
 
   DirectParserASTContentOptionalFormalParametersEnd(DirectParserASTType type,
-      {this.count, this.beginToken, this.endToken})
+      {required this.count, required this.beginToken, required this.endToken})
       : super("OptionalFormalParameters", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -4848,10 +4899,11 @@
 class DirectParserASTContentPartBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentPartBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentPartBegin(DirectParserASTType type,
+      {required this.token})
       : super("Part", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4861,10 +4913,10 @@
   final Token semicolon;
 
   DirectParserASTContentPartEnd(DirectParserASTType type,
-      {this.partKeyword, this.semicolon})
+      {required this.partKeyword, required this.semicolon})
       : super("Part", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "partKeyword": partKeyword,
         "semicolon": semicolon,
       };
@@ -4873,10 +4925,11 @@
 class DirectParserASTContentPartOfBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentPartOfBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentPartOfBegin(DirectParserASTType type,
+      {required this.token})
       : super("PartOf", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4888,10 +4941,13 @@
   final bool hasName;
 
   DirectParserASTContentPartOfEnd(DirectParserASTType type,
-      {this.partKeyword, this.ofKeyword, this.semicolon, this.hasName})
+      {required this.partKeyword,
+      required this.ofKeyword,
+      required this.semicolon,
+      required this.hasName})
       : super("PartOf", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "partKeyword": partKeyword,
         "ofKeyword": ofKeyword,
         "semicolon": semicolon,
@@ -4904,10 +4960,10 @@
   final Token token;
 
   DirectParserASTContentRedirectingFactoryBodyBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("RedirectingFactoryBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4918,10 +4974,10 @@
   final Token endToken;
 
   DirectParserASTContentRedirectingFactoryBodyEnd(DirectParserASTType type,
-      {this.beginToken, this.endToken})
+      {required this.beginToken, required this.endToken})
       : super("RedirectingFactoryBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "endToken": endToken,
       };
@@ -4932,10 +4988,10 @@
   final Token token;
 
   DirectParserASTContentReturnStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ReturnStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -4946,10 +5002,10 @@
   final Token semicolon;
 
   DirectParserASTContentNativeFunctionBodyHandle(DirectParserASTType type,
-      {this.nativeToken, this.semicolon})
+      {required this.nativeToken, required this.semicolon})
       : super("NativeFunctionBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "nativeToken": nativeToken,
         "semicolon": semicolon,
       };
@@ -4962,11 +5018,11 @@
 
   DirectParserASTContentNativeFunctionBodyIgnoredHandle(
       DirectParserASTType type,
-      {this.nativeToken,
-      this.semicolon})
+      {required this.nativeToken,
+      required this.semicolon})
       : super("NativeFunctionBodyIgnored", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "nativeToken": nativeToken,
         "semicolon": semicolon,
       };
@@ -4979,11 +5035,11 @@
 
   DirectParserASTContentNativeFunctionBodySkippedHandle(
       DirectParserASTType type,
-      {this.nativeToken,
-      this.semicolon})
+      {required this.nativeToken,
+      required this.semicolon})
       : super("NativeFunctionBodySkipped", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "nativeToken": nativeToken,
         "semicolon": semicolon,
       };
@@ -4994,10 +5050,10 @@
   final Token semicolon;
 
   DirectParserASTContentEmptyFunctionBodyHandle(DirectParserASTType type,
-      {this.semicolon})
+      {required this.semicolon})
       : super("EmptyFunctionBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "semicolon": semicolon,
       };
 }
@@ -5005,13 +5061,13 @@
 class DirectParserASTContentExpressionFunctionBodyHandle
     extends DirectParserASTContent {
   final Token arrowToken;
-  final Token endToken;
+  final Token? endToken;
 
   DirectParserASTContentExpressionFunctionBodyHandle(DirectParserASTType type,
-      {this.arrowToken, this.endToken})
+      {required this.arrowToken, this.endToken})
       : super("ExpressionFunctionBody", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "arrowToken": arrowToken,
         "endToken": endToken,
       };
@@ -5023,10 +5079,12 @@
   final Token endToken;
 
   DirectParserASTContentReturnStatementEnd(DirectParserASTType type,
-      {this.hasExpression, this.beginToken, this.endToken})
+      {required this.hasExpression,
+      required this.beginToken,
+      required this.endToken})
       : super("ReturnStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "hasExpression": hasExpression,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -5038,10 +5096,10 @@
   final Token endToken;
 
   DirectParserASTContentSendHandle(DirectParserASTType type,
-      {this.beginToken, this.endToken})
+      {required this.beginToken, required this.endToken})
       : super("Send", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "endToken": endToken,
       };
@@ -5050,10 +5108,11 @@
 class DirectParserASTContentShowBegin extends DirectParserASTContent {
   final Token showKeyword;
 
-  DirectParserASTContentShowBegin(DirectParserASTType type, {this.showKeyword})
+  DirectParserASTContentShowBegin(DirectParserASTType type,
+      {required this.showKeyword})
       : super("Show", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "showKeyword": showKeyword,
       };
 }
@@ -5061,10 +5120,11 @@
 class DirectParserASTContentShowEnd extends DirectParserASTContent {
   final Token showKeyword;
 
-  DirectParserASTContentShowEnd(DirectParserASTType type, {this.showKeyword})
+  DirectParserASTContentShowEnd(DirectParserASTType type,
+      {required this.showKeyword})
       : super("Show", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "showKeyword": showKeyword,
       };
 }
@@ -5074,10 +5134,10 @@
   final Token token;
 
   DirectParserASTContentSwitchStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("SwitchStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5087,10 +5147,10 @@
   final Token endToken;
 
   DirectParserASTContentSwitchStatementEnd(DirectParserASTType type,
-      {this.switchKeyword, this.endToken})
+      {required this.switchKeyword, required this.endToken})
       : super("SwitchStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "switchKeyword": switchKeyword,
         "endToken": endToken,
       };
@@ -5099,10 +5159,11 @@
 class DirectParserASTContentSwitchBlockBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentSwitchBlockBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentSwitchBlockBegin(DirectParserASTType type,
+      {required this.token})
       : super("SwitchBlock", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5113,10 +5174,12 @@
   final Token endToken;
 
   DirectParserASTContentSwitchBlockEnd(DirectParserASTType type,
-      {this.caseCount, this.beginToken, this.endToken})
+      {required this.caseCount,
+      required this.beginToken,
+      required this.endToken})
       : super("SwitchBlock", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "caseCount": caseCount,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -5127,10 +5190,10 @@
   final Token token;
 
   DirectParserASTContentLiteralSymbolBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("LiteralSymbol", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5140,10 +5203,10 @@
   final int identifierCount;
 
   DirectParserASTContentLiteralSymbolEnd(DirectParserASTType type,
-      {this.hashToken, this.identifierCount})
+      {required this.hashToken, required this.identifierCount})
       : super("LiteralSymbol", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "hashToken": hashToken,
         "identifierCount": identifierCount,
       };
@@ -5155,10 +5218,10 @@
   final Token endToken;
 
   DirectParserASTContentThrowExpressionHandle(DirectParserASTType type,
-      {this.throwToken, this.endToken})
+      {required this.throwToken, required this.endToken})
       : super("ThrowExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "throwToken": throwToken,
         "endToken": endToken,
       };
@@ -5169,10 +5232,10 @@
   final Token token;
 
   DirectParserASTContentRethrowStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("RethrowStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5182,10 +5245,10 @@
   final Token endToken;
 
   DirectParserASTContentRethrowStatementEnd(DirectParserASTType type,
-      {this.rethrowToken, this.endToken})
+      {required this.rethrowToken, required this.endToken})
       : super("RethrowStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "rethrowToken": rethrowToken,
         "endToken": endToken,
       };
@@ -5196,10 +5259,10 @@
   final Token nextToken;
 
   DirectParserASTContentTopLevelDeclarationEnd(DirectParserASTType type,
-      {this.nextToken})
+      {required this.nextToken})
       : super("TopLevelDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "nextToken": nextToken,
       };
 }
@@ -5210,10 +5273,10 @@
 
   DirectParserASTContentInvalidTopLevelDeclarationHandle(
       DirectParserASTType type,
-      {this.endToken})
+      {required this.endToken})
       : super("InvalidTopLevelDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "endToken": endToken,
       };
 }
@@ -5222,10 +5285,10 @@
   final Token token;
 
   DirectParserASTContentTopLevelMemberBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("TopLevelMember", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5234,20 +5297,20 @@
   final Token lastConsumed;
 
   DirectParserASTContentFieldsBegin(DirectParserASTType type,
-      {this.lastConsumed})
+      {required this.lastConsumed})
       : super("Fields", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "lastConsumed": lastConsumed,
       };
 }
 
 class DirectParserASTContentTopLevelFieldsEnd extends DirectParserASTContent {
-  final Token externalToken;
-  final Token staticToken;
-  final Token covariantToken;
-  final Token lateToken;
-  final Token varFinalOrConst;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
   final int count;
   final Token beginToken;
   final Token endToken;
@@ -5258,12 +5321,12 @@
       this.covariantToken,
       this.lateToken,
       this.varFinalOrConst,
-      this.count,
-      this.beginToken,
-      this.endToken})
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
       : super("TopLevelFields", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "externalToken": externalToken,
         "staticToken": staticToken,
         "covariantToken": covariantToken,
@@ -5277,13 +5340,13 @@
 
 class DirectParserASTContentTopLevelMethodBegin extends DirectParserASTContent {
   final Token lastConsumed;
-  final Token externalToken;
+  final Token? externalToken;
 
   DirectParserASTContentTopLevelMethodBegin(DirectParserASTType type,
-      {this.lastConsumed, this.externalToken})
+      {required this.lastConsumed, this.externalToken})
       : super("TopLevelMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "lastConsumed": lastConsumed,
         "externalToken": externalToken,
       };
@@ -5291,14 +5354,14 @@
 
 class DirectParserASTContentTopLevelMethodEnd extends DirectParserASTContent {
   final Token beginToken;
-  final Token getOrSet;
+  final Token? getOrSet;
   final Token endToken;
 
   DirectParserASTContentTopLevelMethodEnd(DirectParserASTType type,
-      {this.beginToken, this.getOrSet, this.endToken})
+      {required this.beginToken, this.getOrSet, required this.endToken})
       : super("TopLevelMethod", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "getOrSet": getOrSet,
         "endToken": endToken,
@@ -5309,10 +5372,10 @@
   final Token token;
 
   DirectParserASTContentTryStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("TryStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5322,10 +5385,10 @@
   final Token colon;
 
   DirectParserASTContentCaseMatchHandle(DirectParserASTType type,
-      {this.caseKeyword, this.colon})
+      {required this.caseKeyword, required this.colon})
       : super("CaseMatch", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "caseKeyword": caseKeyword,
         "colon": colon,
       };
@@ -5334,10 +5397,11 @@
 class DirectParserASTContentCatchClauseBegin extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentCatchClauseBegin(DirectParserASTType type, {this.token})
+  DirectParserASTContentCatchClauseBegin(DirectParserASTType type,
+      {required this.token})
       : super("CatchClause", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5345,24 +5409,25 @@
 class DirectParserASTContentCatchClauseEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentCatchClauseEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentCatchClauseEnd(DirectParserASTType type,
+      {required this.token})
       : super("CatchClause", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
 
 class DirectParserASTContentCatchBlockHandle extends DirectParserASTContent {
-  final Token onKeyword;
-  final Token catchKeyword;
-  final Token comma;
+  final Token? onKeyword;
+  final Token? catchKeyword;
+  final Token? comma;
 
   DirectParserASTContentCatchBlockHandle(DirectParserASTType type,
       {this.onKeyword, this.catchKeyword, this.comma})
       : super("CatchBlock", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "onKeyword": onKeyword,
         "catchKeyword": catchKeyword,
         "comma": comma,
@@ -5373,10 +5438,10 @@
   final Token finallyKeyword;
 
   DirectParserASTContentFinallyBlockHandle(DirectParserASTType type,
-      {this.finallyKeyword})
+      {required this.finallyKeyword})
       : super("FinallyBlock", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "finallyKeyword": finallyKeyword,
       };
 }
@@ -5384,13 +5449,13 @@
 class DirectParserASTContentTryStatementEnd extends DirectParserASTContent {
   final int catchCount;
   final Token tryKeyword;
-  final Token finallyKeyword;
+  final Token? finallyKeyword;
 
   DirectParserASTContentTryStatementEnd(DirectParserASTType type,
-      {this.catchCount, this.tryKeyword, this.finallyKeyword})
+      {required this.catchCount, required this.tryKeyword, this.finallyKeyword})
       : super("TryStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "catchCount": catchCount,
         "tryKeyword": tryKeyword,
         "finallyKeyword": finallyKeyword,
@@ -5399,13 +5464,13 @@
 
 class DirectParserASTContentTypeHandle extends DirectParserASTContent {
   final Token beginToken;
-  final Token questionMark;
+  final Token? questionMark;
 
   DirectParserASTContentTypeHandle(DirectParserASTType type,
-      {this.beginToken, this.questionMark})
+      {required this.beginToken, this.questionMark})
       : super("Type", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "questionMark": questionMark,
       };
@@ -5416,10 +5481,10 @@
   final Token bang;
 
   DirectParserASTContentNonNullAssertExpressionHandle(DirectParserASTType type,
-      {this.bang})
+      {required this.bang})
       : super("NonNullAssertExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "bang": bang,
       };
 }
@@ -5427,10 +5492,11 @@
 class DirectParserASTContentNoNameHandle extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentNoNameHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentNoNameHandle(DirectParserASTType type,
+      {required this.token})
       : super("NoName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5439,23 +5505,23 @@
   final Token beginToken;
 
   DirectParserASTContentFunctionTypeBegin(DirectParserASTType type,
-      {this.beginToken})
+      {required this.beginToken})
       : super("FunctionType", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
       };
 }
 
 class DirectParserASTContentFunctionTypeEnd extends DirectParserASTContent {
   final Token functionToken;
-  final Token questionMark;
+  final Token? questionMark;
 
   DirectParserASTContentFunctionTypeEnd(DirectParserASTType type,
-      {this.functionToken, this.questionMark})
+      {required this.functionToken, this.questionMark})
       : super("FunctionType", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "functionToken": functionToken,
         "questionMark": questionMark,
       };
@@ -5465,10 +5531,10 @@
   final Token token;
 
   DirectParserASTContentTypeArgumentsBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("TypeArguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5479,10 +5545,10 @@
   final Token endToken;
 
   DirectParserASTContentTypeArgumentsEnd(DirectParserASTType type,
-      {this.count, this.beginToken, this.endToken})
+      {required this.count, required this.beginToken, required this.endToken})
       : super("TypeArguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "beginToken": beginToken,
         "endToken": endToken,
@@ -5494,10 +5560,10 @@
   final Token token;
 
   DirectParserASTContentInvalidTypeArgumentsHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("InvalidTypeArguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5507,10 +5573,10 @@
   final Token token;
 
   DirectParserASTContentNoTypeArgumentsHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NoTypeArguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5519,10 +5585,10 @@
   final Token token;
 
   DirectParserASTContentTypeVariableBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("TypeVariable", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5533,10 +5599,10 @@
   final int count;
 
   DirectParserASTContentTypeVariablesDefinedHandle(DirectParserASTType type,
-      {this.token, this.count})
+      {required this.token, required this.count})
       : super("TypeVariablesDefined", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "count": count,
       };
@@ -5545,14 +5611,17 @@
 class DirectParserASTContentTypeVariableEnd extends DirectParserASTContent {
   final Token token;
   final int index;
-  final Token extendsOrSuper;
-  final Token variance;
+  final Token? extendsOrSuper;
+  final Token? variance;
 
   DirectParserASTContentTypeVariableEnd(DirectParserASTType type,
-      {this.token, this.index, this.extendsOrSuper, this.variance})
+      {required this.token,
+      required this.index,
+      this.extendsOrSuper,
+      this.variance})
       : super("TypeVariable", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "index": index,
         "extendsOrSuper": extendsOrSuper,
@@ -5564,10 +5633,10 @@
   final Token token;
 
   DirectParserASTContentTypeVariablesBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("TypeVariables", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5577,10 +5646,10 @@
   final Token endToken;
 
   DirectParserASTContentTypeVariablesEnd(DirectParserASTType type,
-      {this.beginToken, this.endToken})
+      {required this.beginToken, required this.endToken})
       : super("TypeVariables", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "endToken": endToken,
       };
@@ -5591,10 +5660,10 @@
   final Token token;
 
   DirectParserASTContentFunctionExpressionBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("FunctionExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5605,10 +5674,10 @@
   final Token token;
 
   DirectParserASTContentFunctionExpressionEnd(DirectParserASTType type,
-      {this.beginToken, this.token})
+      {required this.beginToken, required this.token})
       : super("FunctionExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "token": token,
       };
@@ -5617,14 +5686,14 @@
 class DirectParserASTContentVariablesDeclarationBegin
     extends DirectParserASTContent {
   final Token token;
-  final Token lateToken;
-  final Token varFinalOrConst;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
 
   DirectParserASTContentVariablesDeclarationBegin(DirectParserASTType type,
-      {this.token, this.lateToken, this.varFinalOrConst})
+      {required this.token, this.lateToken, this.varFinalOrConst})
       : super("VariablesDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "lateToken": lateToken,
         "varFinalOrConst": varFinalOrConst,
@@ -5634,13 +5703,13 @@
 class DirectParserASTContentVariablesDeclarationEnd
     extends DirectParserASTContent {
   final int count;
-  final Token endToken;
+  final Token? endToken;
 
   DirectParserASTContentVariablesDeclarationEnd(DirectParserASTType type,
-      {this.count, this.endToken})
+      {required this.count, this.endToken})
       : super("VariablesDeclaration", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "endToken": endToken,
       };
@@ -5650,10 +5719,10 @@
   final Token token;
 
   DirectParserASTContentWhileStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("WhileStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5663,10 +5732,10 @@
   final Token endToken;
 
   DirectParserASTContentWhileStatementEnd(DirectParserASTType type,
-      {this.whileKeyword, this.endToken})
+      {required this.whileKeyword, required this.endToken})
       : super("WhileStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "whileKeyword": whileKeyword,
         "endToken": endToken,
       };
@@ -5676,10 +5745,10 @@
   final Token operator;
 
   DirectParserASTContentAsOperatorTypeBegin(DirectParserASTType type,
-      {this.operator})
+      {required this.operator})
       : super("AsOperatorType", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "operator": operator,
       };
 }
@@ -5688,10 +5757,10 @@
   final Token operator;
 
   DirectParserASTContentAsOperatorTypeEnd(DirectParserASTType type,
-      {this.operator})
+      {required this.operator})
       : super("AsOperatorType", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "operator": operator,
       };
 }
@@ -5700,10 +5769,10 @@
   final Token operator;
 
   DirectParserASTContentAsOperatorHandle(DirectParserASTType type,
-      {this.operator})
+      {required this.operator})
       : super("AsOperator", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "operator": operator,
       };
 }
@@ -5713,10 +5782,10 @@
   final Token token;
 
   DirectParserASTContentAssignmentExpressionHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("AssignmentExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5726,10 +5795,10 @@
   final Token token;
 
   DirectParserASTContentBinaryExpressionBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("BinaryExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5738,10 +5807,10 @@
   final Token token;
 
   DirectParserASTContentBinaryExpressionEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("BinaryExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5751,10 +5820,10 @@
   final Token token;
 
   DirectParserASTContentEndingBinaryExpressionHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("EndingBinaryExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5764,10 +5833,10 @@
   final Token question;
 
   DirectParserASTContentConditionalExpressionBegin(DirectParserASTType type,
-      {this.question})
+      {required this.question})
       : super("ConditionalExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "question": question,
       };
 }
@@ -5778,7 +5847,7 @@
       DirectParserASTType type)
       : super("ConditionalExpressionColon", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentConditionalExpressionEnd
@@ -5787,10 +5856,10 @@
   final Token colon;
 
   DirectParserASTContentConditionalExpressionEnd(DirectParserASTType type,
-      {this.question, this.colon})
+      {required this.question, required this.colon})
       : super("ConditionalExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "question": question,
         "colon": colon,
       };
@@ -5801,10 +5870,10 @@
   final Token constKeyword;
 
   DirectParserASTContentConstExpressionBegin(DirectParserASTType type,
-      {this.constKeyword})
+      {required this.constKeyword})
       : super("ConstExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "constKeyword": constKeyword,
       };
 }
@@ -5813,10 +5882,10 @@
   final Token token;
 
   DirectParserASTContentConstExpressionEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ConstExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5825,23 +5894,23 @@
   final Token constKeyword;
 
   DirectParserASTContentConstFactoryHandle(DirectParserASTType type,
-      {this.constKeyword})
+      {required this.constKeyword})
       : super("ConstFactory", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "constKeyword": constKeyword,
       };
 }
 
 class DirectParserASTContentForControlFlowBegin extends DirectParserASTContent {
-  final Token awaitToken;
+  final Token? awaitToken;
   final Token forToken;
 
   DirectParserASTContentForControlFlowBegin(DirectParserASTType type,
-      {this.awaitToken, this.forToken})
+      {this.awaitToken, required this.forToken})
       : super("ForControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "awaitToken": awaitToken,
         "forToken": forToken,
       };
@@ -5851,10 +5920,10 @@
   final Token token;
 
   DirectParserASTContentForControlFlowEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5863,10 +5932,10 @@
   final Token token;
 
   DirectParserASTContentForInControlFlowEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ForInControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5875,10 +5944,10 @@
   final Token ifToken;
 
   DirectParserASTContentIfControlFlowBegin(DirectParserASTType type,
-      {this.ifToken})
+      {required this.ifToken})
       : super("IfControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "ifToken": ifToken,
       };
 }
@@ -5888,10 +5957,10 @@
   final Token token;
 
   DirectParserASTContentThenControlFlowHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ThenControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5901,10 +5970,10 @@
   final Token elseToken;
 
   DirectParserASTContentElseControlFlowHandle(DirectParserASTType type,
-      {this.elseToken})
+      {required this.elseToken})
       : super("ElseControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "elseToken": elseToken,
       };
 }
@@ -5912,10 +5981,11 @@
 class DirectParserASTContentIfControlFlowEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentIfControlFlowEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentIfControlFlowEnd(DirectParserASTType type,
+      {required this.token})
       : super("IfControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5925,10 +5995,10 @@
   final Token token;
 
   DirectParserASTContentIfElseControlFlowEnd(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("IfElseControlFlow", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5938,10 +6008,10 @@
   final Token spreadToken;
 
   DirectParserASTContentSpreadExpressionHandle(DirectParserASTType type,
-      {this.spreadToken})
+      {required this.spreadToken})
       : super("SpreadExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "spreadToken": spreadToken,
       };
 }
@@ -5952,10 +6022,10 @@
 
   DirectParserASTContentFunctionTypedFormalParameterBegin(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("FunctionTypedFormalParameter", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -5963,15 +6033,15 @@
 class DirectParserASTContentFunctionTypedFormalParameterEnd
     extends DirectParserASTContent {
   final Token nameToken;
-  final Token question;
+  final Token? question;
 
   DirectParserASTContentFunctionTypedFormalParameterEnd(
       DirectParserASTType type,
-      {this.nameToken,
+      {required this.nameToken,
       this.question})
       : super("FunctionTypedFormalParameter", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "nameToken": nameToken,
         "question": question,
       };
@@ -5982,10 +6052,10 @@
   final IdentifierContext context;
 
   DirectParserASTContentIdentifierHandle(DirectParserASTType type,
-      {this.token, this.context})
+      {required this.token, required this.context})
       : super("Identifier", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "context": context,
       };
@@ -5993,15 +6063,17 @@
 
 class DirectParserASTContentIndexedExpressionHandle
     extends DirectParserASTContent {
-  final Token question;
+  final Token? question;
   final Token openSquareBracket;
   final Token closeSquareBracket;
 
   DirectParserASTContentIndexedExpressionHandle(DirectParserASTType type,
-      {this.question, this.openSquareBracket, this.closeSquareBracket})
+      {this.question,
+      required this.openSquareBracket,
+      required this.closeSquareBracket})
       : super("IndexedExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "question": question,
         "openSquareBracket": openSquareBracket,
         "closeSquareBracket": closeSquareBracket,
@@ -6012,10 +6084,10 @@
   final Token operator;
 
   DirectParserASTContentIsOperatorTypeBegin(DirectParserASTType type,
-      {this.operator})
+      {required this.operator})
       : super("IsOperatorType", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "operator": operator,
       };
 }
@@ -6024,23 +6096,23 @@
   final Token operator;
 
   DirectParserASTContentIsOperatorTypeEnd(DirectParserASTType type,
-      {this.operator})
+      {required this.operator})
       : super("IsOperatorType", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "operator": operator,
       };
 }
 
 class DirectParserASTContentIsOperatorHandle extends DirectParserASTContent {
   final Token isOperator;
-  final Token not;
+  final Token? not;
 
   DirectParserASTContentIsOperatorHandle(DirectParserASTType type,
-      {this.isOperator, this.not})
+      {required this.isOperator, this.not})
       : super("IsOperator", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "isOperator": isOperator,
         "not": not,
       };
@@ -6050,10 +6122,10 @@
   final Token token;
 
   DirectParserASTContentLiteralBoolHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("LiteralBool", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6065,10 +6137,12 @@
   final Token endToken;
 
   DirectParserASTContentBreakStatementHandle(DirectParserASTType type,
-      {this.hasTarget, this.breakKeyword, this.endToken})
+      {required this.hasTarget,
+      required this.breakKeyword,
+      required this.endToken})
       : super("BreakStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "hasTarget": hasTarget,
         "breakKeyword": breakKeyword,
         "endToken": endToken,
@@ -6082,10 +6156,12 @@
   final Token endToken;
 
   DirectParserASTContentContinueStatementHandle(DirectParserASTType type,
-      {this.hasTarget, this.continueKeyword, this.endToken})
+      {required this.hasTarget,
+      required this.continueKeyword,
+      required this.endToken})
       : super("ContinueStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "hasTarget": hasTarget,
         "continueKeyword": continueKeyword,
         "endToken": endToken,
@@ -6097,10 +6173,10 @@
   final Token token;
 
   DirectParserASTContentEmptyStatementHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("EmptyStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6110,10 +6186,10 @@
   final Assert kind;
 
   DirectParserASTContentAssertBegin(DirectParserASTType type,
-      {this.assertKeyword, this.kind})
+      {required this.assertKeyword, required this.kind})
       : super("Assert", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "assertKeyword": assertKeyword,
         "kind": kind,
       };
@@ -6123,18 +6199,18 @@
   final Token assertKeyword;
   final Assert kind;
   final Token leftParenthesis;
-  final Token commaToken;
+  final Token? commaToken;
   final Token semicolonToken;
 
   DirectParserASTContentAssertEnd(DirectParserASTType type,
-      {this.assertKeyword,
-      this.kind,
-      this.leftParenthesis,
+      {required this.assertKeyword,
+      required this.kind,
+      required this.leftParenthesis,
       this.commaToken,
-      this.semicolonToken})
+      required this.semicolonToken})
       : super("Assert", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "assertKeyword": assertKeyword,
         "kind": kind,
         "leftParenthesis": leftParenthesis,
@@ -6147,10 +6223,10 @@
   final Token token;
 
   DirectParserASTContentLiteralDoubleHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("LiteralDouble", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6158,10 +6234,11 @@
 class DirectParserASTContentLiteralIntHandle extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentLiteralIntHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentLiteralIntHandle(DirectParserASTType type,
+      {required this.token})
       : super("LiteralInt", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6169,14 +6246,17 @@
 class DirectParserASTContentLiteralListHandle extends DirectParserASTContent {
   final int count;
   final Token leftBracket;
-  final Token constKeyword;
+  final Token? constKeyword;
   final Token rightBracket;
 
   DirectParserASTContentLiteralListHandle(DirectParserASTType type,
-      {this.count, this.leftBracket, this.constKeyword, this.rightBracket})
+      {required this.count,
+      required this.leftBracket,
+      this.constKeyword,
+      required this.rightBracket})
       : super("LiteralList", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "leftBracket": leftBracket,
         "constKeyword": constKeyword,
@@ -6188,19 +6268,19 @@
     extends DirectParserASTContent {
   final int count;
   final Token leftBrace;
-  final Token constKeyword;
+  final Token? constKeyword;
   final Token rightBrace;
   final bool hasSetEntry;
 
   DirectParserASTContentLiteralSetOrMapHandle(DirectParserASTType type,
-      {this.count,
-      this.leftBrace,
+      {required this.count,
+      required this.leftBrace,
       this.constKeyword,
-      this.rightBrace,
-      this.hasSetEntry})
+      required this.rightBrace,
+      required this.hasSetEntry})
       : super("LiteralSetOrMap", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "count": count,
         "leftBrace": leftBrace,
         "constKeyword": constKeyword,
@@ -6213,10 +6293,10 @@
   final Token token;
 
   DirectParserASTContentLiteralNullHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("LiteralNull", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6226,10 +6306,10 @@
   final bool hasName;
 
   DirectParserASTContentNativeClauseHandle(DirectParserASTType type,
-      {this.nativeToken, this.hasName})
+      {required this.nativeToken, required this.hasName})
       : super("NativeClause", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "nativeToken": nativeToken,
         "hasName": hasName,
       };
@@ -6239,10 +6319,10 @@
   final Token colon;
 
   DirectParserASTContentNamedArgumentHandle(DirectParserASTType type,
-      {this.colon})
+      {required this.colon})
       : super("NamedArgument", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "colon": colon,
       };
 }
@@ -6251,10 +6331,10 @@
   final Token token;
 
   DirectParserASTContentNewExpressionBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NewExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6262,10 +6342,11 @@
 class DirectParserASTContentNewExpressionEnd extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentNewExpressionEnd(DirectParserASTType type, {this.token})
+  DirectParserASTContentNewExpressionEnd(DirectParserASTType type,
+      {required this.token})
       : super("NewExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6274,10 +6355,10 @@
   final Token token;
 
   DirectParserASTContentNoArgumentsHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NoArguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6288,10 +6369,10 @@
 
   DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NoConstructorReferenceContinuationAfterTypeArguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6300,10 +6381,10 @@
   final Token lastConsumed;
 
   DirectParserASTContentNoTypeHandle(DirectParserASTType type,
-      {this.lastConsumed})
+      {required this.lastConsumed})
       : super("NoType", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "lastConsumed": lastConsumed,
       };
 }
@@ -6313,10 +6394,10 @@
   final Token token;
 
   DirectParserASTContentNoTypeVariablesHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("NoTypeVariables", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6324,10 +6405,11 @@
 class DirectParserASTContentOperatorHandle extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentOperatorHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentOperatorHandle(DirectParserASTType type,
+      {required this.token})
       : super("Operator", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6335,10 +6417,11 @@
 class DirectParserASTContentSymbolVoidHandle extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentSymbolVoidHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentSymbolVoidHandle(DirectParserASTType type,
+      {required this.token})
       : super("SymbolVoid", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6348,10 +6431,10 @@
   final Token token;
 
   DirectParserASTContentOperatorNameHandle(DirectParserASTType type,
-      {this.operatorKeyword, this.token})
+      {required this.operatorKeyword, required this.token})
       : super("OperatorName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "operatorKeyword": operatorKeyword,
         "token": token,
       };
@@ -6363,10 +6446,10 @@
   final Token token;
 
   DirectParserASTContentInvalidOperatorNameHandle(DirectParserASTType type,
-      {this.operatorKeyword, this.token})
+      {required this.operatorKeyword, required this.token})
       : super("InvalidOperatorName", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "operatorKeyword": operatorKeyword,
         "token": token,
       };
@@ -6377,10 +6460,10 @@
   final Token token;
 
   DirectParserASTContentParenthesizedConditionHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ParenthesizedCondition", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6390,10 +6473,10 @@
   final Token token;
 
   DirectParserASTContentParenthesizedExpressionHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("ParenthesizedExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6401,10 +6484,11 @@
 class DirectParserASTContentQualifiedHandle extends DirectParserASTContent {
   final Token period;
 
-  DirectParserASTContentQualifiedHandle(DirectParserASTType type, {this.period})
+  DirectParserASTContentQualifiedHandle(DirectParserASTType type,
+      {required this.period})
       : super("Qualified", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "period": period,
       };
 }
@@ -6412,10 +6496,11 @@
 class DirectParserASTContentStringPartHandle extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentStringPartHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentStringPartHandle(DirectParserASTType type,
+      {required this.token})
       : super("StringPart", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6426,10 +6511,10 @@
   final IdentifierContext context;
 
   DirectParserASTContentSuperExpressionHandle(DirectParserASTType type,
-      {this.token, this.context})
+      {required this.token, required this.context})
       : super("SuperExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "context": context,
       };
@@ -6441,10 +6526,12 @@
   final Token firstToken;
 
   DirectParserASTContentSwitchCaseBegin(DirectParserASTType type,
-      {this.labelCount, this.expressionCount, this.firstToken})
+      {required this.labelCount,
+      required this.expressionCount,
+      required this.firstToken})
       : super("SwitchCase", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "labelCount": labelCount,
         "expressionCount": expressionCount,
         "firstToken": firstToken,
@@ -6454,23 +6541,23 @@
 class DirectParserASTContentSwitchCaseEnd extends DirectParserASTContent {
   final int labelCount;
   final int expressionCount;
-  final Token defaultKeyword;
-  final Token colonAfterDefault;
+  final Token? defaultKeyword;
+  final Token? colonAfterDefault;
   final int statementCount;
   final Token firstToken;
   final Token endToken;
 
   DirectParserASTContentSwitchCaseEnd(DirectParserASTType type,
-      {this.labelCount,
-      this.expressionCount,
+      {required this.labelCount,
+      required this.expressionCount,
       this.defaultKeyword,
       this.colonAfterDefault,
-      this.statementCount,
-      this.firstToken,
-      this.endToken})
+      required this.statementCount,
+      required this.firstToken,
+      required this.endToken})
       : super("SwitchCase", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "labelCount": labelCount,
         "expressionCount": expressionCount,
         "defaultKeyword": defaultKeyword,
@@ -6487,10 +6574,10 @@
   final IdentifierContext context;
 
   DirectParserASTContentThisExpressionHandle(DirectParserASTType type,
-      {this.token, this.context})
+      {required this.token, required this.context})
       : super("ThisExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "context": context,
       };
@@ -6502,10 +6589,10 @@
 
   DirectParserASTContentUnaryPostfixAssignmentExpressionHandle(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("UnaryPostfixAssignmentExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6515,10 +6602,10 @@
   final Token token;
 
   DirectParserASTContentUnaryPrefixExpressionHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("UnaryPrefixExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6529,10 +6616,10 @@
 
   DirectParserASTContentUnaryPrefixAssignmentExpressionHandle(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("UnaryPrefixAssignmentExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6543,7 +6630,7 @@
       DirectParserASTType type)
       : super("FormalParameterDefaultValueExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentFormalParameterDefaultValueExpressionEnd
@@ -6552,7 +6639,7 @@
       DirectParserASTType type)
       : super("FormalParameterDefaultValueExpression", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
 
 class DirectParserASTContentValuedFormalParameterHandle
@@ -6561,10 +6648,10 @@
   final Token token;
 
   DirectParserASTContentValuedFormalParameterHandle(DirectParserASTType type,
-      {this.equals, this.token})
+      {required this.equals, required this.token})
       : super("ValuedFormalParameter", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "equals": equals,
         "token": token,
       };
@@ -6576,10 +6663,10 @@
 
   DirectParserASTContentFormalParameterWithoutValueHandle(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("FormalParameterWithoutValue", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6588,10 +6675,10 @@
   final Token token;
 
   DirectParserASTContentVoidKeywordHandle(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("VoidKeyword", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6602,10 +6689,10 @@
 
   DirectParserASTContentVoidKeywordWithTypeArgumentsHandle(
       DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("VoidKeywordWithTypeArguments", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6614,24 +6701,24 @@
   final Token token;
 
   DirectParserASTContentYieldStatementBegin(DirectParserASTType type,
-      {this.token})
+      {required this.token})
       : super("YieldStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
 
 class DirectParserASTContentYieldStatementEnd extends DirectParserASTContent {
   final Token yieldToken;
-  final Token starToken;
+  final Token? starToken;
   final Token endToken;
 
   DirectParserASTContentYieldStatementEnd(DirectParserASTType type,
-      {this.yieldToken, this.starToken, this.endToken})
+      {required this.yieldToken, this.starToken, required this.endToken})
       : super("YieldStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "yieldToken": yieldToken,
         "starToken": starToken,
         "endToken": endToken,
@@ -6641,15 +6728,18 @@
 class DirectParserASTContentInvalidYieldStatementEnd
     extends DirectParserASTContent {
   final Token beginToken;
-  final Token starToken;
+  final Token? starToken;
   final Token endToken;
   final MessageCode errorCode;
 
   DirectParserASTContentInvalidYieldStatementEnd(DirectParserASTType type,
-      {this.beginToken, this.starToken, this.endToken, this.errorCode})
+      {required this.beginToken,
+      this.starToken,
+      required this.endToken,
+      required this.errorCode})
       : super("InvalidYieldStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "beginToken": beginToken,
         "starToken": starToken,
         "endToken": endToken,
@@ -6664,10 +6754,10 @@
   final Token endToken;
 
   DirectParserASTContentRecoverableErrorHandle(DirectParserASTType type,
-      {this.message, this.startToken, this.endToken})
+      {required this.message, required this.startToken, required this.endToken})
       : super("RecoverableError", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "message": message,
         "startToken": startToken,
         "endToken": endToken,
@@ -6677,10 +6767,11 @@
 class DirectParserASTContentErrorTokenHandle extends DirectParserASTContent {
   final ErrorToken token;
 
-  DirectParserASTContentErrorTokenHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentErrorTokenHandle(DirectParserASTType type,
+      {required this.token})
       : super("ErrorToken", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6692,10 +6783,13 @@
   final int length;
 
   DirectParserASTContentUnescapeErrorHandle(DirectParserASTType type,
-      {this.message, this.location, this.stringOffset, this.length})
+      {required this.message,
+      required this.location,
+      required this.stringOffset,
+      required this.length})
       : super("UnescapeError", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "message": message,
         "location": location,
         "stringOffset": stringOffset,
@@ -6709,10 +6803,10 @@
   final Message message;
 
   DirectParserASTContentInvalidStatementHandle(DirectParserASTType type,
-      {this.token, this.message})
+      {required this.token, required this.message})
       : super("InvalidStatement", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
         "message": message,
       };
@@ -6721,10 +6815,11 @@
 class DirectParserASTContentScriptHandle extends DirectParserASTContent {
   final Token token;
 
-  DirectParserASTContentScriptHandle(DirectParserASTType type, {this.token})
+  DirectParserASTContentScriptHandle(DirectParserASTType type,
+      {required this.token})
       : super("Script", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "token": token,
       };
 }
@@ -6735,10 +6830,10 @@
   final int referenceOffset;
 
   DirectParserASTContentCommentReferenceTextHandle(DirectParserASTType type,
-      {this.referenceSource, this.referenceOffset})
+      {required this.referenceSource, required this.referenceOffset})
       : super("CommentReferenceText", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "referenceSource": referenceSource,
         "referenceOffset": referenceOffset,
       };
@@ -6746,16 +6841,16 @@
 
 class DirectParserASTContentCommentReferenceHandle
     extends DirectParserASTContent {
-  final Token newKeyword;
-  final Token prefix;
-  final Token period;
+  final Token? newKeyword;
+  final Token? prefix;
+  final Token? period;
   final Token token;
 
   DirectParserASTContentCommentReferenceHandle(DirectParserASTType type,
-      {this.newKeyword, this.prefix, this.period, this.token})
+      {this.newKeyword, this.prefix, this.period, required this.token})
       : super("CommentReference", type);
 
-  Map<String, Object> get deprecatedArguments => {
+  Map<String, Object?> get deprecatedArguments => {
         "newKeyword": newKeyword,
         "prefix": prefix,
         "period": period,
@@ -6768,5 +6863,5 @@
   DirectParserASTContentNoCommentReferenceHandle(DirectParserASTType type)
       : super("NoCommentReference", type);
 
-  Map<String, Object> get deprecatedArguments => {};
+  Map<String, Object?> get deprecatedArguments => {};
 }
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml b/pkg/front_end/testcases/incremental/regress_46004.yaml
new file mode 100644
index 0000000..115477f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml
@@ -0,0 +1,35 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: non-nullable
+    sources:
+      main.dart: |
+        import 'dart:ffi';
+        import 'lib.dart';
+        class X extends Struct {
+          external COMObject xx;
+        }
+      lib.dart: |
+        import 'dart:ffi';
+
+        class COMObject extends Struct {
+          external Pointer<IntPtr> lpVtbl;
+
+          // This should not be interpreted as a native field.
+          // Neither the first nor the second compilation.
+          Pointer<IntPtr> get vtable => Pointer.fromAddress(lpVtbl.value);
+        }
+    expectedLibraryCount: 2
+
+  - entry: main.dart
+    experiments: non-nullable
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
new file mode 100644
index 0000000..7918e0b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
@@ -0,0 +1,68 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C6
+  class COMObject extends dart.ffi::Struct {
+    synthetic constructor •() → lib::COMObject
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::COMObject
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get lpVtbl() → dart.ffi::Pointer<dart.ffi::IntPtr>
+      return dart.ffi::_fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi())));
+    set lpVtbl(dart.ffi::Pointer<dart.ffi::IntPtr> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::Pointer::address});
+    get vtable() → dart.ffi::Pointer<dart.ffi::IntPtr>
+      return dart.ffi::Pointer::fromAddress<dart.ffi::IntPtr>(dart.ffi::IntPtrPointer|get#value(this.{lib::COMObject::lpVtbl}));
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C17
+  class X extends dart.ffi::Struct {
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get xx() → lib::COMObject
+      return new lib::COMObject::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C8).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::COMObject>(#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::COMObject #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C7, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C3 = <dart.core::Type>[#C2]
+  #C4 = null
+  #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
+  #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}
+  #C11 = 8
+  #C12 = 4
+  #C13 = <dart.core::int*>[#C11, #C12, #C12]
+  #C14 = TypeLiteralConstant(lib::COMObject)
+  #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/regress_46004.yaml.world.2.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
new file mode 100644
index 0000000..7918e0b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
@@ -0,0 +1,68 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C6
+  class COMObject extends dart.ffi::Struct {
+    synthetic constructor •() → lib::COMObject
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::COMObject
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get lpVtbl() → dart.ffi::Pointer<dart.ffi::IntPtr>
+      return dart.ffi::_fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi())));
+    set lpVtbl(dart.ffi::Pointer<dart.ffi::IntPtr> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::Pointer::address});
+    get vtable() → dart.ffi::Pointer<dart.ffi::IntPtr>
+      return dart.ffi::Pointer::fromAddress<dart.ffi::IntPtr>(dart.ffi::IntPtrPointer|get#value(this.{lib::COMObject::lpVtbl}));
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C17
+  class X extends dart.ffi::Struct {
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get xx() → lib::COMObject
+      return new lib::COMObject::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C8).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::COMObject>(#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::COMObject #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C7, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C10
+    static get #sizeOf() → dart.core::int*
+      return (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C3 = <dart.core::Type>[#C2]
+  #C4 = null
+  #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
+  #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}
+  #C11 = 8
+  #C12 = 4
+  #C13 = <dart.core::int*>[#C11, #C12, #C12]
+  #C14 = TypeLiteralConstant(lib::COMObject)
+  #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/tool/_fasta/direct_parser_ast_helper_creator.dart b/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
index e7cdb79..5c9509b 100644
--- a/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
+++ b/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.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
-
 import 'dart:io';
 import 'dart:typed_data';
 
@@ -12,7 +10,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:dart_style/dart_style.dart' show DartFormatter;
 
-StringSink out;
+late StringSink out;
 
 main(List<String> args) {
   if (args.contains("--stdout")) {
@@ -61,8 +59,8 @@
 abstract class DirectParserASTContent {
   final String what;
   final DirectParserASTType type;
-  Map<String, Object> get deprecatedArguments;
-  List<DirectParserASTContent> children;
+  Map<String, Object?> get deprecatedArguments;
+  List<DirectParserASTContent>? children;
 
   DirectParserASTContent(this.what, this.type);
 
@@ -98,13 +96,13 @@
 
 class ParserCreatorListener extends Listener {
   bool insideListenerClass = false;
-  String currentMethodName;
-  String latestSeenParameterTypeToken;
-  List<String> parameters = <String>[];
-  List<String> parameterTypes = <String>[];
-  StringBuffer newClasses = new StringBuffer();
+  String? currentMethodName;
+  String? latestSeenParameterTypeToken;
+  String? latestSeenParameterTypeTokenQuestion;
+  final List<Parameter> parameters = <Parameter>[];
+  final StringBuffer newClasses = new StringBuffer();
 
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
     if (name.lexeme == "Listener") insideListenerClass = true;
   }
 
@@ -112,27 +110,31 @@
     insideListenerClass = false;
   }
 
-  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
-      Token varFinalOrConst, Token getOrSet, Token name) {
+  void beginMethod(
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
     currentMethodName = name.lexeme;
   }
 
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     void end() {
       parameters.clear();
-      parameterTypes.clear();
       currentMethodName = null;
     }
 
     if (insideListenerClass &&
-        (currentMethodName.startsWith("begin") ||
-            currentMethodName.startsWith("end") ||
-            currentMethodName.startsWith("handle"))) {
+        (currentMethodName!.startsWith("begin") ||
+            currentMethodName!.startsWith("end") ||
+            currentMethodName!.startsWith("handle"))) {
       StringBuffer sb = new StringBuffer();
       sb.write("  ");
       Token token = beginToken;
-      Token latestToken;
+      Token? latestToken;
       while (true) {
         if (latestToken != null && latestToken.charEnd < token.charOffset) {
           sb.write(" ");
@@ -147,7 +149,7 @@
           throw token.runtimeType;
         }
         latestToken = token;
-        token = token.next;
+        token = token.next!;
       }
 
       if (token is SimpleToken && token.type == TokenType.FUNCTION) {
@@ -157,18 +159,18 @@
         String typeString;
         String typeStringCamel;
         String name;
-        if (currentMethodName.startsWith("begin")) {
+        if (currentMethodName!.startsWith("begin")) {
           typeString = "BEGIN";
           typeStringCamel = "Begin";
-          name = currentMethodName.substring("begin".length);
-        } else if (currentMethodName.startsWith("end")) {
+          name = currentMethodName!.substring("begin".length);
+        } else if (currentMethodName!.startsWith("end")) {
           typeString = "END";
           typeStringCamel = "End";
-          name = currentMethodName.substring("end".length);
-        } else if (currentMethodName.startsWith("handle")) {
+          name = currentMethodName!.substring("end".length);
+        } else if (currentMethodName!.startsWith("handle")) {
           typeString = "HANDLE";
           typeStringCamel = "Handle";
-          name = currentMethodName.substring("handle".length);
+          name = currentMethodName!.substring("handle".length);
         } else {
           throw "Unexpected.";
         }
@@ -178,10 +180,11 @@
         sb.write("DirectParserASTType.");
         sb.write(typeString);
         for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
           sb.write(', ');
-          sb.write(parameters[i]);
+          sb.write(param.name);
           sb.write(': ');
-          sb.write(parameters[i]);
+          sb.write(param.name);
         }
 
         sb.write(");");
@@ -194,10 +197,12 @@
                 "extends DirectParserASTContent {\n");
 
         for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
           newClasses.write("  final ");
-          newClasses.write(parameterTypes[i]);
+          newClasses.write(param.type);
+          newClasses.write(param.hasQuestion ? '?' : '');
           newClasses.write(' ');
-          newClasses.write(parameters[i]);
+          newClasses.write(param.name);
           newClasses.write(';\n');
         }
         newClasses.write('\n');
@@ -205,21 +210,26 @@
             "(DirectParserASTType type");
         String separator = ", {";
         for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
           newClasses.write(separator);
+          if (!param.hasQuestion) {
+            newClasses.write('required ');
+          }
           newClasses.write('this.');
-          newClasses.write(parameters[i]);
+          newClasses.write(param.name);
           separator = ", ";
         }
         if (parameters.isNotEmpty) {
           newClasses.write('}');
         }
         newClasses.write(') : super("$name", type);\n\n');
-        newClasses.write("Map<String, Object> get deprecatedArguments => {");
+        newClasses.write("Map<String, Object?> get deprecatedArguments => {");
         for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
           newClasses.write('"');
-          newClasses.write(parameters[i]);
+          newClasses.write(param.name);
           newClasses.write('": ');
-          newClasses.write(parameters[i]);
+          newClasses.write(param.name);
           newClasses.write(',');
         }
         newClasses.write("};\n");
@@ -237,21 +247,33 @@
   @override
   void handleNoType(Token lastConsumed) {
     latestSeenParameterTypeToken = null;
+    latestSeenParameterTypeTokenQuestion = null;
   }
 
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     latestSeenParameterTypeToken = beginToken.lexeme;
+    latestSeenParameterTypeTokenQuestion = questionMark?.lexeme;
   }
 
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? periodAfterThis,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
-    parameters.add(nameToken.lexeme);
-    parameterTypes.add(latestSeenParameterTypeToken);
+    parameters.add(new Parameter(
+        nameToken.lexeme,
+        latestSeenParameterTypeToken ?? 'dynamic',
+        latestSeenParameterTypeTokenQuestion == null ? false : true));
   }
 }
+
+class Parameter {
+  final String name;
+  final String type;
+  final bool hasQuestion;
+
+  Parameter(this.name, this.type, this.hasQuestion);
+}
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 4655978..d3c8f1f 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -125,6 +125,13 @@
   ///
   /// Works both for transformed and non-transformed compound classes.
   Set<Class> _compoundClassDependencies(Class node) {
+    final fieldTypes = _compoundAnnotatedFields(node);
+    if (fieldTypes != null) {
+      // Transformed classes.
+      return _compoundAnnotatedDependencies(fieldTypes);
+    }
+
+    // Non-tranformed classes.
     final dependencies = <Class>{};
     final membersWithAnnotations =
         _compoundFieldMembers(node, includeSetters: false);
@@ -199,20 +206,25 @@
       } else {
         // Only visit the ones without cycles.
         final clazz = component.single;
-        final compoundData = _findFields(clazz);
-        final compoundType = compoundData.compoundType;
-        compoundCache[clazz] = compoundType;
-        final indexedClass = indexedCompoundClasses[clazz];
-        if (transformCompounds.contains(clazz) &&
-            compoundType is! InvalidNativeTypeCfe) {
-          // Only visit if it has not been transformed yet, and its fields
-          // are valid.
-
-          _replaceFields(clazz, indexedClass, compoundData);
-          _addSizeOfField(clazz, indexedClass, compoundType.size);
+        final mustBeTransformed = (transformCompoundsInvalid.contains(clazz) ||
+            transformCompounds.contains(clazz));
+        if (!mustBeTransformed) {
+          compoundCache[clazz] = _compoundAnnotatedNativeTypeCfe(clazz);
+        } else {
+          final compoundData = _findFields(clazz);
+          final compoundType = compoundData.compoundType;
+          compoundCache[clazz] = compoundType;
+          final indexedClass = indexedCompoundClasses[clazz];
+          if (transformCompounds.contains(clazz) &&
+              compoundType is! InvalidNativeTypeCfe) {
+            // Only replace fields if valid.
+            _replaceFields(clazz, indexedClass, compoundData);
+            _addSizeOfField(clazz, indexedClass, compoundType.size);
+          } else {
+            // Do add a sizeOf field even if invalid.
+            _addSizeOfField(clazz, indexedClass);
+          }
           changedStructureNotifier?.registerClassMemberChange(clazz);
-        } else if (transformCompoundsInvalid.contains(clazz)) {
-          _addSizeOfField(clazz, indexedClass);
         }
       }
     });
@@ -310,13 +322,12 @@
   /// Note that getters and setters that originate from an external field have
   /// the same `fileOffset`, we always returns getters first.
   ///
-  /// This works for both transformed and non-transformed structs.
-  List<Member> _compoundFieldMembers(Class node,
-      {bool possiblyAlreadyTransformed = true, bool includeSetters = true}) {
+  /// This works only for non-transformed compounds.
+  List<Member> _compoundFieldMembers(Class node, {bool includeSetters = true}) {
+    assert(_compoundAnnotatedFields(node) == null);
     final getterSetters = node.procedures.where((p) {
-      if (!possiblyAlreadyTransformed && !p.isExternal) {
-        // If a struct has not been transformed yet, we have the guarantee
-        // that getters and setters corresponding to native fields are external.
+      if (!p.isExternal) {
+        // Getters and setters corresponding to native fields are external.
         return false;
       }
       if (p.isSetter && includeSetters) {
@@ -350,8 +361,8 @@
 
   bool _checkFieldAnnotations(Class node, int packing) {
     bool success = true;
-    final membersWithAnnotations = _compoundFieldMembers(node,
-        possiblyAlreadyTransformed: false, includeSetters: false);
+    final membersWithAnnotations =
+        _compoundFieldMembers(node, includeSetters: false);
     for (final Member f in membersWithAnnotations) {
       if (f is Field) {
         if (f.initializer is! NullLiteral) {
@@ -541,6 +552,7 @@
     node.addConstructor(ctor);
   }
 
+  // Works only for non-transformed classes.
   CompoundData _findFields(Class node) {
     final types = <NativeTypeCfe>[];
     final fields = <int, Field>{};
@@ -672,6 +684,75 @@
     }
   }
 
+  static const vmFfiStructFields = "vm:ffi:struct-fields";
+
+  // return value is nullable.
+  InstanceConstant _compoundAnnotatedFields(Class node) {
+    for (final annotation in node.annotations) {
+      if (annotation is ConstantExpression) {
+        final constant = annotation.constant;
+        if (constant is InstanceConstant &&
+            constant.classNode == pragmaClass &&
+            constant.fieldValues[pragmaName.getterReference] ==
+                StringConstant(vmFfiStructFields)) {
+          return constant.fieldValues[pragmaOptions.getterReference];
+        }
+      }
+    }
+    return null;
+  }
+
+  Set<Class> _compoundAnnotatedDependencies(InstanceConstant layoutConstant) {
+    final fieldTypes = layoutConstant
+        .fieldValues[ffiStructLayoutTypesField.getterReference] as ListConstant;
+    final result = <Class>{};
+    for (final fieldType in fieldTypes.entries) {
+      if (fieldType is TypeLiteralConstant) {
+        final type = fieldType.type;
+        if (isCompoundSubtype(type)) {
+          final clazz = (type as InterfaceType).classNode;
+          result.add(clazz);
+        }
+      }
+    }
+    return result;
+  }
+
+  /// Must only be called if all the depencies are already in the cache.
+  CompoundNativeTypeCfe _compoundAnnotatedNativeTypeCfe(Class compoundClass) {
+    final layoutConstant = _compoundAnnotatedFields(compoundClass);
+    final fieldTypes = layoutConstant
+        .fieldValues[ffiStructLayoutTypesField.getterReference] as ListConstant;
+    final members = <NativeTypeCfe>[];
+    for (final fieldType in fieldTypes.entries) {
+      if (fieldType is TypeLiteralConstant) {
+        final dartType = fieldType.type;
+        members.add(NativeTypeCfe(this, dartType));
+      } else if (fieldType is InstanceConstant) {
+        final singleElementConstant = fieldType
+                .fieldValues[ffiInlineArrayElementTypeField.getterReference]
+            as TypeLiteralConstant;
+        final singleElementType =
+            NativeTypeCfe(this, singleElementConstant.type);
+        final arrayLengthConstant =
+            fieldType.fieldValues[ffiInlineArrayLengthField.getterReference]
+                as IntConstant;
+        final arrayLength = arrayLengthConstant.value;
+        members.add(ArrayNativeTypeCfe(singleElementType, arrayLength));
+      }
+    }
+    if (compoundClass.superclass == structClass) {
+      final packingConstant = layoutConstant
+          .fieldValues[ffiStructLayoutPackingField.getterReference];
+      if (packingConstant is IntConstant) {
+        return StructNativeTypeCfe(compoundClass, members,
+            packing: packingConstant.value);
+      }
+      return StructNativeTypeCfe(compoundClass, members);
+    }
+    return UnionNativeTypeCfe(compoundClass, members);
+  }
+
   // packing is `int?`.
   void _annoteCompoundWithFields(
       Class node, List<NativeTypeCfe> types, int packing) {
@@ -680,7 +761,7 @@
 
     node.addAnnotation(ConstantExpression(
         InstanceConstant(pragmaClass.reference, [], {
-          pragmaName.getterReference: StringConstant("vm:ffi:struct-fields"),
+          pragmaName.getterReference: StringConstant(vmFfiStructFields),
           pragmaOptions.getterReference:
               InstanceConstant(ffiStructLayoutClass.reference, [], {
             ffiStructLayoutTypesField.getterReference: ListConstant(
diff --git a/runtime/include/BUILD.gn b/runtime/include/BUILD.gn
new file mode 100644
index 0000000..462b931
--- /dev/null
+++ b/runtime/include/BUILD.gn
@@ -0,0 +1,20 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# This rule copies header files to include/
+copy("copy_headers") {
+  visibility = [ "../../sdk:copy_headers" ]
+
+  sources = [
+    "dart_api.h",
+    "dart_api_dl.c",
+    "dart_api_dl.h",
+    "dart_native_api.h",
+    "dart_tools_api.h",
+    "dart_version.h",
+    "internal/dart_api_dl_impl.h",
+  ]
+
+  outputs = [ "$root_out_dir/dart-sdk/include/{{source_target_relative}}" ]
+}
diff --git a/runtime/tests/concurrency/stress_test_list.json b/runtime/tests/concurrency/stress_test_list.json
index 170afa2..4044c33 100644
--- a/runtime/tests/concurrency/stress_test_list.json
+++ b/runtime/tests/concurrency/stress_test_list.json
@@ -3283,7 +3283,6 @@
     "../../../tests/standalone/io/file_write_only_test.dart",
     "../../../tests/standalone/io/gzip_format_exception_test.dart",
     "../../../tests/standalone/io/http_100_continue_test.dart",
-    "../../../tests/standalone/io/http_ban_http_normal_test.dart",
     "../../../tests/standalone/io/http_big_header_test.dart",
     "../../../tests/standalone/io/http_bind_test.dart",
     "../../../tests/standalone/io/http_client_connect_test.dart",
@@ -6630,7 +6629,6 @@
     "../../../tests/standalone_2/io/file_write_only_test.dart",
     "../../../tests/standalone_2/io/gzip_format_exception_test.dart",
     "../../../tests/standalone_2/io/http_100_continue_test.dart",
-    "../../../tests/standalone_2/io/http_ban_http_normal_test.dart",
     "../../../tests/standalone_2/io/http_big_header_test.dart",
     "../../../tests/standalone_2/io/http_bind_test.dart",
     "../../../tests/standalone_2/io/http_client_connect_test.dart",
diff --git a/runtime/third_party/binary_size/src/explain_binary_size_delta.py b/runtime/third_party/binary_size/src/explain_binary_size_delta.py
index ed9c689..13f7c12 100755
--- a/runtime/third_party/binary_size/src/explain_binary_size_delta.py
+++ b/runtime/third_party/binary_size/src/explain_binary_size_delta.py
@@ -243,7 +243,7 @@
     # We have now analyzed all symbols that are in cache1 and removed all of
     # the encountered symbols from cache2. What's left in cache2 is the new
     # symbols.
-    for key, bucket2 in cache2.iteritems():
+    for key, bucket2 in cache2.items():
         file_path, symbol_type = key
         for symbol_name, symbol_size_list in bucket2.items():
             for (symbol_size, shared) in symbol_size_list:
@@ -401,8 +401,9 @@
         growth = size_data['plus'] - size_data['minus']
         return growth
 
-    for path, size_data in sorted(
-            delta_by_path.iteritems(), key=delta_sort_key, reverse=True):
+    for path, size_data in sorted(delta_by_path.items(),
+                                  key=delta_sort_key,
+                                  reverse=True):
         gain = size_data['plus']
         loss = size_data['minus']
         delta = size_data['plus'] - size_data['minus']
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 2d2de1c..bc3bf363 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -445,7 +445,6 @@
 void FlowGraphCompiler::RecordCatchEntryMoves(Environment* env,
                                               intptr_t try_index) {
 #if defined(DART_PRECOMPILER)
-  env = env != nullptr ? env : pending_deoptimization_env_;
   try_index = try_index != kInvalidTryIndex ? try_index : CurrentTryIndex();
   if (is_optimizing() && env != nullptr && (try_index != kInvalidTryIndex)) {
     env = env->Outermost();
@@ -903,9 +902,6 @@
   ASSERT(is_optimizing());
   ASSERT(!intrinsic_mode());
   ASSERT(!FLAG_precompiled_mode);
-  if (env == nullptr) {
-    env = pending_deoptimization_env_;
-  }
   if (env != nullptr) {
     env = env->GetLazyDeoptEnv(zone());
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index fd45478..0171f8b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -805,7 +805,7 @@
 
   void EmitEdgeCounter(intptr_t edge_id);
 
-  void RecordCatchEntryMoves(Environment* env = NULL,
+  void RecordCatchEntryMoves(Environment* env,
                              intptr_t try_index = kInvalidTryIndex);
 
   void EmitCallToStub(const Code& stub);
@@ -824,7 +824,7 @@
                             intptr_t deopt_id,
                             UntaggedPcDescriptors::Kind kind,
                             LocationSummary* locs,
-                            Environment* env = nullptr);
+                            Environment* env);
 
   void EmitYieldPositionMetadata(const InstructionSource& source,
                                  intptr_t yield_index);
@@ -882,8 +882,7 @@
                                 ICData::DeoptReasonId reason,
                                 uint32_t flags = 0);
 
-  CompilerDeoptInfo* AddDeoptIndexAtCall(intptr_t deopt_id,
-                                         Environment* env = nullptr);
+  CompilerDeoptInfo* AddDeoptIndexAtCall(intptr_t deopt_id, Environment* env);
   CompilerDeoptInfo* AddSlowPathDeoptInfo(intptr_t deopt_id, Environment* env);
 
   void AddSlowPathCode(SlowPathCode* slow_path);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index ab13d29..979db7e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -427,7 +427,8 @@
                                               UntaggedPcDescriptors::Kind kind,
                                               LocationSummary* locs) {
   __ BranchLinkPatchable(stub);
-  EmitCallsiteMetadata(source, DeoptId::kNone, kind, locs);
+  EmitCallsiteMetadata(source, DeoptId::kNone, kind, locs,
+                       pending_deoptimization_env_);
 }
 
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
@@ -438,7 +439,8 @@
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
   __ BranchLinkPatchable(stub, entry_kind);
-  EmitCallsiteMetadata(source, deopt_id, kind, locs);
+  EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                       pending_deoptimization_env_);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
@@ -451,7 +453,8 @@
   if (CanPcRelativeCall(target)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallTarget(target, entry_kind);
-    EmitCallsiteMetadata(source, deopt_id, kind, locs);
+    EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                         pending_deoptimization_env_);
   } else {
     ASSERT(is_optimizing());
     // Call sites to the same target can share object pool entries. These
@@ -460,7 +463,8 @@
     // instead.
     const auto& stub = StubCode::CallStaticFunction();
     __ BranchLinkWithEquivalence(stub, target, entry_kind);
-    EmitCallsiteMetadata(source, deopt_id, kind, locs);
+    EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                         pending_deoptimization_env_);
     AddStaticCallTarget(target, entry_kind);
   }
 }
@@ -531,7 +535,8 @@
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ Call(compiler::FieldAddress(CODE_REG, entry_point_offset));
-  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs,
+                       pending_deoptimization_env_);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -589,7 +594,7 @@
                   DeoptId::kNone, source, try_index);
   } else if (is_optimizing()) {
     AddCurrentDescriptor(UntaggedPcDescriptors::kOther, DeoptId::kNone, source);
-    AddDeoptIndexAtCall(deopt_id_after);
+    AddDeoptIndexAtCall(deopt_id_after, pending_deoptimization_env_);
   } else {
     AddCurrentDescriptor(UntaggedPcDescriptors::kOther, DeoptId::kNone, source);
     // Add deoptimization continuation point after the call and before the
@@ -642,7 +647,7 @@
   CLOBBERS_LR(__ blx(LR));
 
   EmitCallsiteMetadata(source, DeoptId::kNone, UntaggedPcDescriptors::kOther,
-                       locs);
+                       locs, pending_deoptimization_env_);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 71b11eb..d97a36b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -420,7 +420,8 @@
                                               UntaggedPcDescriptors::Kind kind,
                                               LocationSummary* locs) {
   __ BranchLinkPatchable(stub);
-  EmitCallsiteMetadata(source, DeoptId::kNone, kind, locs);
+  EmitCallsiteMetadata(source, DeoptId::kNone, kind, locs,
+                       pending_deoptimization_env_);
 }
 
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
@@ -431,7 +432,8 @@
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
   __ BranchLinkPatchable(stub, entry_kind);
-  EmitCallsiteMetadata(source, deopt_id, kind, locs);
+  EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                       pending_deoptimization_env_);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
@@ -444,7 +446,8 @@
   if (CanPcRelativeCall(target)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallTarget(target, entry_kind);
-    EmitCallsiteMetadata(source, deopt_id, kind, locs);
+    EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                         pending_deoptimization_env_);
   } else {
     // Call sites to the same target can share object pool entries. These
     // call sites are never patched for breakpoints: the function is deoptimized
@@ -453,7 +456,8 @@
     ASSERT(is_optimizing());
     const auto& stub = StubCode::CallStaticFunction();
     __ BranchLinkWithEquivalence(stub, target, entry_kind);
-    EmitCallsiteMetadata(source, deopt_id, kind, locs);
+    EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                         pending_deoptimization_env_);
     AddStaticCallTarget(target, entry_kind);
   }
 }
@@ -521,7 +525,8 @@
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ Call(compiler::FieldAddress(CODE_REG, entry_point_offset));
-  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs,
+                       pending_deoptimization_env_);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -575,7 +580,7 @@
                   DeoptId::kNone, source, try_index);
   } else if (is_optimizing()) {
     AddCurrentDescriptor(UntaggedPcDescriptors::kOther, DeoptId::kNone, source);
-    AddDeoptIndexAtCall(deopt_id_after);
+    AddDeoptIndexAtCall(deopt_id_after, pending_deoptimization_env_);
   } else {
     AddCurrentDescriptor(UntaggedPcDescriptors::kOther, DeoptId::kNone, source);
     // Add deoptimization continuation point after the call and before the
@@ -635,7 +640,7 @@
   CLOBBERS_LR(__ blr(LR));
 
   EmitCallsiteMetadata(source, DeoptId::kNone, UntaggedPcDescriptors::kOther,
-                       locs);
+                       locs, pending_deoptimization_env_);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 1a06f0a..4634363 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -484,7 +484,8 @@
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
   __ Call(stub, /*moveable_target=*/false, entry_kind);
-  EmitCallsiteMetadata(source, deopt_id, kind, locs);
+  EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                       pending_deoptimization_env_);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
@@ -496,7 +497,8 @@
   ASSERT(CanCallDart());
   const auto& stub = StubCode::CallStaticFunction();
   __ Call(stub, /*movable_target=*/true, entry_kind);
-  EmitCallsiteMetadata(source, deopt_id, kind, locs);
+  EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                       pending_deoptimization_env_);
   AddStaticCallTarget(target, entry_kind);
 }
 
@@ -574,7 +576,8 @@
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
-  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs,
+                       pending_deoptimization_env_);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -607,7 +610,7 @@
   // Precompilation not implemented on ia32 platform.
   ASSERT(!FLAG_precompiled_mode);
   if (is_optimizing()) {
-    AddDeoptIndexAtCall(deopt_id_after);
+    AddDeoptIndexAtCall(deopt_id_after, pending_deoptimization_env_);
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index f334d5c..01ee817 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -423,7 +423,8 @@
                                               UntaggedPcDescriptors::Kind kind,
                                               LocationSummary* locs) {
   __ CallPatchable(stub);
-  EmitCallsiteMetadata(source, DeoptId::kNone, kind, locs);
+  EmitCallsiteMetadata(source, DeoptId::kNone, kind, locs,
+                       pending_deoptimization_env_);
 }
 
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
@@ -434,7 +435,8 @@
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
   __ CallPatchable(stub, entry_kind);
-  EmitCallsiteMetadata(source, deopt_id, kind, locs);
+  EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                       pending_deoptimization_env_);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
@@ -448,7 +450,8 @@
   if (CanPcRelativeCall(target)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallTarget(target, entry_kind);
-    EmitCallsiteMetadata(source, deopt_id, kind, locs);
+    EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                         pending_deoptimization_env_);
   } else {
     // Call sites to the same target can share object pool entries. These
     // call sites are never patched for breakpoints: the function is deoptimized
@@ -456,7 +459,8 @@
     // instead.
     const auto& stub_entry = StubCode::CallStaticFunction();
     __ CallWithEquivalence(stub_entry, target, entry_kind);
-    EmitCallsiteMetadata(source, deopt_id, kind, locs);
+    EmitCallsiteMetadata(source, deopt_id, kind, locs,
+                         pending_deoptimization_env_);
     AddStaticCallTarget(target, entry_kind);
   }
 }
@@ -536,7 +540,8 @@
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
-  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kIcCall, locs,
+                       pending_deoptimization_env_);
   __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
@@ -591,7 +596,7 @@
                   DeoptId::kNone, source, try_index);
   } else if (is_optimizing()) {
     AddCurrentDescriptor(UntaggedPcDescriptors::kOther, DeoptId::kNone, source);
-    AddDeoptIndexAtCall(deopt_id_after);
+    AddDeoptIndexAtCall(deopt_id_after, pending_deoptimization_env_);
   } else {
     AddCurrentDescriptor(UntaggedPcDescriptors::kOther, DeoptId::kNone, source);
     // Add deoptimization continuation point after the call and before the
@@ -639,7 +644,8 @@
   __ LoadUniqueObject(RBX, data);
   __ call(RCX);
 
-  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(source, deopt_id, UntaggedPcDescriptors::kOther, locs,
+                       pending_deoptimization_env_);
   __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 4e02ded..512db83 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -5024,7 +5024,7 @@
   }
   compiler->EmitDispatchTableCall(selector()->offset, arguments_descriptor);
   compiler->EmitCallsiteMetadata(source(), DeoptId::kNone,
-                                 UntaggedPcDescriptors::kOther, locs());
+                                 UntaggedPcDescriptors::kOther, locs(), env());
   if (selector()->called_on_null && !selector()->on_null_interface) {
     Value* receiver = ArgumentValueAt(FirstArgIndex());
     if (receiver->Type()->is_nullable()) {
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index cb66118..9e6fae8 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -619,7 +619,7 @@
   }
   __ blx(R2);
   compiler->EmitCallsiteMetadata(source(), deopt_id(),
-                                 UntaggedPcDescriptors::kOther, locs());
+                                 UntaggedPcDescriptors::kOther, locs(), env());
   __ Drop(argument_count);
 }
 
@@ -1365,7 +1365,8 @@
   // instruction. Therefore we emit the metadata here, 8 bytes (2 instructions)
   // after the original mov.
   compiler->EmitCallsiteMetadata(InstructionSource(), deopt_id(),
-                                 UntaggedPcDescriptors::Kind::kOther, locs());
+                                 UntaggedPcDescriptors::Kind::kOther, locs(),
+                                 env());
 
   // Update information in the thread object and enter a safepoint.
   if (CanExecuteGeneratedCodeInSafepoint()) {
@@ -3500,7 +3501,7 @@
     // deoptimization stub.
     const intptr_t deopt_id = DeoptId::ToDeoptAfter(GetDeoptId());
     if (compiler->is_optimizing()) {
-      compiler->AddDeoptIndexAtCall(deopt_id);
+      compiler->AddDeoptIndexAtCall(deopt_id, env());
     } else {
       compiler->AddCurrentDescriptor(UntaggedPcDescriptors::kDeopt, deopt_id,
                                      InstructionSource());
@@ -3585,7 +3586,7 @@
               instruction()->locs()->live_registers()->FpuRegisterCount() > 0);
       __ Call(compiler::Address(THR, entry_point_offset));
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
-      compiler->RecordCatchEntryMoves();
+      compiler->RecordCatchEntryMoves(env);
       compiler->AddDescriptor(
           UntaggedPcDescriptors::kOther, compiler->assembler()->CodeSize(),
           instruction()->deopt_id(), instruction()->source(),
@@ -3594,7 +3595,7 @@
       __ CallRuntime(kStackOverflowRuntimeEntry, kNumSlowPathArgs);
       compiler->EmitCallsiteMetadata(
           instruction()->source(), instruction()->deopt_id(),
-          UntaggedPcDescriptors::kOther, instruction()->locs());
+          UntaggedPcDescriptors::kOther, instruction()->locs(), env);
     }
 
     if (compiler->isolate_group()->use_osr() && !compiler->is_optimizing() &&
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index b4accd0..c6e7064 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -544,7 +544,7 @@
   }
   __ blr(R2);
   compiler->EmitCallsiteMetadata(source(), deopt_id(),
-                                 UntaggedPcDescriptors::kOther, locs());
+                                 UntaggedPcDescriptors::kOther, locs(), env());
   __ Drop(argument_count);
 }
 
@@ -1257,8 +1257,8 @@
   // ADR loads relative to itself, so add kInstrSize to point to the next
   // instruction.
   __ adr(temp, compiler::Immediate(Instr::kInstrSize));
-  compiler->EmitCallsiteMetadata(source(), deopt_id(),
-                                 UntaggedPcDescriptors::Kind::kOther, locs());
+  compiler->EmitCallsiteMetadata(
+      source(), deopt_id(), UntaggedPcDescriptors::Kind::kOther, locs(), env());
 
   __ StoreToOffset(temp, FPREG, kSavedCallerPcSlotFromFp * kWordSize);
 
@@ -3093,7 +3093,7 @@
     // deoptimization stub.
     const intptr_t deopt_id = DeoptId::ToDeoptAfter(GetDeoptId());
     if (compiler->is_optimizing()) {
-      compiler->AddDeoptIndexAtCall(deopt_id);
+      compiler->AddDeoptIndexAtCall(deopt_id, env());
     } else {
       compiler->AddCurrentDescriptor(UntaggedPcDescriptors::kDeopt, deopt_id,
                                      InstructionSource());
@@ -3189,7 +3189,7 @@
         __ Call(compiler::Address(THR, entry_point_offset));
       }
       compiler->RecordSafepoint(locs, kNumSlowPathArgs);
-      compiler->RecordCatchEntryMoves();
+      compiler->RecordCatchEntryMoves(env);
       compiler->AddDescriptor(
           UntaggedPcDescriptors::kOther, compiler->assembler()->CodeSize(),
           instruction()->deopt_id(), instruction()->source(),
@@ -3198,7 +3198,7 @@
       __ CallRuntime(kStackOverflowRuntimeEntry, kNumSlowPathArgs);
       compiler->EmitCallsiteMetadata(
           instruction()->source(), instruction()->deopt_id(),
-          UntaggedPcDescriptors::kOther, instruction()->locs());
+          UntaggedPcDescriptors::kOther, instruction()->locs(), env);
     }
 
     if (compiler->isolate_group()->use_osr() && !compiler->is_optimizing() &&
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index ca703b3..045490a 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1031,7 +1031,8 @@
   compiler::Label get_pc;
   __ call(&get_pc);
   compiler->EmitCallsiteMetadata(InstructionSource(), deopt_id(),
-                                 UntaggedPcDescriptors::Kind::kOther, locs());
+                                 UntaggedPcDescriptors::Kind::kOther, locs(),
+                                 env());
   __ Bind(&get_pc);
   __ popl(temp);
   __ movl(compiler::Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), temp);
@@ -2782,7 +2783,7 @@
     // deoptimization stub.
     const intptr_t deopt_id = DeoptId::ToDeoptAfter(GetDeoptId());
     if (compiler->is_optimizing()) {
-      compiler->AddDeoptIndexAtCall(deopt_id);
+      compiler->AddDeoptIndexAtCall(deopt_id, env());
     } else {
       compiler->AddCurrentDescriptor(UntaggedPcDescriptors::kDeopt, deopt_id,
                                      InstructionSource());
@@ -2857,7 +2858,7 @@
     __ CallRuntime(kStackOverflowRuntimeEntry, kNumSlowPathArgs);
     compiler->EmitCallsiteMetadata(
         instruction()->source(), instruction()->deopt_id(),
-        UntaggedPcDescriptors::kOther, instruction()->locs());
+        UntaggedPcDescriptors::kOther, instruction()->locs(), env);
 
     if (compiler->isolate_group()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
@@ -6601,7 +6602,7 @@
   __ xorl(ECX, ECX);
   __ call(EBX);
   compiler->EmitCallsiteMetadata(source(), deopt_id(),
-                                 UntaggedPcDescriptors::kOther, locs());
+                                 UntaggedPcDescriptors::kOther, locs(), env());
   __ Drop(argument_count);
 }
 
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 72e489e..8e6d3e9 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1218,7 +1218,8 @@
   // 'movq'.
   __ leaq(TMP, compiler::Address::AddressRIPRelative(0));
   compiler->EmitCallsiteMetadata(InstructionSource(), deopt_id(),
-                                 UntaggedPcDescriptors::Kind::kOther, locs());
+                                 UntaggedPcDescriptors::Kind::kOther, locs(),
+                                 env());
   __ movq(compiler::Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), TMP);
 
   if (CanExecuteGeneratedCodeInSafepoint()) {
@@ -3198,7 +3199,7 @@
     // deoptimization stub.
     const intptr_t deopt_id = DeoptId::ToDeoptAfter(GetDeoptId());
     if (compiler->is_optimizing()) {
-      compiler->AddDeoptIndexAtCall(deopt_id);
+      compiler->AddDeoptIndexAtCall(deopt_id, env());
     } else {
       compiler->AddCurrentDescriptor(UntaggedPcDescriptors::kDeopt, deopt_id,
                                      InstructionSource());
@@ -3281,7 +3282,7 @@
               instruction()->locs()->live_registers()->FpuRegisterCount() > 0);
       __ call(compiler::Address(THR, entry_point_offset));
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
-      compiler->RecordCatchEntryMoves();
+      compiler->RecordCatchEntryMoves(env);
       compiler->AddDescriptor(
           UntaggedPcDescriptors::kOther, compiler->assembler()->CodeSize(),
           instruction()->deopt_id(), instruction()->source(),
@@ -3290,7 +3291,7 @@
       __ CallRuntime(kStackOverflowRuntimeEntry, kNumSlowPathArgs);
       compiler->EmitCallsiteMetadata(
           instruction()->source(), instruction()->deopt_id(),
-          UntaggedPcDescriptors::kOther, instruction()->locs());
+          UntaggedPcDescriptors::kOther, instruction()->locs(), env);
     }
 
     if (compiler->isolate_group()->use_osr() && !compiler->is_optimizing() &&
@@ -6904,7 +6905,7 @@
   }
   __ call(RCX);
   compiler->EmitCallsiteMetadata(source(), deopt_id(),
-                                 UntaggedPcDescriptors::kOther, locs());
+                                 UntaggedPcDescriptors::kOther, locs(), env());
   __ Drop(argument_count);
 }
 
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 3734869..e1c900d 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -658,20 +658,10 @@
 }
 
 # This rule copies header files to include/
-copy("copy_headers") {
+group("copy_headers") {
   visibility = [ ":create_common_sdk" ]
-  sources = [
-    "../runtime/include/dart_api.h",
-    "../runtime/include/dart_api_dl.c",
-    "../runtime/include/dart_api_dl.h",
-    "../runtime/include/dart_native_api.h",
-    "../runtime/include/dart_tools_api.h",
-    "../runtime/include/dart_version.h",
-    "../runtime/include/internal/dart_api_dl_impl.h",
-  ]
 
-  # Some magic to recover the folder structure inside the include folder.
-  outputs = [ "$root_out_dir/dart-sdk/include/{{source_root_relative_dir}}/../../{{source_file_part}}" ]
+  deps = [ "../runtime/include:copy_headers" ]
 }
 
 # This rule copies libraries.json files to lib/
diff --git a/sdk/lib/_http/embedder_config.dart b/sdk/lib/_http/embedder_config.dart
index 730bc2dd..f43dc61 100644
--- a/sdk/lib/_http/embedder_config.dart
+++ b/sdk/lib/_http/embedder_config.dart
@@ -6,6 +6,16 @@
 
 /// Embedder-specific `dart:_http` configuration.
 
-/// [HttpClient] will disallow HTTP URLs if this value is set to `false`.
-@pragma("vm:entry-point")
-bool _embedderAllowsHttp = true;
+/// Embedder hook for intercepting HTTP connections.
+///
+/// The [HttpClient] will call this function as a connection to a given [Uri]
+/// is being established.
+///
+/// The embedder can provide its own implementation to,
+/// for example, confirm whether such a connection should be allowed.
+/// If the connection is not allowed, this method can throw an [Error],
+/// which should then provide enough information to say why the connection
+/// was refused.
+/// If this function returns normally, the connection attempt will proceed.
+@pragma('vm:entry-point')
+void Function(Uri) _httpConnectionHook = (_) {};
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index c20759f..4a6c80d 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -1721,8 +1721,10 @@
 
   /**
    * Sets the function to be called when a site is requesting
-   * authentication. The URL requested and the security realm from the
-   * server are passed in the arguments [url] and [realm].
+   * authentication.
+   *
+   * The URL requested, the authentication scheme and the security realm
+   * from the server are passed in the arguments [url], [scheme] and [realm].
    *
    * The function returns a [Future] which should complete when the
    * authentication has been resolved. If credentials cannot be
@@ -1742,7 +1744,7 @@
    * of a failed request, or issues due to missing request payload on retried
    * request.
    */
-  void set authenticate(Future<bool> f(Uri url, String scheme, String realm)?);
+  void set authenticate(Future<bool> f(Uri url, String scheme, String? realm)?);
 
   /**
    * Add credentials to be used for authorizing HTTP requests.
@@ -1838,9 +1840,11 @@
 
   /**
    * Sets the function to be called when a proxy is requesting
-   * authentication. Information on the proxy in use and the security
-   * realm for the authentication are passed in the arguments [host],
-   * [port] and [realm].
+   * authentication.
+   *
+   * Information on the proxy in use, the authentication scheme
+   * and the security realm for the authentication
+   * are passed in the arguments [host], [port], [scheme] and [realm].
    *
    * The function returns a [Future] which should complete when the
    * authentication has been resolved. If credentials cannot be
@@ -1854,7 +1858,7 @@
    * continue normally.
    */
   void set authenticateProxy(
-      Future<bool> f(String host, int port, String scheme, String realm)?);
+      Future<bool> f(String host, int port, String scheme, String? realm)?);
 
   /**
    * Add credentials to be used for authorizing HTTP proxies.
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 4e4589b..b61f273 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -705,11 +705,11 @@
       if (onError == null) {
         return;
       }
-      if (onError is void Function(Object)) {
-        onError(e);
-      } else {
-        assert(onError is void Function(Object, StackTrace));
+      if (onError is void Function(Object, StackTrace)) {
         onError(e, st);
+      } else {
+        assert(onError is void Function(Object));
+        onError(e);
       }
     }, onDone: () {
       _profileData?.finishResponse();
@@ -784,15 +784,16 @@
           return new Future.value(false);
         }
         var proxy = _httpRequest._proxy;
-        return authenticateProxy(
-            proxy.host, proxy.port, scheme.toString(), realm);
-      } else {
-        var authenticate = _httpClient._authenticate;
-        if (authenticate == null) {
-          return new Future.value(false);
+        if (!proxy.isDirect) {
+          return authenticateProxy(
+              proxy.host!, proxy.port!, scheme.toString(), realm);
         }
-        return authenticate(_httpRequest.uri, scheme.toString(), realm);
       }
+      var authenticate = _httpClient._authenticate;
+      if (authenticate == null) {
+        return new Future.value(false);
+      }
+      return authenticate(_httpRequest.uri, scheme.toString(), realm);
     }
 
     List<String> challenge = authChallenge()!;
@@ -2499,9 +2500,10 @@
   final List<_Credentials> _credentials = [];
   final List<_ProxyCredentials> _proxyCredentials = [];
   final SecurityContext? _context;
-  Function? _authenticate;
-  Function? _authenticateProxy;
-  Function? _findProxy = HttpClient.findProxyFromEnvironment;
+  Future<bool> Function(Uri, String scheme, String? realm)? _authenticate;
+  Future<bool> Function(String host, int port, String scheme, String? realm)?
+      _authenticateProxy;
+  String Function(Uri)? _findProxy = HttpClient.findProxyFromEnvironment;
   Duration _idleTimeout = const Duration(seconds: 15);
   BadCertificateCallback? _badCertificateCallback;
 
@@ -2600,7 +2602,7 @@
         !force || !_connectionTargets.values.any((s) => s._active.isNotEmpty));
   }
 
-  set authenticate(Future<bool> f(Uri url, String scheme, String realm)?) {
+  set authenticate(Future<bool> f(Uri url, String scheme, String? realm)?) {
     _authenticate = f;
   }
 
@@ -2610,7 +2612,7 @@
   }
 
   set authenticateProxy(
-      Future<bool> f(String host, int port, String scheme, String realm)?) {
+      Future<bool> f(String host, int port, String scheme, String? realm)?) {
     _authenticateProxy = f;
   }
 
@@ -2630,22 +2632,6 @@
     });
   }
 
-  /// Whether HTTP requests are currently allowed.
-  ///
-  /// If the [Zone] variable `#dart.library.io.allow_http` is set to a boolean,
-  /// it determines whether the HTTP protocol is allowed. If the zone variable
-  /// is set to any other non-null value, HTTP is not allowed.
-  /// Otherwise, if the `dart.library.io.allow_http` environment flag
-  /// is set to `false`, HTTP is not allowed.
-  /// Otherwise, [_embedderAllowsHttp] determines the result.
-  bool get _isHttpAllowed {
-    final zoneOverride = Zone.current[#dart.library.io.allow_http];
-    if (zoneOverride != null) return true == zoneOverride;
-    bool envOverride =
-        bool.fromEnvironment("dart.library.io.allow_http", defaultValue: true);
-    return envOverride && _embedderAllowsHttp;
-  }
-
   bool _isLoopback(String host) {
     if (host.isEmpty) return false;
     if ("localhost" == host) return true;
@@ -2676,11 +2662,9 @@
       }
     }
 
+    _httpConnectionHook(uri);
+
     bool isSecure = uri.isScheme("https");
-    if (!_isHttpAllowed && !isSecure && !_isLoopback(uri.host)) {
-      throw new StateError(
-          "Insecure HTTP is not allowed by the current platform: $uri");
-    }
 
     int port = uri.port;
     if (port == 0) {
diff --git a/tests/ffi/regress_46004_test.dart b/tests/ffi/regress_46004_test.dart
new file mode 100644
index 0000000..81c4da7
--- /dev/null
+++ b/tests/ffi/regress_46004_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+class COMObject extends Struct {
+  external Pointer<IntPtr> lpVtbl;
+
+  // This should not be interpreted as a native field.
+  Pointer<IntPtr> get vtable => Pointer.fromAddress(lpVtbl.value);
+}
+
+void main() {
+  Expect.equals(sizeOf<Pointer>(), sizeOf<COMObject>());
+
+  final comObjectPointer = calloc<COMObject>();
+  final vTablePointer = calloc<IntPtr>();
+  vTablePointer.value = 1234;
+  final comObject = comObjectPointer.ref;
+  comObject.lpVtbl = vTablePointer;
+  Expect.equals(1234, comObject.vtable.address);
+  calloc.free(comObjectPointer);
+  calloc.free(vTablePointer);
+}
diff --git a/tests/ffi_2/regress_46004_test.dart b/tests/ffi_2/regress_46004_test.dart
new file mode 100644
index 0000000..627611f
--- /dev/null
+++ b/tests/ffi_2/regress_46004_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+class COMObject extends Struct {
+  Pointer<IntPtr> lpVtbl;
+
+  // This should not be interpreted as a native field.
+  Pointer<IntPtr> get vtable => Pointer.fromAddress(lpVtbl.value);
+}
+
+void main() {
+  Expect.equals(sizeOf<Pointer>(), sizeOf<COMObject>());
+
+  final comObjectPointer = calloc<COMObject>();
+  final vTablePointer = calloc<IntPtr>();
+  vTablePointer.value = 1234;
+  final comObject = comObjectPointer.ref;
+  comObject.lpVtbl = vTablePointer;
+  Expect.equals(1234, comObject.vtable.address);
+  calloc.free(comObjectPointer);
+  calloc.free(vTablePointer);
+}
diff --git a/tests/standalone/io/http_auth_digest_test.dart b/tests/standalone/io/http_auth_digest_test.dart
index e8d66fb..11e3ecf 100644
--- a/tests/standalone/io/http_auth_digest_test.dart
+++ b/tests/standalone/io/http_auth_digest_test.dart
@@ -207,7 +207,7 @@
   Server.start(algorithm, qop).then((server) {
     HttpClient client = new HttpClient();
 
-    client.authenticate = (Uri url, String scheme, String realm) {
+    client.authenticate = (url, scheme, realm) {
       Expect.equals("Digest", scheme);
       Expect.equals("test", realm);
       final completer = new Completer<bool>();
@@ -348,7 +348,7 @@
   client.addCredentials(Uri.parse("http://127.0.0.1/digest"), "test",
       new HttpClientDigestCredentials("dart", "password"));
 
-  client.authenticate = (Uri url, String scheme, String realm) {
+  client.authenticate = (url, scheme, realm) {
     client.addCredentials(Uri.parse("http://127.0.0.1/digest"), "test",
         new HttpClientDigestCredentials("dart", "password"));
     return new Future.value(true);
diff --git a/tests/standalone/io/http_auth_test.dart b/tests/standalone/io/http_auth_test.dart
index b1e5b31..9b01075 100644
--- a/tests/standalone/io/http_auth_test.dart
+++ b/tests/standalone/io/http_auth_test.dart
@@ -156,7 +156,7 @@
     HttpClient client = new HttpClient();
     bool passwordChanged = false;
 
-    client.authenticate = (Uri url, String scheme, String realm) {
+    client.authenticate = (Uri url, String scheme, String? realm) {
       Expect.equals("Basic", scheme);
       Expect.equals("realm", realm);
       String username = url.path.substring(1, 6);
@@ -165,7 +165,7 @@
       final completer = new Completer<bool>();
       new Timer(const Duration(milliseconds: 10), () {
         client.addCredentials(
-            url, realm, new HttpClientBasicCredentials(username, password));
+            url, realm!, new HttpClientBasicCredentials(username, password));
         completer.complete(true);
       });
       return completer.future;
@@ -208,7 +208,7 @@
 void testLocalServerBasic() {
   HttpClient client = new HttpClient();
 
-  client.authenticate = (Uri url, String scheme, String realm) {
+  client.authenticate = (Uri url, String scheme, String? realm) {
     client.addCredentials(Uri.parse("http://127.0.0.1/basic"), "test",
         new HttpClientBasicCredentials("test", "test"));
     return new Future.value(true);
@@ -228,7 +228,7 @@
 void testLocalServerDigest() {
   HttpClient client = new HttpClient();
 
-  client.authenticate = (Uri url, String scheme, String realm) {
+  client.authenticate = (Uri url, String scheme, String? realm) {
     print("url: $url, scheme: $scheme, realm: $realm");
     client.addCredentials(Uri.parse("http://127.0.0.1/digest"), "test",
         new HttpClientDigestCredentials("test", "test"));
diff --git a/tests/standalone/io/http_ban_http_embedder_test.dart b/tests/standalone/io/http_ban_http_embedder_test.dart
deleted file mode 100644
index 7fd3cb3..0000000
--- a/tests/standalone/io/http_ban_http_embedder_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// SharedOptions=-Ddart.library.io.allow_http=false
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-import 'http_ban_http_normal_test.dart';
-import 'http_bind_test.dart';
-
-Future<void> testWithHostname() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, httpUri) async {
-    asyncExpectThrows(
-        () async => await httpClient.getUrl(httpUri), (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: 'foo'}),
-        (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: false}),
-        (e) => e is StateError);
-    await asyncTest(() => runZoned(() => httpClient.getUrl(httpUri),
-        zoneValues: {#dart.library.io.allow_http: true}));
-  });
-}
-
-Future<void> testWithLoopback() async {
-  await testBanHttp("127.0.0.1", (httpClient, uri) async {
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://localhost:${uri.port}')));
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://127.0.0.1:${uri.port}')));
-  });
-}
-
-Future<void> testWithIPv6() async {
-  if (await supportsIPV6()) {
-    await testBanHttp("::1", (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-  }
-}
-
-Future<void> testWithHTTPS() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, uri) async {
-    asyncExpectThrows(
-        () => httpClient.getUrl(Uri(
-              scheme: 'https',
-              host: uri.host,
-              port: uri.port,
-            )),
-        (e) => e is SocketException || e is HandshakeException);
-  });
-}
-
-main() {
-  asyncStart();
-  Future.wait(<Future>[
-    testWithHostname(),
-    testWithLoopback(),
-    testWithIPv6(),
-    testWithHTTPS(),
-  ]).then((_) => asyncEnd());
-}
diff --git a/tests/standalone/io/http_ban_http_normal_test.dart b/tests/standalone/io/http_ban_http_normal_test.dart
deleted file mode 100644
index 118dd4c..0000000
--- a/tests/standalone/io/http_ban_http_normal_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-Future<String> getLocalHostIP() async {
-  final interfaces = await NetworkInterface.list(
-      includeLoopback: false, type: InternetAddressType.IPv4);
-  return interfaces.first.addresses.first.address;
-}
-
-Future<void> testBanHttp(String serverHost,
-    Future<void> testCode(HttpClient client, Uri uri)) async {
-  final httpClient = new HttpClient();
-  final server = await HttpServer.bind(serverHost, 0);
-  final uri = Uri(scheme: 'http', host: serverHost, port: server.port);
-  try {
-    await testCode(httpClient, uri);
-  } finally {
-    httpClient.close(force: true);
-    await server.close();
-  }
-}
-
-main() async {
-  await asyncTest(() async {
-    final host = await getLocalHostIP();
-    // Normal HTTP request succeeds.
-    await testBanHttp(host, (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-    // We can ban HTTP explicitly.
-    await testBanHttp(host, (httpClient, uri) async {
-      asyncExpectThrows(
-          () async => await runZoned(() => httpClient.getUrl(uri),
-              zoneValues: {#dart.library.io.allow_http: false}),
-          (e) => e is StateError);
-    });
-  });
-}
diff --git a/tests/standalone_2/io/http_auth_digest_test.dart b/tests/standalone_2/io/http_auth_digest_test.dart
index 5f708b9..42d34ae 100644
--- a/tests/standalone_2/io/http_auth_digest_test.dart
+++ b/tests/standalone_2/io/http_auth_digest_test.dart
@@ -209,7 +209,7 @@
   Server.start(algorithm, qop).then((server) {
     HttpClient client = new HttpClient();
 
-    client.authenticate = (Uri url, String scheme, String realm) {
+    client.authenticate = (url, scheme, realm) {
       Expect.equals("Digest", scheme);
       Expect.equals("test", realm);
       Completer completer = new Completer<bool>();
@@ -350,7 +350,7 @@
   client.addCredentials(Uri.parse("http://127.0.0.1/digest"), "test",
       new HttpClientDigestCredentials("dart", "password"));
 
-  client.authenticate = (Uri url, String scheme, String realm) {
+  client.authenticate = (url, scheme, realm) {
     client.addCredentials(Uri.parse("http://127.0.0.1/digest"), "test",
         new HttpClientDigestCredentials("dart", "password"));
     return new Future.value(true);
diff --git a/tests/standalone_2/io/http_ban_http_embedder_test.dart b/tests/standalone_2/io/http_ban_http_embedder_test.dart
deleted file mode 100644
index d40500f..0000000
--- a/tests/standalone_2/io/http_ban_http_embedder_test.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// SharedOptions=-Ddart.library.io.allow_http=false
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-import 'http_ban_http_normal_test.dart';
-import 'http_bind_test.dart';
-
-Future<void> testWithHostname() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, httpUri) async {
-    asyncExpectThrows(
-        () async => await httpClient.getUrl(httpUri), (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: 'foo'}),
-        (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: false}),
-        (e) => e is StateError);
-    await asyncTest(() => runZoned(() => httpClient.getUrl(httpUri),
-        zoneValues: {#dart.library.io.allow_http: true}));
-  });
-}
-
-Future<void> testWithLoopback() async {
-  await testBanHttp("127.0.0.1", (httpClient, uri) async {
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://localhost:${uri.port}')));
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://127.0.0.1:${uri.port}')));
-  });
-}
-
-Future<void> testWithIPv6() async {
-  if (await supportsIPV6()) {
-    await testBanHttp("::1", (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-  }
-}
-
-Future<void> testWithHTTPS() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, uri) async {
-    asyncExpectThrows(
-        () => httpClient.getUrl(Uri(
-              scheme: 'https',
-              host: uri.host,
-              port: uri.port,
-            )),
-        (e) => e is SocketException || e is HandshakeException);
-  });
-}
-
-main() {
-  asyncStart();
-  Future.wait(<Future>[
-    testWithHostname(),
-    testWithLoopback(),
-    testWithIPv6(),
-    testWithHTTPS(),
-  ]).then((_) => asyncEnd());
-}
diff --git a/tests/standalone_2/io/http_ban_http_normal_test.dart b/tests/standalone_2/io/http_ban_http_normal_test.dart
deleted file mode 100644
index adb4708..0000000
--- a/tests/standalone_2/io/http_ban_http_normal_test.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-Future<String> getLocalHostIP() async {
-  final interfaces = await NetworkInterface.list(
-      includeLoopback: false, type: InternetAddressType.IPv4);
-  return interfaces.first.addresses.first.address;
-}
-
-Future<void> testBanHttp(String serverHost,
-    Future<void> testCode(HttpClient client, Uri uri)) async {
-  final httpClient = new HttpClient();
-  final server = await HttpServer.bind(serverHost, 0);
-  final uri = Uri(scheme: 'http', host: serverHost, port: server.port);
-  try {
-    await testCode(httpClient, uri);
-  } finally {
-    httpClient.close(force: true);
-    await server.close();
-  }
-}
-
-main() async {
-  await asyncTest(() async {
-    final host = await getLocalHostIP();
-    // Normal HTTP request succeeds.
-    await testBanHttp(host, (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-    // We can ban HTTP explicitly.
-    await testBanHttp(host, (httpClient, uri) async {
-      asyncExpectThrows(
-          () async => await runZoned(() => httpClient.getUrl(uri),
-              zoneValues: {#dart.library.io.allow_http: false}),
-          (e) => e is StateError);
-    });
-  });
-}
diff --git a/tools/VERSION b/tools/VERSION
index b1dbbe1..41a77e2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 132
+PRERELEASE 133
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/create_pkg_manifest.py b/tools/create_pkg_manifest.py
index 0233b44..b0944f2 100755
--- a/tools/create_pkg_manifest.py
+++ b/tools/create_pkg_manifest.py
@@ -57,7 +57,7 @@
     # Extract the deps and filter.
     deps = local_scope.get('deps', {})
     filtered_deps = {}
-    for k, v in deps.iteritems():
+    for k, v in deps.items():
         if 'sdk/third_party/pkg' in k:
             new_key = k.replace('sdk', 'third_party/dart', 1)
             filtered_deps[new_key] = v
@@ -80,7 +80,7 @@
         manifest.write(warning)
         manifest.write('<manifest>\n')
         manifest.write('  <projects>\n')
-        for path, remote in sorted(deps.iteritems()):
+        for path, remote in sorted(deps.items()):
             remote_components = remote.split('@')
             remote_url = remote_components[0]
             remote_version = remote_components[1]
diff --git a/tools/dom/new_scripts/code_generator_dart.py b/tools/dom/new_scripts/code_generator_dart.py
index 2a92923..2830e7f 100644
--- a/tools/dom/new_scripts/code_generator_dart.py
+++ b/tools/dom/new_scripts/code_generator_dart.py
@@ -102,21 +102,20 @@
         # Set global type info
         idl_types.set_ancestors(
             dict((interface_name, interface_info['ancestors'])
-                 for interface_name, interface_info in interfaces_info.
-                 iteritems()
+                 for interface_name, interface_info in interfaces_info.items()
                  if interface_info['ancestors']))
         IdlType.set_callback_interfaces(
-            set(interface_name for interface_name, interface_info in
-                interfaces_info.iteritems()
+            set(interface_name
+                for interface_name, interface_info in interfaces_info.items()
                 if interface_info['is_callback_interface']))
         IdlType.set_implemented_as_interfaces(
             dict((interface_name, interface_info['implemented_as'])
-                 for interface_name, interface_info in interfaces_info.
-                 iteritems()
+                 for interface_name, interface_info in interfaces_info.items()
                  if interface_info['implemented_as']))
         IdlType.set_garbage_collected_types(
-            set(interface_name for interface_name, interface_info in
-                interfaces_info.iteritems() if 'GarbageCollected' in
+            set(interface_name
+                for interface_name, interface_info in interfaces_info.items()
+                if 'GarbageCollected' in
                 interface_info['inherited_extended_attributes']))
 
     def generate_code(self, definitions, interface_name, idl_pickle_filename,
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index ee4d4a4..b997b60 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -714,7 +714,7 @@
 
         if _monitor_type_metadata:
             monitored_interfaces = {}
-            for interface_id, interface_data in self._types.iteritems():
+            for interface_id, interface_data in self._types.items():
                 monitored_interface = interface_data.copy()
                 monitored_interface['members'] = monitored.Dict(
                     'dartmetadata.%s' % interface_id, interface_data['members'])
diff --git a/tools/utils.py b/tools/utils.py
index 9a0c720..644fc49 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -825,13 +825,13 @@
             self._upload(files)
 
         if missing:
-            self._report_missing_crashes(missing, throw=True)
+            self._report_missing_crashes(missing, throw=False)
 
     # todo(athom): move the logic to decide where to copy core dumps into the recipes.
     def _is_shard(self):
         return 'BUILDBOT_BUILDERNAME' not in os.environ
 
-    def _report_missing_crashes(self, missing, throw=True):
+    def _report_missing_crashes(self, missing, throw=False):
         missing_as_string = ', '.join([str(c) for c in missing])
         other_files = list(glob.glob(os.path.join(self._search_dir, '*')))
         sys.stderr.write(
@@ -1071,7 +1071,7 @@
         if crash.pid in self._dumps_by_pid:
             return self._dumps_by_pid[crash.pid]
 
-    def _report_missing_crashes(self, missing, throw=True):
+    def _report_missing_crashes(self, missing, throw=False):
         # Let's only print the debugging information and not throw. We'll do more
         # validation for werfault.exe and throw afterwards.
         super(WindowsCoreDumpArchiver, self)._report_missing_crashes(
