Version 2.14.0-151.0.dev

Merge commit '633f14878825d51ae7e1e70967521b391233d5f4' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e74f84b..f8c7ddd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -50,7 +50,15 @@
 
 #### Dart command line
 
-- The `dart create` command has been updated to create projects that use the new
+*   **Breaking Change** [#46100][]: The standalone `dart2native` has been marked
+deprecated, and now prints a warning message. It's replacement is the `dart
+compile exe` and `dart compile aot-snapshot` commands, which offer the same
+functionality. The `dart2native` tool will be discontinued (removed from the
+Dart SDK) in Dart 2.15.
+
+https://github.com/dart-lang/sdk/issues/46100
+
+* The `dart create` command has been updated to create projects that use the new
   'core' set of lints from `package:lints`. See https://dart.dev/go/core-lints
   for more information about these lints.
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 1402102..d23309d7 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -781,6 +781,11 @@
   }
 
   @override
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    listener?.handleTypeArgumentApplication(openAngleBracket);
+  }
+
+  @override
   void endHide(Token hideKeyword) {
     listener?.endHide(hideKeyword);
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 0e08a2e..9d7de10 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -1727,4 +1727,19 @@
   /// This event is generated by the parser when the parser's
   /// `parseOneCommentReference` method is called.
   void handleNoCommentReference() {}
+
+  /// An expression was encountered consisting of type arguments applied to a
+  /// subexpression.  This could validly represent any of the following:
+  /// - A type literal (`var x = List<int>;`)
+  /// - A function tear-off with type arguments (`var x = f<int>;` or
+  ///   `var x = importPrefix.f<int>;`)
+  /// - A static method tear-off with type arguments (`var x = ClassName.m<int>`
+  ///   or `var x = importPrefix.ClassName.m<int>;`)
+  /// - An instance method tear-off with type arguments (`var x = EXPR.m<int>;`)
+  ///
+  /// Or, in the event of invalid code, it could represent type arguments
+  /// erroneously applied to some other expression type (e.g.
+  /// `var x = (f)<int>;`).  The client is responsible for reporting an error if
+  /// this occurs.
+  void handleTypeArgumentApplication(Token openAngleBracket) {}
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index ba63e91..b8eb480 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -4793,7 +4793,10 @@
         listener.handleNonNullAssertExpression(bangToken);
       }
       token = typeArg.parseArguments(bangToken, this);
-      assert(optional('(', token.next!));
+      if (!optional('(', token.next!)) {
+        listener.handleTypeArgumentApplication(bangToken.next!);
+        typeArg = noTypeParamOrArg;
+      }
     }
 
     return _parsePrecedenceExpressionLoop(
@@ -4861,7 +4864,10 @@
                 listener.handleNonNullAssertExpression(bangToken);
               }
               token = typeArg.parseArguments(bangToken, this);
-              assert(optional('(', token.next!));
+              if (!optional('(', token.next!)) {
+                listener.handleTypeArgumentApplication(bangToken.next!);
+                typeArg = noTypeParamOrArg;
+              }
             }
           } else if (identical(type, TokenType.OPEN_PAREN) ||
               identical(type, TokenType.OPEN_SQUARE_BRACKET)) {
@@ -5174,8 +5180,13 @@
           TypeParamOrArgInfo typeArg = computeTypeParamOrArg(identifier);
           if (typeArg != noTypeParamOrArg) {
             Token endTypeArguments = typeArg.skip(identifier);
-            if (optional(".", endTypeArguments.next!)) {
-              return parseImplicitCreationExpression(token, typeArg);
+            Token afterTypeArguments = endTypeArguments.next!;
+            if (optional(".", afterTypeArguments)) {
+              Token afterPeriod = afterTypeArguments.next!;
+              if (afterPeriod.isIdentifier &&
+                  optional('(', afterPeriod.next!)) {
+                return parseImplicitCreationExpression(token, typeArg);
+              }
             }
           }
         }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
index ecacdd9..03a290d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
@@ -348,7 +348,53 @@
 /// possible other constructs will pass (e.g., 'a < C, D > 3').
 TypeParamOrArgInfo computeMethodTypeArguments(Token token) {
   TypeParamOrArgInfo typeArg = computeTypeParamOrArg(token);
-  return optional('(', typeArg.skip(token).next!) && !typeArg.recovered
+  return mayFollowTypeArgs(typeArg.skip(token).next!) && !typeArg.recovered
       ? typeArg
       : noTypeParamOrArg;
 }
+
+/// Indicates whether the given [token] is allowed to follow a list of type
+/// arguments used as a selector after an expression.
+///
+/// This is used for disambiguating constructs like `f(a<b,c>(d))` and
+/// `f(a<b,c>-d)`.  In the case of `f(a<b,c>(d))`, `true` will be returned,
+/// indicating that the `<` and `>` should be interpreted as delimiting type
+/// arguments (so one argument is being passed to `f` -- a call to the generic
+/// function `a`).  In the case of `f(a<b,c>-d)`, `false` will be returned,
+/// indicating that the `<` and `>` should be interpreted as operators (so two
+/// arguments are being passed to `f`: `a < b` and `c > -d`).
+bool mayFollowTypeArgs(Token token) {
+  const Set<String> tokensThatMayFollowTypeArg = {
+    '(',
+    ')',
+    ']',
+    '}',
+    ':',
+    ';',
+    ',',
+    '.',
+    '?',
+    '==',
+    '!=',
+    '..',
+    '?.',
+    '??',
+    '?..',
+    '&',
+    '|',
+    '^',
+    '+',
+    '*',
+    '%',
+    '/',
+    '~/'
+  };
+  if (token.type == TokenType.EOF) {
+    // The spec doesn't have anything to say about this case, since an
+    // expression can't occur at the end of a file, but for testing it's to our
+    // advantage to allow EOF after type arguments, so that an isolated `f<x>`
+    // can be parsed as an expression.
+    return true;
+  }
+  return tokensThatMayFollowTypeArg.contains(token.lexeme);
+}
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 56ca0de..344f997 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -46,8 +46,8 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
-import 'package:analyzer/src/dart/analysis/status.dart' as nd;
+import 'package:analyzer/src/dart/analysis/driver.dart' as analysis;
+import 'package:analyzer/src/dart/analysis/status.dart' as analysis;
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
@@ -340,7 +340,7 @@
 
   /// Send status notification to the client. The state of analysis is given by
   /// the [status] information.
-  void sendStatusNotificationNew(nd.AnalysisStatus status) {
+  void sendStatusNotificationNew(analysis.AnalysisStatus status) {
     if (status.isAnalyzing) {
       _onAnalysisStartedController.add(true);
     }
@@ -677,7 +677,7 @@
   }
 
   @override
-  void listenAnalysisDriver(nd.AnalysisDriver analysisDriver) {
+  void listenAnalysisDriver(analysis.AnalysisDriver analysisDriver) {
     analysisDriver.results.listen((result) {
       var path = result.path!;
       filesToFlush.add(path);
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 448bc17..b884c5f 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -37,7 +37,7 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
+import 'package:analyzer/src/dart/analysis/driver.dart' as analysis;
 import 'package:analyzer/src/dart/analysis/file_byte_store.dart'
     show EvictingFileByteStore;
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
@@ -80,7 +80,7 @@
 
   late ByteStore byteStore;
 
-  late nd.AnalysisDriverScheduler analysisDriverScheduler;
+  late analysis.AnalysisDriverScheduler analysisDriverScheduler;
 
   DeclarationsTracker? declarationsTracker;
   DeclarationsTrackerData? declarationsTrackerData;
@@ -182,7 +182,7 @@
 
     byteStore = createByteStore(resourceProvider);
 
-    analysisDriverScheduler = nd.AnalysisDriverScheduler(
+    analysisDriverScheduler = analysis.AnalysisDriverScheduler(
         analysisPerformanceLogger,
         driverWatcher: pluginWatcher);
 
@@ -212,7 +212,8 @@
   }
 
   /// A table mapping [Folder]s to the [AnalysisDriver]s associated with them.
-  Map<Folder, nd.AnalysisDriver> get driverMap => contextManager.driverMap;
+  Map<Folder, analysis.AnalysisDriver> get driverMap =>
+      contextManager.driverMap;
 
   /// Return the total time the server's been alive.
   Duration get uptime {
@@ -255,7 +256,7 @@
   /// Return an analysis driver to which the file with the given [path] is
   /// added if one exists, otherwise a driver in which the file was analyzed if
   /// one exists, otherwise the first driver, otherwise `null`.
-  nd.AnalysisDriver? getAnalysisDriver(String path) {
+  analysis.AnalysisDriver? getAnalysisDriver(String path) {
     var drivers = driverMap.values.toList();
     if (drivers.isNotEmpty) {
       // Sort the drivers so that more deeply nested contexts will be checked
@@ -395,7 +396,7 @@
     return contextManager.isAnalyzed(path);
   }
 
-  void logExceptionResult(nd.ExceptionResult result) {
+  void logExceptionResult(analysis.ExceptionResult result) {
     var message = 'Analysis failed: ${result.filePath}';
     if (result.contextKey != null) {
       message += ' context: ${result.contextKey}';
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 9958c9b..17d912b 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -42,8 +42,8 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
-import 'package:analyzer/src/dart/analysis/status.dart' as nd;
+import 'package:analyzer/src/dart/analysis/driver.dart' as analysis;
+import 'package:analyzer/src/dart/analysis/status.dart' as analysis;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
@@ -543,7 +543,7 @@
 
   /// Send status notification to the client. The state of analysis is given by
   /// the [status] information.
-  Future<void> sendStatusNotification(nd.AnalysisStatus status) async {
+  Future<void> sendStatusNotification(analysis.AnalysisStatus status) async {
     // Send old custom notifications to clients that do not support $/progress.
     // TODO(dantup): Remove this custom notification (and related classes) when
     // it's unlikely to be in use by any clients.
@@ -815,7 +815,7 @@
   }
 
   @override
-  void listenAnalysisDriver(nd.AnalysisDriver analysisDriver) {
+  void listenAnalysisDriver(analysis.AnalysisDriver analysisDriver) {
     // TODO(dantup): Is this required, or covered by
     // addContextsToDeclarationsTracker? The original server does not appear to
     // have an equivalent call.
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index 4fa69d3..d03e08c 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -16,6 +16,9 @@
   /// Feature information for non-nullability by default.
   static final non_nullable = ExperimentalFeatures.non_nullable;
 
+  /// Feature information for constructor tear-offs.
+  static final constructor_tearoffs = ExperimentalFeatures.constructor_tearoffs;
+
   /// Feature information for control flow collections.
   static final control_flow_collections =
       ExperimentalFeatures.control_flow_collections;
diff --git a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
index 486a073..c54627b 100644
--- a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
+++ b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
@@ -136,9 +136,15 @@
 
     CompilationUnit definingUnit = _parse(source);
     inputUnits.add(
-      LinkInputUnit(null, source, false, definingUnit),
+      LinkInputUnit.tmp1(
+        partDirectiveIndex: null,
+        source: source,
+        isSynthetic: false,
+        unit: definingUnit,
+      ),
     );
 
+    var partDirectiveIndex = 0;
     for (Directive directive in definingUnit.directives) {
       if (directive is NamespaceDirective) {
         String libUri = directive.uri.stringValue!;
@@ -149,13 +155,22 @@
         Source partSource = context.sourceFactory.resolveUri(source, partUri)!;
         CompilationUnit partUnit = _parse(partSource);
         inputUnits.add(
-          LinkInputUnit(partUri, partSource, false, partUnit),
+          LinkInputUnit.tmp1(
+            partUriStr: partUri,
+            partDirectiveIndex: partDirectiveIndex++,
+            source: partSource,
+            isSynthetic: false,
+            unit: partUnit,
+          ),
         );
       }
     }
 
     inputLibraries.add(
-      LinkInputLibrary(source, inputUnits),
+      LinkInputLibrary.tmp1(
+        source: source,
+        units: inputUnits,
+      ),
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 5f2b5b9..e05a519 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -45,7 +45,6 @@
 var counterFileStateRefresh = 0;
 var counterUnlinkedBytes = 0;
 var counterUnlinkedLinkedBytes = 0;
-int fileObjectId = 0;
 var timerFileStateRefresh = Stopwatch();
 
 /// A library from [SummaryDataStore].
@@ -117,9 +116,6 @@
   /// The language version for the package that contains this file.
   final Version packageLanguageVersion;
 
-  int id = fileObjectId++;
-  int? refreshId;
-
   bool? _exists;
   String? _content;
   String? _contentHash;
@@ -417,7 +413,6 @@
   /// Return `true` if the API signature changed since the last refresh.
   bool refresh({bool allowCached = false}) {
     counterFileStateRefresh++;
-    refreshId = fileObjectId++;
 
     var timerWasRunning = timerFileStateRefresh.isRunning;
     if (!timerWasRunning) {
@@ -515,7 +510,7 @@
 
   @override
   String toString() {
-    return '[id: $id][rid: $refreshId]$uri = $path';
+    return '$uri = $path';
   }
 
   /// Return the [FileState] for the given [relativeUri], or `null` if the
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 9cea8d5..8fc9a4a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -38,7 +38,6 @@
 class LibraryContext {
   static const _maxLinkedDataInBytes = 64 * 1024 * 1024;
 
-  final int id = fileObjectId++;
   final LibraryContextTestView testView;
   final PerformanceLog logger;
   final ByteStore byteStore;
@@ -100,21 +99,15 @@
     var bytesGet = 0;
     var bytesPut = 0;
 
-    var thisLoadLogBuffer = StringBuffer();
-
-    void loadBundle(LibraryCycle cycle, String debugPrefix) {
+    void loadBundle(LibraryCycle cycle) {
       if (cycle.libraries.isEmpty ||
           elementFactory.hasLibrary(cycle.libraries.first.uriStr)) {
         return;
       }
 
-      thisLoadLogBuffer.writeln('$debugPrefix$cycle');
-
       librariesTotal += cycle.libraries.length;
 
-      cycle.directDependencies.forEach(
-        (e) => loadBundle(e, '$debugPrefix  '),
-      );
+      cycle.directDependencies.forEach(loadBundle);
 
       var unitsInformativeBytes = <Uri, Uint8List>{};
       for (var library in cycle.libraries) {
@@ -152,55 +145,22 @@
             partIndex++;
 
             inputUnits.add(
-              link2.LinkInputUnit(
-                partUriStr,
-                file.source,
-                isSynthetic,
-                unit,
+              link2.LinkInputUnit.tmp1(
+                // TODO(scheglov) bad, group part data
+                partDirectiveIndex: partIndex - 1,
+                partUriStr: partUriStr,
+                source: file.source,
+                isSynthetic: isSynthetic,
+                unit: unit,
               ),
             );
-
-            // TODO(scheglov) remove after fixing linking issues
-            {
-              var existingLibraryReference =
-                  elementFactory.rootReference[libraryFile.uriStr];
-              if (existingLibraryReference != null) {
-                var existingElement =
-                    existingLibraryReference.element as LibraryElement?;
-                if (existingElement != null) {
-                  var buffer = StringBuffer();
-
-                  buffer.writeln('[The library is already loaded]');
-                  buffer.writeln();
-
-                  var existingSource = existingElement.source;
-                  buffer.writeln('[oldUri: ${existingSource.uri}]');
-                  buffer.writeln('[oldPath: ${existingSource.fullName}]');
-                  buffer.writeln('[newUri: ${libraryFile.uriStr}]');
-                  buffer.writeln('[newPath: ${libraryFile.path}]');
-                  buffer.writeln('[cycle: $cycle]');
-                  buffer.writeln();
-
-                  buffer.writeln('Bundles loaded in this load2() invocation:');
-                  buffer.writeln(thisLoadLogBuffer);
-                  buffer.writeln();
-
-                  var libraryRefs = elementFactory.rootReference.children;
-                  var libraryUriList = libraryRefs.map((e) => e.name).toList();
-                  buffer.writeln('[elementFactory.libraries: $libraryUriList]');
-
-                  throw CaughtExceptionWithFiles(
-                    'Cycle loading state error',
-                    StackTrace.current,
-                    {'status': buffer.toString()},
-                  );
-                }
-              }
-            }
           }
 
           inputLibraries.add(
-            link2.LinkInputLibrary(librarySource, inputUnits),
+            link2.LinkInputLibrary.tmp1(
+              source: librarySource,
+              units: inputUnits,
+            ),
           );
         }
         inputsTimer.stop();
@@ -240,7 +200,7 @@
 
     logger.run('Prepare linked bundles', () {
       var libraryCycle = targetLibrary.libraryCycle;
-      loadBundle(libraryCycle, '');
+      loadBundle(libraryCycle);
       logger.writeln(
         '[librariesTotal: $librariesTotal]'
         '[librariesLoaded: $librariesLoaded]'
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
index d21d4e1..413d6ab 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
@@ -19,8 +19,6 @@
 
 /// Information about libraries that reference each other, so form a cycle.
 class LibraryCycle {
-  final int id = fileObjectId++;
-
   /// The libraries that belong to this cycle.
   final List<FileState> libraries = [];
 
@@ -68,7 +66,7 @@
 
   @override
   String toString() {
-    return '[[id: $id] ' + libraries.join(', ') + ']';
+    return '[' + libraries.join(', ') + ']';
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index bebd7f3..cc4db0c 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -4,7 +4,8 @@
 
 import 'dart:math' as math;
 
-import 'package:analyzer/dart/ast/ast.dart' show AstNode, ConstructorName;
+import 'package:analyzer/dart/ast/ast.dart'
+    show Annotation, AstNode, ConstructorName;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
@@ -209,11 +210,12 @@
 
       if (inferred is FunctionType &&
           inferred.typeFormals.isNotEmpty &&
-          !genericMetadataIsEnabled) {
+          !genericMetadataIsEnabled &&
+          errorReporter != null) {
         if (failAtError) return null;
         var typeFormals = inferred.typeFormals;
         var typeFormalsStr = typeFormals.map(_elementStr).join(', ');
-        errorReporter?.reportErrorForNode(
+        errorReporter.reportErrorForNode(
             CompileTimeErrorCode.COULD_NOT_INFER, errorNode!, [
           parameter.name,
           ' Inferred candidate type ${_typeStr(inferred)} has type parameters'
@@ -229,20 +231,11 @@
         // by [infer], with [typeParam] filled in as its bounds. This is
         // considered a failure of inference, under the "strict-inference"
         // mode.
-        if (errorNode is ConstructorName &&
-            !(errorNode.type.type as InterfaceType)
-                .element
-                .hasOptionalTypeArgs) {
-          String constructorName = errorNode.name == null
-              ? errorNode.type.name.name
-              : '${errorNode.type}.${errorNode.name}';
-          errorReporter?.reportErrorForNode(
-              HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION,
-              errorNode,
-              [constructorName]);
-        }
-        // TODO(srawlins): More inference failure cases, like functions, and
-        // function expressions.
+        _reportInferenceFailure(
+          errorReporter: errorReporter,
+          errorNode: errorNode,
+          genericMetadataIsEnabled: genericMetadataIsEnabled,
+        );
       }
     }
 
@@ -486,6 +479,43 @@
     }
   }
 
+  /// Reports an inference failure on [errorNode] according to its type.
+  void _reportInferenceFailure({
+    ErrorReporter? errorReporter,
+    AstNode? errorNode,
+    required bool genericMetadataIsEnabled,
+  }) {
+    if (errorReporter == null || errorNode == null) {
+      return;
+    }
+    if (errorNode is ConstructorName &&
+        !(errorNode.type.type as InterfaceType).element.hasOptionalTypeArgs) {
+      String constructorName = errorNode.name == null
+          ? errorNode.type.name.name
+          : '${errorNode.type}.${errorNode.name}';
+      errorReporter.reportErrorForNode(
+          HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION,
+          errorNode,
+          [constructorName]);
+    } else if (errorNode is Annotation) {
+      if (genericMetadataIsEnabled) {
+        // Only report an error if generic metadata is valid syntax.
+        var element = errorNode.name.staticElement;
+        if (element != null && !element.hasOptionalTypeArgs) {
+          String constructorName = errorNode.constructorName == null
+              ? errorNode.name.name
+              : '${errorNode.name.name}.${errorNode.constructorName}';
+          errorReporter.reportErrorForNode(
+              HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION,
+              errorNode,
+              [constructorName]);
+        }
+      }
+    }
+    // TODO(srawlins): More inference failure cases, like functions, and
+    // function expressions.
+  }
+
   /// If in a legacy library, return the legacy version of the [type].
   /// Otherwise, return the original type.
   DartType _toLegacyElementIfOptOut(DartType type) {
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index a175010..6ce2ccd 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -862,17 +862,22 @@
             partIndex++;
 
             inputUnits.add(
-              link2.LinkInputUnit(
-                partUriStr,
-                file.source,
-                isSynthetic,
-                unit,
+              link2.LinkInputUnit.tmp1(
+                // TODO(scheglov) bad, group part data
+                partDirectiveIndex: partIndex - 1,
+                partUriStr: partUriStr,
+                source: file.source,
+                isSynthetic: isSynthetic,
+                unit: unit,
               ),
             );
           }
 
           inputLibraries.add(
-            link2.LinkInputLibrary(librarySource, inputUnits),
+            link2.LinkInputLibrary.tmp1(
+              source: librarySource,
+              units: inputUnits,
+            ),
           );
         }
         inputsTimer.stop();
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index aefa6c7..e46200b 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -140,6 +140,9 @@
   /// `true` if variance behavior is enabled
   final bool enableVariance;
 
+  /// `true` if constructor tearoffs are enabled
+  final bool enableConstructorTearoffs;
+
   final FeatureSet _featureSet;
 
   AstBuilder(ErrorReporter errorReporter, this.fileUri, this.isFullAst,
@@ -155,6 +158,8 @@
         enableNonFunctionTypeAliases =
             _featureSet.isEnabled(Feature.nonfunction_type_aliases),
         enableVariance = _featureSet.isEnabled(Feature.variance),
+        enableConstructorTearoffs =
+            _featureSet.isEnabled(Feature.constructor_tearoffs),
         uri = uri ?? fileUri;
 
   NodeList<ClassMember> get currentDeclarationMembers {
@@ -3514,6 +3519,39 @@
   }
 
   @override
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    var typeArguments = pop() as TypeArgumentList;
+    var receiver = pop() as Expression;
+    if (!enableConstructorTearoffs) {
+      var feature = ExperimentalFeatures.constructor_tearoffs;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        typeArguments.leftBracket,
+        typeArguments.rightBracket,
+      );
+      // Since analyzer visitors don't yet support constructor tear-offs, create
+      // a FunctionExpressionInvocation with a synthetic argument list instead.
+      // TODO(paulberry): once we have visitor support for constructor
+      // tear-offs, fall through and return a FunctionReference instead since
+      // that should lead to better quality error recovery.
+      var syntheticOffset = typeArguments.rightBracket.end;
+      push(ast.functionExpressionInvocation(
+          receiver,
+          typeArguments,
+          ast.argumentList(
+              SyntheticToken(TokenType.OPEN_PAREN, syntheticOffset),
+              [],
+              SyntheticToken(TokenType.CLOSE_PAREN, syntheticOffset))));
+      return;
+    }
+    push(ast.functionReference(
+        function: receiver, typeArguments: typeArguments));
+  }
+
+  @override
   void handleTypeVariablesDefined(Token token, int count) {
     debugEvent("handleTypeVariablesDefined");
     assert(count > 0);
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index 225b860..cc67f58 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -238,29 +238,45 @@
   final Source source;
   final List<LinkInputUnit> units;
 
+  @Deprecated('Use LinkInputLibrary.tmp1() with instead')
   LinkInputLibrary(this.source, this.units);
 
+  LinkInputLibrary.tmp1({
+    required this.source,
+    required this.units,
+  });
+
   Uri get uri => source.uri;
 
   String get uriStr => '$uri';
 }
 
 class LinkInputUnit {
+  final int? partDirectiveIndex;
   final String? partUriStr;
   final Source source;
   final bool isSynthetic;
   final ast.CompilationUnit unit;
 
+  @Deprecated('Use LinkInputUnit.tmp1() with instead')
   LinkInputUnit(
     this.partUriStr,
     this.source,
     this.isSynthetic,
     this.unit,
-  );
+  ) : partDirectiveIndex = null;
 
-  String get uriStr {
-    return '${source.uri}';
-  }
+  LinkInputUnit.tmp1({
+    required this.partDirectiveIndex,
+    this.partUriStr,
+    required this.source,
+    required this.isSynthetic,
+    required this.unit,
+  });
+
+  Uri get uri => source.uri;
+
+  String get uriStr => '$uri';
 }
 
 class LinkResult {
diff --git a/pkg/analyzer/test/generated/function_reference_parser_test.dart b/pkg/analyzer/test/generated/function_reference_parser_test.dart
new file mode 100644
index 0000000..fe9091f
--- /dev/null
+++ b/pkg/analyzer/test/generated/function_reference_parser_test.dart
@@ -0,0 +1,357 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'parser_test_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FunctionReferenceParserTest);
+  });
+}
+
+/// Tests exercising the fasta parser's handling of generic instantiations.
+@reflectiveTest
+class FunctionReferenceParserTest extends FastaParserTestCase {
+  /// Verifies that the given [node] matches `f<a, b>`.
+  void expect_f_a_b(AstNode node) {
+    var functionReference = node as FunctionReference;
+    expect((functionReference.function as SimpleIdentifier).name, 'f');
+    var typeArgs = functionReference.typeArguments!.arguments;
+    expect(typeArgs, hasLength(2));
+    expect(((typeArgs[0] as TypeName).name as SimpleIdentifier).name, 'a');
+    expect(((typeArgs[1] as TypeName).name as SimpleIdentifier).name, 'b');
+  }
+
+  void expect_two_args(MethodInvocation methodInvocation) {
+    var arguments = methodInvocation.argumentList.arguments;
+    expect(arguments, hasLength(2));
+    expect(arguments[0], TypeMatcher<BinaryExpression>());
+    expect(arguments[1], TypeMatcher<BinaryExpression>());
+  }
+
+  void test_feature_disabled() {
+    var expression =
+        (parseStatement('f<a, b>;', featureSet: preConstructorTearoffs)
+                as ExpressionStatement)
+            .expression;
+    // TODO(paulberry): once we have visitor support for FunctionReference, this
+    // should be parsed as a FunctionReference, so we should be able to validate
+    // it using `expect_f_a_b`.  But for now it's parsed as a
+    // FunctionExpressionInvocation with synthetic arguments.
+    var functionExpressionInvocation =
+        expression as FunctionExpressionInvocation;
+    expect(
+        (functionExpressionInvocation.function as SimpleIdentifier).name, 'f');
+    expect(functionExpressionInvocation.argumentList.arguments, isEmpty);
+    var typeArgs = functionExpressionInvocation.typeArguments!.arguments;
+    expect(typeArgs, hasLength(2));
+    expect(((typeArgs[0] as TypeName).name as SimpleIdentifier).name, 'a');
+    expect(((typeArgs[1] as TypeName).name as SimpleIdentifier).name, 'b');
+    listener.assertErrors([
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 1, 6),
+    ]);
+  }
+
+  void test_followingToken_accepted_ampersand() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> & 0', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_asterisk() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> * 0', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_bar() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> | 0', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_caret() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> ^ 0', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_closeBrace() {
+    expect_f_a_b((parseExpression('{f<a, b>}', featureSet: constructorTearoffs)
+            as SetOrMapLiteral)
+        .elements[0]);
+  }
+
+  void test_followingToken_accepted_closeBracket() {
+    expect_f_a_b((parseExpression('[f<a, b>]', featureSet: constructorTearoffs)
+            as ListLiteral)
+        .elements[0]);
+  }
+
+  void test_followingToken_accepted_closeParen() {
+    expect_f_a_b((parseExpression('g(f<a, b>)', featureSet: constructorTearoffs)
+            as MethodInvocation)
+        .argumentList
+        .arguments[0]);
+  }
+
+  void test_followingToken_accepted_colon() {
+    expect_f_a_b(
+        ((parseExpression('{f<a, b>: null}', featureSet: constructorTearoffs)
+                    as SetOrMapLiteral)
+                .elements[0] as MapLiteralEntry)
+            .key);
+  }
+
+  void test_followingToken_accepted_comma() {
+    expect_f_a_b(
+        (parseExpression('[f<a, b>, null]', featureSet: constructorTearoffs)
+                as ListLiteral)
+            .elements[0]);
+  }
+
+  void test_followingToken_accepted_equals() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> == null', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_not_equals() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> != null', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_openParen() {
+    // This is a special case because when a `(` follows `<typeArguments>` it is
+    // parsed as a MethodInvocation rather than a GenericInstantiation.
+    var methodInvocation =
+        parseExpression('f<a, b>()', featureSet: constructorTearoffs)
+            as MethodInvocation;
+    expect(methodInvocation.methodName.name, 'f');
+    var typeArgs = methodInvocation.typeArguments!.arguments;
+    expect(typeArgs, hasLength(2));
+    expect(((typeArgs[0] as TypeName).name as SimpleIdentifier).name, 'a');
+    expect(((typeArgs[1] as TypeName).name as SimpleIdentifier).name, 'b');
+    expect(methodInvocation.argumentList.arguments, isEmpty);
+  }
+
+  void test_followingToken_accepted_percent() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> % 0', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_period_methodInvocation() {
+    // This is a special case because `f<a, b>.methodName(...)` is parsed as an
+    // InstanceCreationExpression.
+    var instanceCreationExpression =
+        parseExpression('f<a, b>.toString()', featureSet: constructorTearoffs)
+            as InstanceCreationExpression;
+    var constructorName = instanceCreationExpression.constructorName;
+    var type = constructorName.type;
+    expect((type.name as SimpleIdentifier).name, 'f');
+    var typeArgs = type.typeArguments!.arguments;
+    expect(typeArgs, hasLength(2));
+    expect(((typeArgs[0] as TypeName).name as SimpleIdentifier).name, 'a');
+    expect(((typeArgs[1] as TypeName).name as SimpleIdentifier).name, 'b');
+    expect(constructorName.name!.name, 'toString');
+    expect(instanceCreationExpression.argumentList.arguments, isEmpty);
+  }
+
+  void test_followingToken_accepted_period_methodInvocation_generic() {
+    expect_f_a_b(
+        (parseExpression('f<a, b>.foo<c>()', featureSet: constructorTearoffs)
+                as MethodInvocation)
+            .target!);
+  }
+
+  void test_followingToken_accepted_period_period() {
+    expect_f_a_b(
+        (parseExpression('f<a, b>..toString()', featureSet: constructorTearoffs)
+                as CascadeExpression)
+            .target);
+  }
+
+  void test_followingToken_accepted_period_propertyAccess() {
+    expect_f_a_b(
+        (parseExpression('f<a, b>.hashCode', featureSet: constructorTearoffs)
+                as PropertyAccess)
+            .target!);
+  }
+
+  void test_followingToken_accepted_plus() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> + 0', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_question() {
+    expect_f_a_b((parseExpression('f<a, b> ? null : null',
+            featureSet: constructorTearoffs) as ConditionalExpression)
+        .condition);
+  }
+
+  void test_followingToken_accepted_question_period_methodInvocation() {
+    expect_f_a_b(
+        (parseExpression('f<a, b>?.toString()', featureSet: constructorTearoffs)
+                as MethodInvocation)
+            .target!);
+  }
+
+  void test_followingToken_accepted_question_period_methodInvocation_generic() {
+    expect_f_a_b(
+        (parseExpression('f<a, b>?.foo<c>()', featureSet: constructorTearoffs)
+                as MethodInvocation)
+            .target!);
+  }
+
+  void test_followingToken_accepted_question_period_period() {
+    expect_f_a_b((parseExpression('f<a, b>?..toString()',
+            featureSet: constructorTearoffs) as CascadeExpression)
+        .target);
+  }
+
+  void test_followingToken_accepted_question_period_propertyAccess() {
+    expect_f_a_b(
+        (parseExpression('f<a, b>?.hashCode', featureSet: constructorTearoffs)
+                as PropertyAccess)
+            .target!);
+  }
+
+  void test_followingToken_accepted_question_question() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> ?? 0', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_semicolon() {
+    expect_f_a_b((parseStatement('f<a, b>;', featureSet: constructorTearoffs)
+            as ExpressionStatement)
+        .expression);
+    listener.assertNoErrors();
+  }
+
+  void test_followingToken_accepted_slash() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> / 1', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_accepted_tilde_slash() {
+    expect_f_a_b(
+        (parseExpression('f<a, b> ~/ 1', featureSet: constructorTearoffs)
+                as BinaryExpression)
+            .leftOperand);
+  }
+
+  void test_followingToken_rejected_bang_openBracket() {
+    expect_two_args(
+        parseExpression('f(a<b,c>![d])', featureSet: constructorTearoffs)
+            as MethodInvocation);
+  }
+
+  void test_followingToken_rejected_bang_paren() {
+    expect_two_args(
+        parseExpression('f(a<b,c>!(d))', featureSet: constructorTearoffs)
+            as MethodInvocation);
+  }
+
+  void test_followingToken_rejected_lessThan() {
+    // Note: in principle we could parse this as a generic instantiation of a
+    // generic instantiation, but such an expression would be meaningless so we
+    // reject it at the parser level.
+    parseExpression('f<a><b>', featureSet: constructorTearoffs, errors: [
+      expectedError(ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, 3, 1),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 0),
+    ]);
+  }
+
+  void test_followingToken_rejected_minus() {
+    expect_two_args(
+        parseExpression('f(a<b,c>-d)', featureSet: constructorTearoffs)
+            as MethodInvocation);
+  }
+
+  void test_followingToken_rejected_openBracket() {
+    expect_two_args(
+        parseExpression('f(a<b,c>[d])', featureSet: constructorTearoffs)
+            as MethodInvocation);
+  }
+
+  void test_followingToken_rejected_openBracket_error() {
+    // Note that theoretically this could be successfully parsed by interpreting
+    // `<` and `>` as delimiting type arguments, but the parser doesn't have
+    // enough lookahead to see that this is the only possible error-free parse;
+    // it commits to interpreting `<` and `>` as operators when it sees the `[`.
+    expect_two_args(parseExpression('f(a<b,c>[d]>e)',
+        featureSet: constructorTearoffs,
+        errors: [
+          expectedError(
+              ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, 11, 1),
+        ]) as MethodInvocation);
+  }
+
+  void test_followingToken_rejected_openBracket_unambiguous() {
+    expect_two_args(
+        parseExpression('f(a<b,c>[d, e])', featureSet: constructorTearoffs)
+            as MethodInvocation);
+  }
+
+  void test_methodTearoff() {
+    var functionReference =
+        parseExpression('f().m<a, b>', featureSet: constructorTearoffs)
+            as FunctionReference;
+    var function = functionReference.function as PropertyAccess;
+    var target = function.target as MethodInvocation;
+    expect(target.methodName.name, 'f');
+    expect(function.propertyName.name, 'm');
+    var typeArgs = functionReference.typeArguments!.arguments;
+    expect(typeArgs, hasLength(2));
+    expect(((typeArgs[0] as TypeName).name as SimpleIdentifier).name, 'a');
+    expect(((typeArgs[1] as TypeName).name as SimpleIdentifier).name, 'b');
+  }
+
+  void test_prefixedIdentifier() {
+    var functionReference =
+        parseExpression('prefix.f<a, b>', featureSet: constructorTearoffs)
+            as FunctionReference;
+    var function = functionReference.function as PrefixedIdentifier;
+    expect(function.prefix.name, 'prefix');
+    expect(function.identifier.name, 'f');
+    var typeArgs = functionReference.typeArguments!.arguments;
+    expect(typeArgs, hasLength(2));
+    expect(((typeArgs[0] as TypeName).name as SimpleIdentifier).name, 'a');
+    expect(((typeArgs[1] as TypeName).name as SimpleIdentifier).name, 'b');
+  }
+
+  void test_three_identifiers() {
+    var functionReference = parseExpression('prefix.ClassName.m<a, b>',
+        featureSet: constructorTearoffs) as FunctionReference;
+    var function = functionReference.function as PropertyAccess;
+    var target = function.target as PrefixedIdentifier;
+    expect(target.prefix.name, 'prefix');
+    expect(target.identifier.name, 'ClassName');
+    expect(function.propertyName.name, 'm');
+    var typeArgs = functionReference.typeArguments!.arguments;
+    expect(typeArgs, hasLength(2));
+    expect(((typeArgs[0] as TypeName).name as SimpleIdentifier).name, 'a');
+    expect(((typeArgs[1] as TypeName).name as SimpleIdentifier).name, 'b');
+  }
+}
diff --git a/pkg/analyzer/test/generated/parser_test_base.dart b/pkg/analyzer/test/generated/parser_test_base.dart
index 17c0c9f..7498a95 100644
--- a/pkg/analyzer/test/generated/parser_test_base.dart
+++ b/pkg/analyzer/test/generated/parser_test_base.dart
@@ -220,12 +220,18 @@
     implements AbstractParserTestCase {
   static final List<ErrorCode> NO_ERROR_COMPARISON = <ErrorCode>[];
 
+  final constructorTearoffs = FeatureSet.forTesting(
+      sdkVersion: '2.14.0', additionalFeatures: [Feature.constructor_tearoffs]);
+
   final controlFlow = FeatureSet.latestLanguageVersion();
 
   final spread = FeatureSet.latestLanguageVersion();
 
   final nonNullable = FeatureSet.latestLanguageVersion();
 
+  final preConstructorTearoffs = FeatureSet.fromEnableFlags2(
+      sdkLanguageVersion: Version.parse('2.13.0'), flags: []);
+
   final preNonNullable = FeatureSet.fromEnableFlags2(
     sdkLanguageVersion: Version.parse('2.9.0'),
     flags: [],
diff --git a/pkg/analyzer/test/generated/simple_parser_test.dart b/pkg/analyzer/test/generated/simple_parser_test.dart
index 5bdc51f..3a2881c 100644
--- a/pkg/analyzer/test/generated/simple_parser_test.dart
+++ b/pkg/analyzer/test/generated/simple_parser_test.dart
@@ -1419,15 +1419,14 @@
     expect(unit, isNotNull);
     var f = unit.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as ExpressionFunctionBody;
-    expect(body.expression, isInstanceCreationExpression);
-    var creation = body.expression as InstanceCreationExpressionImpl;
-    expect(creation.keyword, isNull);
-    ConstructorName constructorName = creation.constructorName;
-    expect(constructorName.type.toSource(), 'C<E>');
-    expect(constructorName.period, isNotNull);
-    expect(constructorName.name, isNotNull);
-    expect(creation.argumentList, isNotNull);
-    expect(creation.typeArguments!.arguments, hasLength(1));
+    expect(body.expression, isMethodInvocation);
+    var methodInvocation = body.expression as MethodInvocationImpl;
+    var target = methodInvocation.target!;
+    expect(target, isFunctionExpressionInvocation);
+    expect(target.toSource(), 'C<E>()');
+    expect(methodInvocation.methodName.name, 'n');
+    expect(methodInvocation.argumentList, isNotNull);
+    expect(methodInvocation.typeArguments!.arguments, hasLength(1));
   }
 
   void test_parseInstanceCreation_noKeyword_prefix() {
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 197c167..efc1a0e 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -16,6 +16,7 @@
 import 'expression_parser_test.dart' as expression_parser;
 import 'extension_methods_parser_test.dart' as extension_methods_parser;
 import 'formal_parameter_parser_test.dart' as formal_parameter_parser;
+import 'function_reference_parser_test.dart' as function_reference_parser;
 import 'generic_metadata_parser_test.dart' as generic_metadata_parser;
 import 'invalid_code_test.dart' as invalid_code;
 import 'issues_test.dart' as issues;
@@ -56,6 +57,7 @@
     expression_parser.main();
     extension_methods_parser.main();
     formal_parameter_parser.main();
+    function_reference_parser.main();
     generic_metadata_parser.main();
     invalid_code.main();
     issues.main();
diff --git a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
index 07eeb68..e1037ea 100644
--- a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -15,6 +16,43 @@
 
 @reflectiveTest
 class ExperimentNotEnabledTest extends PubPackageResolutionTest {
+  test_constructor_tearoffs_disabled_grammar() async {
+    await assertErrorsInCode('''
+class Foo<X> {
+  const Foo.bar();
+  int get baz => 0;
+}
+main() {
+  Foo<int>.bar.baz();
+}
+''', [
+      // TODO(paulberry): the INVOCATION_OF_NON_FUNCTION_EXPRESSION error is
+      // bogus, and should go away once we implement visitor and resolution
+      // support for constructor tearoffs.
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 67, 3),
+      error(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 70, 5),
+    ]);
+  }
+
+  test_constructor_tearoffs_disabled_grammar_pre_nnbd() async {
+    await assertErrorsInCode('''
+// @dart=2.9
+class Foo<X> {
+  const Foo.bar();
+  int get baz => 0;
+}
+main() {
+  Foo<int>.bar.baz();
+}
+''', [
+      // TODO(paulberry): the INVOCATION_OF_NON_FUNCTION_EXPRESSION error is
+      // bogus, and should go away once we implement visitor and resolution
+      // support for constructor tearoffs.
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 80, 3),
+      error(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 83, 5),
+    ]);
+  }
+
   test_nonFunctionTypeAliases_disabled() async {
     await assertErrorsInCode(r'''
 // @dart = 2.12
diff --git a/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart b/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart
index 69e9b22..02397d2 100644
--- a/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -22,7 +21,6 @@
     super.setUp();
     writeTestPackageAnalysisOptionsFile(
       AnalysisOptionsFileConfig(
-        experiments: [EnableString.nonfunction_type_aliases],
         strictInference: true,
       ),
     );
@@ -40,6 +38,18 @@
     expect(result.errors[0].message, contains("'HashMap.from'"));
   }
 
+  test_constructorNames_named_importPrefix() async {
+    await assertErrorsInCode('''
+import 'dart:collection' as c;
+void f() {
+  c.HashMap.from({1: 1, 2: 2, 3: 3});
+}
+''', [
+      error(HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 44, 14),
+    ]);
+    expect(result.errors[0].message, contains("'c.HashMap.from'"));
+  }
+
   test_constructorNames_unnamed() async {
     await assertErrorsInCode('''
 import 'dart:collection';
@@ -52,6 +62,18 @@
     expect(result.errors[0].message, contains("'HashMap'"));
   }
 
+  test_constructorNames_unnamed_importPrefix() async {
+    await assertErrorsInCode('''
+import 'dart:collection' as c;
+void f() {
+  c.HashMap();
+}
+''', [
+      error(HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 44, 9),
+    ]);
+    expect(result.errors[0].message, contains("'c.HashMap'"));
+  }
+
   test_explicitTypeArgument() async {
     await assertNoErrorsInCode(r'''
 import 'dart:collection';
@@ -61,6 +83,54 @@
 ''');
   }
 
+  test_genericMetadata_missingTypeArg() async {
+    await assertErrorsInCode(r'''
+class C<T> {
+  const C();
+}
+
+@C()
+void f() {}
+''', [
+      error(HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 29, 4),
+    ]);
+  }
+
+  test_genericMetadata_missingTypeArg_withoutGenericMetadata() async {
+    writeTestPackageConfig(PackageConfigFileBuilder(), languageVersion: '2.12');
+    await assertNoErrorsInCode(r'''
+class C<T> {
+  const C();
+}
+
+@C()
+void f() {}
+''');
+  }
+
+  test_genericMetadata_upwardsInference() async {
+    await assertNoErrorsInCode(r'''
+class C<T> {
+  final T f;
+  const C(this.f);
+}
+
+@C(7)
+void g() {}
+''');
+  }
+
+  test_genericMetadata_withTypeArg() async {
+    await assertNoErrorsInCode(r'''
+class C<T> {
+  const C();
+}
+
+@C<int>()
+void f() {}
+''');
+  }
+
   test_missingTypeArgument_downwardInference() async {
     await assertNoErrorsInCode(r'''
 import 'dart:collection';
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index b07b6f8..57f9f33 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -59,7 +59,10 @@
       var inputUnits = <LinkInputUnit>[];
       _addLibraryUnits(source, unit, inputUnits, featureSet);
       inputLibraries.add(
-        LinkInputLibrary(source, inputUnits),
+        LinkInputLibrary.tmp1(
+          source: source,
+          units: inputUnits,
+        ),
       );
     }
 
@@ -95,9 +98,7 @@
     for (var inputLibrary in inputLibraries) {
       for (var inputUnit in inputLibrary.units) {
         var informativeBytes = writeUnitInformative(inputUnit.unit);
-        // TODO(scheglov) store Uri, don't parse
-        var uri = Uri.parse(inputUnit.uriStr);
-        unitsInformativeBytes[uri] = informativeBytes;
+        unitsInformativeBytes[inputUnit.uri] = informativeBytes;
       }
     }
 
@@ -146,10 +147,18 @@
     FeatureSet featureSet,
   ) {
     units.add(
-      LinkInputUnit(null, definingSource, false, definingUnit),
+      LinkInputUnit.tmp1(
+        partDirectiveIndex: null,
+        source: definingSource,
+        isSynthetic: false,
+        unit: definingUnit,
+      ),
     );
+
+    var partDirectiveIndex = -1;
     for (var directive in definingUnit.directives) {
       if (directive is PartDirective) {
+        ++partDirectiveIndex;
         var relativeUriStr = directive.uri.stringValue;
 
         var partSource = sourceFactory.resolveUri(
@@ -161,7 +170,13 @@
           var text = _readSafely(partSource.fullName);
           var unit = parseText(text, featureSet);
           units.add(
-            LinkInputUnit(relativeUriStr, partSource, false, unit),
+            LinkInputUnit.tmp1(
+              partDirectiveIndex: partDirectiveIndex,
+              partUriStr: relativeUriStr,
+              source: partSource,
+              isSynthetic: false,
+              unit: unit,
+            ),
           );
         }
       }
@@ -185,7 +200,10 @@
     var units = <LinkInputUnit>[];
     _addLibraryUnits(source, unit, units, featureSet);
     libraries.add(
-      LinkInputLibrary(source, units),
+      LinkInputLibrary.tmp1(
+        source: source,
+        units: units,
+      ),
     );
 
     void addRelativeUriStr(StringLiteral uriNode) {
diff --git a/pkg/analyzer/test/util/ast_type_matchers.dart b/pkg/analyzer/test/util/ast_type_matchers.dart
index c56bb8d..71a811d 100644
--- a/pkg/analyzer/test/util/ast_type_matchers.dart
+++ b/pkg/analyzer/test/util/ast_type_matchers.dart
@@ -128,6 +128,8 @@
 const isFunctionExpressionInvocation =
     TypeMatcher<FunctionExpressionInvocation>();
 
+const isFunctionReference = TypeMatcher<FunctionReference>();
+
 const isFunctionTypeAlias = TypeMatcher<FunctionTypeAlias>();
 
 const isFunctionTypedFormalParameter =
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 2164ae6..99bf9ab 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -75,7 +75,13 @@
 
 import '../fasta_codes.dart' as fasta;
 
-import '../fasta_codes.dart' show LocatedMessage, Message, noLength, Template;
+import '../fasta_codes.dart'
+    show
+        LocatedMessage,
+        Message,
+        Template,
+        noLength,
+        templateExperimentNotEnabled;
 
 import '../identifiers.dart'
     show Identifier, InitializedIdentifier, QualifiedName, flattenName;
@@ -6295,6 +6301,18 @@
   }
 
   @override
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    /// TODO(johnniwinther, paulberry): add support for this construct when the
+    /// "constructor-tearoffs" feature is enabled.
+    pop(); // typeArguments
+    addProblem(
+        templateExperimentNotEnabled.withArguments('constructor-tearoffs',
+            libraryBuilder.enableConstructorTearoffsVersionInLibrary.toText()),
+        openAngleBracket.charOffset,
+        noLength);
+  }
+
+  @override
   UnresolvedType validateTypeUse(UnresolvedType unresolved,
       {bool nonInstanceAccessIsError, bool allowPotentiallyConstantType}) {
     assert(nonInstanceAccessIsError != null);
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0064a64..b09820a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -313,6 +313,7 @@
   bool _enableNonfunctionTypeAliasesInLibrary;
   bool _enableNonNullableInLibrary;
   Version _enableNonNullableVersionInLibrary;
+  Version _enableConstructorTearoffsVersionInLibrary;
   bool _enableTripleShiftInLibrary;
   bool _enableExtensionMethodsInLibrary;
   bool _enableGenericMetadataInLibrary;
@@ -350,6 +351,11 @@
           .getExperimentEnabledVersionInLibrary(
               ExperimentalFlag.nonNullable, _packageUri ?? importUri);
 
+  Version get enableConstructorTearoffsVersionInLibrary =>
+      _enableConstructorTearoffsVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.constructorTearoffs, _packageUri ?? importUri);
+
   bool get enableTripleShiftInLibrary => _enableTripleShiftInLibrary ??=
       loader.target.isExperimentEnabledInLibraryByVersion(
           ExperimentalFlag.tripleShift,
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 7ea0645..5c14977 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
@@ -2542,6 +2542,14 @@
             DirectParserASTType.HANDLE);
     seen(data);
   }
+
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    DirectParserASTContentTypeArgumentApplicationHandle data =
+        new DirectParserASTContentTypeArgumentApplicationHandle(
+            DirectParserASTType.HANDLE,
+            openAngleBracket: openAngleBracket);
+    seen(data);
+  }
 }
 
 class DirectParserASTContentArgumentsBegin extends DirectParserASTContent {
@@ -6861,3 +6869,16 @@
 
   Map<String, Object?> get deprecatedArguments => {};
 }
+
+class DirectParserASTContentTypeArgumentApplicationHandle
+    extends DirectParserASTContent {
+  final Token openAngleBracket;
+
+  DirectParserASTContentTypeArgumentApplicationHandle(DirectParserASTType type,
+      {required this.openAngleBracket})
+      : super("TypeArgumentApplication", type);
+
+  Map<String, Object?> get deprecatedArguments => {
+        "openAngleBracket": openAngleBracket,
+      };
+}
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart
new file mode 100644
index 0000000..d426546
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart
@@ -0,0 +1,91 @@
+// 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.
+
+// The test cases called `typeArgs_...` verify that `<` and `>` are treated as
+// delimiting type arguments when the `>` is followed by one of the tokens:
+//
+//     ( ) ] } : ; , . ? == != .. ?. ?? ?..
+//     & | ^ + * %  / ~/
+//
+// Unless otherwise noted, these test cases should not result in a parse error,
+// because they can be made into valid expressions through user-defined
+// operators.
+
+var typeArgs_ampersand = f<a, b> & 0;
+var typeArgs_asterisk = f<a, b> * 0;
+var typeArgs_bar = f<a, b> | 0;
+var typeArgs_caret = f<a, b> ^ 0;
+var typeArgs_closeBrace = {f<a, b>};
+var typeArgs_closeBracket = [f<a, b>];
+var typeArgs_closeParen = g(f<a, b>);
+var typeArgs_colon = {f<a, b>: null};
+var typeArgs_comma = [f<a, b>, null];
+var typeArgs_equals = f<a, b> == null;
+var typeArgs_not_equals = f<a, b> != null;
+
+// This is a special case because when a `(` follows `<typeArguments>` it is
+// parsed as a MethodInvocation rather than a GenericInstantiation.
+var typeArgs_openParen = f<a, b>();
+
+var typeArgs_percent = f<a, b> % 0;
+
+// This is a special case because `f<a, b>.methodName(...)` is parsed as an
+// InstanceCreationExpression.
+var typeArgs_period_methodInvocation = f<a, b>.toString();
+
+var typeArgs_period_methodInvocation_generic = f<a, b>.foo<c>();
+var typeArgs_period_period = f<a, b>..toString();
+var typeArgs_period_propertyAccess = f<a, b>.hashCode;
+var typeArgs_plus = f<a, b> + 0;
+
+// Note: this could never be a valid expression because the thing to the left of
+// `?` is required to have type `bool`, and `f<a, b>` can only have type `Type`
+// or a function type.  But it is not the responsibility of the parser to report
+// an error here; that should be done by type analysis.
+var typeArgs_question = f<a, b> ? null : null;
+
+var typeArgs_question_period_methodInvocation = f<a, b>?.toString();
+var typeArgs_question_period_methodInvocation_generic = f<a, b>?.foo<c>();
+var typeArgs_question_period_period = f<a, b>?..toString();
+var typeArgs_question_period_propertyAccess = f<a, b>?.hashCode;
+var typeArgs_question_question = f<a, b> ?? 0;
+var typeArgs_semicolon = f<a, b>;
+var typeArgs_slash = f<a, b> / 1;
+var typeArgs_tilde_slash = f<a, b> ~/ 1;
+
+// The test cases called `operators_...` verify that `<` and `>` are treated as
+// operators when the `>` is not followed by one of the tokens:
+//
+//     ( ) ] } : ; , . ? == != .. ?. ?? ?..
+//     & | ^ + * %  / ~/
+//
+// Unless otherwise noted, these test cases should not result in a parse error,
+// because they can be made into valid expressions through user-defined
+// operators.
+
+// Note: this could never be a valid expression because the thing to the right
+// of `!` is required to have type `bool`, and the type of `[d]` will always be
+// a list type.  But it is not the responsibility of the parser to report an
+// error here; that should be done by type analysis.
+var operators_bang_openBracket = f(a<b,c>![d]);
+
+var operators_bang_paren = f(a<b,c>!(d));
+
+// Note: in principle we could parse this as a generic instantiation of a
+// generic instantiation, but since `<` is not one of the tokens that signals
+// `<` and `>` to be treated as type argument delimiters, the first pair of `<`
+// and `>` is treated as operators, and this results in a parse error.
+var operators_lessThan = f<a><b>;
+
+var operators_minus = f(a<b,c>-d);
+var operators_openBracket = f(a<b,c>[d]);
+
+// Note: in principle we could parse `<b, c>` as type arguments, `[d]` as an
+// index operation, and the final `>` as a greater-than operator, but since `[`
+// is not one of the tokens that signals `<` and `>` to be treated as argument
+// delimiters, the pair of `<` and `>` is treated as operators, and this results
+// in a parse error.
+var operators_openBracket_error = f(a<b,c>[d]>e);
+
+var operators_openBracket_unambiguous = f(a<b,c>[d, e]);
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect
new file mode 100644
index 0000000..1acd3c2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect
@@ -0,0 +1,1008 @@
+Problems reported:
+
+parser/general/function_reference_following_token:79:29: A comparison expression can't be an operand of another comparison expression.
+var operators_lessThan = f<a><b>;
+                            ^
+
+parser/general/function_reference_following_token:79:33: Expected '[' before this.
+var operators_lessThan = f<a><b>;
+                                ^
+
+parser/general/function_reference_following_token:89:46: A comparison expression can't be an operand of another comparison expression.
+var operators_openBracket_error = f(a<b,c>[d]>e);
+                                             ^
+
+beginCompilationUnit(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields()
+      handleNoType(var)
+      handleIdentifier(typeArgs_ampersand, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(&)
+          handleLiteralInt(0)
+        endBinaryExpression(&)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_asterisk, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(*)
+          handleLiteralInt(0)
+        endBinaryExpression(*)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_bar, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(|)
+          handleLiteralInt(0)
+        endBinaryExpression(|)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_caret, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(^)
+          handleLiteralInt(0)
+        endBinaryExpression(^)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_closeBrace, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleNoTypeArguments({)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleLiteralSetOrMap(1, {, null, }, true)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_closeBracket, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleNoTypeArguments([)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleLiteralList(1, [, null, ])
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_closeParen, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(g, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(f, expression)
+          handleNoTypeArguments(<)
+          handleNoArguments(<)
+          handleSend(f, <)
+          beginTypeArguments(<)
+            handleIdentifier(a, typeReference)
+            handleNoTypeArguments(,)
+            handleType(a, null)
+            handleIdentifier(b, typeReference)
+            handleNoTypeArguments(>)
+            handleType(b, null)
+          endTypeArguments(2, <, >)
+          handleTypeArgumentApplication(<)
+        endArguments(1, (, ))
+        handleSend(g, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_colon, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleNoTypeArguments({)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleLiteralNull(null)
+        handleLiteralMapEntry(:, })
+        handleLiteralSetOrMap(1, {, null, }, false)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_comma, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleNoTypeArguments([)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleLiteralNull(null)
+        handleLiteralList(2, [, null, ])
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_equals, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(==)
+          handleLiteralNull(null)
+        endBinaryExpression(==)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_not_equals, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(!=)
+          handleLiteralNull(null)
+        endBinaryExpression(!=)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_openParen, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(f, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_percent, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(%)
+          handleLiteralInt(0)
+        endBinaryExpression(%)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_period_methodInvocation, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        beginImplicitCreationExpression(=)
+          handleIdentifier(f, constructorReference)
+          beginConstructorReference(f)
+            beginTypeArguments(<)
+              handleIdentifier(a, typeReference)
+              handleNoTypeArguments(,)
+              handleType(a, null)
+              handleIdentifier(b, typeReference)
+              handleNoTypeArguments(>)
+              handleType(b, null)
+            endTypeArguments(2, <, >)
+            handleIdentifier(toString, constructorReferenceContinuationAfterTypeArguments)
+          endConstructorReference(f, ., ()
+          beginArguments(()
+          endArguments(0, (, ))
+        endImplicitCreationExpression(=)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_period_methodInvocation_generic, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleIdentifier(foo, expressionContinuation)
+        beginTypeArguments(<)
+          handleIdentifier(c, typeReference)
+          handleNoTypeArguments(>)
+          handleType(c, null)
+        endTypeArguments(1, <, >)
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(foo, ;)
+        handleEndingBinaryExpression(.)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_period_period, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginCascade(..)
+          handleIdentifier(toString, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(toString, ;)
+          handleEndingBinaryExpression(..)
+        endCascade()
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_period_propertyAccess, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleIdentifier(hashCode, expressionContinuation)
+        handleNoTypeArguments(;)
+        handleNoArguments(;)
+        handleSend(hashCode, ;)
+        handleEndingBinaryExpression(.)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_plus, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(+)
+          handleLiteralInt(0)
+        endBinaryExpression(+)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_question, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginConditionalExpression(?)
+          handleLiteralNull(null)
+          handleConditionalExpressionColon()
+          handleLiteralNull(null)
+        endConditionalExpression(?, :)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_question_period_methodInvocation, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleIdentifier(toString, expressionContinuation)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(toString, ;)
+        handleEndingBinaryExpression(?.)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_question_period_methodInvocation_generic, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleIdentifier(foo, expressionContinuation)
+        beginTypeArguments(<)
+          handleIdentifier(c, typeReference)
+          handleNoTypeArguments(>)
+          handleType(c, null)
+        endTypeArguments(1, <, >)
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(foo, ;)
+        handleEndingBinaryExpression(?.)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_question_period_period, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginCascade(?..)
+          handleIdentifier(toString, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(toString, ;)
+          handleEndingBinaryExpression(?..)
+        endCascade()
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_question_period_propertyAccess, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        handleIdentifier(hashCode, expressionContinuation)
+        handleNoTypeArguments(;)
+        handleNoArguments(;)
+        handleSend(hashCode, ;)
+        handleEndingBinaryExpression(?.)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_question_question, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(??)
+          handleLiteralInt(0)
+        endBinaryExpression(??)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_semicolon, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_slash, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(/)
+          handleLiteralInt(1)
+        endBinaryExpression(/)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(typeArgs_tilde_slash, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+        beginBinaryExpression(~/)
+          handleLiteralInt(1)
+        endBinaryExpression(~/)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(operators_bang_openBracket, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(<)
+          handleNoArguments(<)
+          handleSend(a, <)
+          beginBinaryExpression(<)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(,)
+            handleNoArguments(,)
+            handleSend(b, ,)
+          endBinaryExpression(<)
+          handleIdentifier(c, expression)
+          handleNoTypeArguments(>)
+          handleNoArguments(>)
+          handleSend(c, >)
+          beginBinaryExpression(>)
+            handleNoTypeArguments([)
+            handleIdentifier(d, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(d, ])
+            handleLiteralList(1, [, null, ])
+            handleUnaryPrefixExpression(!)
+          endBinaryExpression(>)
+        endArguments(2, (, ))
+        handleSend(f, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(operators_bang_paren, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(<)
+          handleNoArguments(<)
+          handleSend(a, <)
+          beginBinaryExpression(<)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(,)
+            handleNoArguments(,)
+            handleSend(b, ,)
+          endBinaryExpression(<)
+          handleIdentifier(c, expression)
+          handleNoTypeArguments(>)
+          handleNoArguments(>)
+          handleSend(c, >)
+          beginBinaryExpression(>)
+            handleIdentifier(d, expression)
+            handleNoTypeArguments())
+            handleNoArguments())
+            handleSend(d, ))
+            handleParenthesizedExpression(()
+            handleUnaryPrefixExpression(!)
+          endBinaryExpression(>)
+        endArguments(2, (, ))
+        handleSend(f, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(operators_lessThan, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginBinaryExpression(<)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(>)
+          handleNoArguments(>)
+          handleSend(a, >)
+        endBinaryExpression(<)
+        handleRecoverableError(EqualityCannotBeEqualityOperand, >, >)
+        beginBinaryExpression(>)
+          beginTypeArguments(<)
+            handleIdentifier(b, typeReference)
+            handleNoTypeArguments(>)
+            handleType(b, null)
+          endTypeArguments(1, <, >)
+          handleRecoverableError(Message[ExpectedButGot, Expected '[' before this., null, {string: [}], ;, ;)
+          handleLiteralList(0, [, null, ])
+        endBinaryExpression(>)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(operators_minus, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(<)
+          handleNoArguments(<)
+          handleSend(a, <)
+          beginBinaryExpression(<)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(,)
+            handleNoArguments(,)
+            handleSend(b, ,)
+          endBinaryExpression(<)
+          handleIdentifier(c, expression)
+          handleNoTypeArguments(>)
+          handleNoArguments(>)
+          handleSend(c, >)
+          beginBinaryExpression(>)
+            handleIdentifier(d, expression)
+            handleNoTypeArguments())
+            handleNoArguments())
+            handleSend(d, ))
+            handleUnaryPrefixExpression(-)
+          endBinaryExpression(>)
+        endArguments(2, (, ))
+        handleSend(f, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(operators_openBracket, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(<)
+          handleNoArguments(<)
+          handleSend(a, <)
+          beginBinaryExpression(<)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(,)
+            handleNoArguments(,)
+            handleSend(b, ,)
+          endBinaryExpression(<)
+          handleIdentifier(c, expression)
+          handleNoTypeArguments(>)
+          handleNoArguments(>)
+          handleSend(c, >)
+          beginBinaryExpression(>)
+            handleNoTypeArguments([)
+            handleIdentifier(d, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(d, ])
+            handleLiteralList(1, [, null, ])
+          endBinaryExpression(>)
+        endArguments(2, (, ))
+        handleSend(f, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(operators_openBracket_error, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(<)
+          handleNoArguments(<)
+          handleSend(a, <)
+          beginBinaryExpression(<)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(,)
+            handleNoArguments(,)
+            handleSend(b, ,)
+          endBinaryExpression(<)
+          handleIdentifier(c, expression)
+          handleNoTypeArguments(>)
+          handleNoArguments(>)
+          handleSend(c, >)
+          beginBinaryExpression(>)
+            handleNoTypeArguments([)
+            handleIdentifier(d, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(d, ])
+            handleLiteralList(1, [, null, ])
+          endBinaryExpression(>)
+          handleRecoverableError(EqualityCannotBeEqualityOperand, >, >)
+          beginBinaryExpression(>)
+            handleIdentifier(e, expression)
+            handleNoTypeArguments())
+            handleNoArguments())
+            handleSend(e, ))
+          endBinaryExpression(>)
+        endArguments(2, (, ))
+        handleSend(f, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(operators_openBracket_unambiguous, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(<)
+          handleNoArguments(<)
+          handleSend(a, <)
+          beginBinaryExpression(<)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(,)
+            handleNoArguments(,)
+            handleSend(b, ,)
+          endBinaryExpression(<)
+          handleIdentifier(c, expression)
+          handleNoTypeArguments(>)
+          handleNoArguments(>)
+          handleSend(c, >)
+          beginBinaryExpression(>)
+            handleNoTypeArguments([)
+            handleIdentifier(d, expression)
+            handleNoTypeArguments(,)
+            handleNoArguments(,)
+            handleSend(d, ,)
+            handleIdentifier(e, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(e, ])
+            handleLiteralList(2, [, null, ])
+          endBinaryExpression(>)
+        endArguments(2, (, ))
+        handleSend(f, ;)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration()
+endCompilationUnit(34, )
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
new file mode 100644
index 0000000..c8fe425
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
@@ -0,0 +1,1959 @@
+parseUnit(var)
+  skipErrorTokens(var)
+  listener: beginCompilationUnit(var)
+  syntheticPreviousToken(var)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(var)
+      parseFields(, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_ampersand, DeclarationKind.TopLevel, null, false)
+        listener: beginFields()
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_ampersand, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_ampersand, typeArgs_ampersand, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(&)
+              parsePrecedenceExpression(&, 12, true)
+                parseUnaryExpression(&, true)
+                  parsePrimary(&, expression)
+                    parseLiteralInt(&)
+                      listener: handleLiteralInt(0)
+              listener: endBinaryExpression(&)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_asterisk, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_asterisk, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_asterisk, typeArgs_asterisk, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(*)
+              parsePrecedenceExpression(*, 15, true)
+                parseUnaryExpression(*, true)
+                  parsePrimary(*, expression)
+                    parseLiteralInt(*)
+                      listener: handleLiteralInt(0)
+              listener: endBinaryExpression(*)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_bar, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_bar, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_bar, typeArgs_bar, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(|)
+              parsePrecedenceExpression(|, 10, true)
+                parseUnaryExpression(|, true)
+                  parsePrimary(|, expression)
+                    parseLiteralInt(|)
+                      listener: handleLiteralInt(0)
+              listener: endBinaryExpression(|)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_caret, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_caret, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_caret, typeArgs_caret, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(^)
+              parsePrecedenceExpression(^, 11, true)
+                parseUnaryExpression(^, true)
+                  parsePrimary(^, expression)
+                    parseLiteralInt(^)
+                      listener: handleLiteralInt(0)
+              listener: endBinaryExpression(^)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_closeBrace, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_closeBrace, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_closeBrace, typeArgs_closeBrace, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  listener: handleNoTypeArguments({)
+                  parseLiteralSetOrMapSuffix(=, null)
+                    parseExpression({)
+                      parsePrecedenceExpression({, 1, true)
+                        parseUnaryExpression({, true)
+                          parsePrimary({, expression)
+                            parseSendOrFunctionLiteral({, expression)
+                              parseSend({, expression)
+                                isNextIdentifier({)
+                                ensureIdentifier({, expression)
+                                  listener: handleIdentifier(f, expression)
+                                listener: handleNoTypeArguments(<)
+                                parseArgumentsOpt(f)
+                                  listener: handleNoArguments(<)
+                                listener: handleSend(f, <)
+                        listener: beginTypeArguments(<)
+                        listener: handleIdentifier(a, typeReference)
+                        listener: handleNoTypeArguments(,)
+                        listener: handleType(a, null)
+                        listener: handleIdentifier(b, typeReference)
+                        listener: handleNoTypeArguments(>)
+                        listener: handleType(b, null)
+                        listener: endTypeArguments(2, <, >)
+                        listener: handleTypeArgumentApplication(<)
+                    listener: handleLiteralSetOrMap(1, {, null, }, true)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_closeBracket, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_closeBracket, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_closeBracket, typeArgs_closeBracket, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  listener: handleNoTypeArguments([)
+                  parseLiteralListSuffix(=, null)
+                    parseExpression([)
+                      parsePrecedenceExpression([, 1, true)
+                        parseUnaryExpression([, true)
+                          parsePrimary([, expression)
+                            parseSendOrFunctionLiteral([, expression)
+                              parseSend([, expression)
+                                isNextIdentifier([)
+                                ensureIdentifier([, expression)
+                                  listener: handleIdentifier(f, expression)
+                                listener: handleNoTypeArguments(<)
+                                parseArgumentsOpt(f)
+                                  listener: handleNoArguments(<)
+                                listener: handleSend(f, <)
+                        listener: beginTypeArguments(<)
+                        listener: handleIdentifier(a, typeReference)
+                        listener: handleNoTypeArguments(,)
+                        listener: handleType(a, null)
+                        listener: handleIdentifier(b, typeReference)
+                        listener: handleNoTypeArguments(>)
+                        listener: handleType(b, null)
+                        listener: endTypeArguments(2, <, >)
+                        listener: handleTypeArgumentApplication(<)
+                    listener: handleLiteralList(1, [, null, ])
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_closeParen, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_closeParen, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_closeParen, typeArgs_closeParen, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(g, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(g)
+                        parseArguments(g)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseSendOrFunctionLiteral((, expression)
+                                      parseSend((, expression)
+                                        isNextIdentifier(()
+                                        ensureIdentifier((, expression)
+                                          listener: handleIdentifier(f, expression)
+                                        listener: handleNoTypeArguments(<)
+                                        parseArgumentsOpt(f)
+                                          listener: handleNoArguments(<)
+                                        listener: handleSend(f, <)
+                                listener: beginTypeArguments(<)
+                                listener: handleIdentifier(a, typeReference)
+                                listener: handleNoTypeArguments(,)
+                                listener: handleType(a, null)
+                                listener: handleIdentifier(b, typeReference)
+                                listener: handleNoTypeArguments(>)
+                                listener: handleType(b, null)
+                                listener: endTypeArguments(2, <, >)
+                                listener: handleTypeArgumentApplication(<)
+                            listener: endArguments(1, (, ))
+                      listener: handleSend(g, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_colon, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_colon, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_colon, typeArgs_colon, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  listener: handleNoTypeArguments({)
+                  parseLiteralSetOrMapSuffix(=, null)
+                    parseExpression({)
+                      parsePrecedenceExpression({, 1, true)
+                        parseUnaryExpression({, true)
+                          parsePrimary({, expression)
+                            parseSendOrFunctionLiteral({, expression)
+                              parseSend({, expression)
+                                isNextIdentifier({)
+                                ensureIdentifier({, expression)
+                                  listener: handleIdentifier(f, expression)
+                                listener: handleNoTypeArguments(<)
+                                parseArgumentsOpt(f)
+                                  listener: handleNoArguments(<)
+                                listener: handleSend(f, <)
+                        listener: beginTypeArguments(<)
+                        listener: handleIdentifier(a, typeReference)
+                        listener: handleNoTypeArguments(,)
+                        listener: handleType(a, null)
+                        listener: handleIdentifier(b, typeReference)
+                        listener: handleNoTypeArguments(>)
+                        listener: handleType(b, null)
+                        listener: endTypeArguments(2, <, >)
+                        listener: handleTypeArgumentApplication(<)
+                    parseExpression(:)
+                      parsePrecedenceExpression(:, 1, true)
+                        parseUnaryExpression(:, true)
+                          parsePrimary(:, expression)
+                            parseLiteralNull(:)
+                              listener: handleLiteralNull(null)
+                    listener: handleLiteralMapEntry(:, })
+                    listener: handleLiteralSetOrMap(1, {, null, }, false)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_comma, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_comma, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_comma, typeArgs_comma, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  listener: handleNoTypeArguments([)
+                  parseLiteralListSuffix(=, null)
+                    parseExpression([)
+                      parsePrecedenceExpression([, 1, true)
+                        parseUnaryExpression([, true)
+                          parsePrimary([, expression)
+                            parseSendOrFunctionLiteral([, expression)
+                              parseSend([, expression)
+                                isNextIdentifier([)
+                                ensureIdentifier([, expression)
+                                  listener: handleIdentifier(f, expression)
+                                listener: handleNoTypeArguments(<)
+                                parseArgumentsOpt(f)
+                                  listener: handleNoArguments(<)
+                                listener: handleSend(f, <)
+                        listener: beginTypeArguments(<)
+                        listener: handleIdentifier(a, typeReference)
+                        listener: handleNoTypeArguments(,)
+                        listener: handleType(a, null)
+                        listener: handleIdentifier(b, typeReference)
+                        listener: handleNoTypeArguments(>)
+                        listener: handleType(b, null)
+                        listener: endTypeArguments(2, <, >)
+                        listener: handleTypeArgumentApplication(<)
+                    parseExpression(,)
+                      parsePrecedenceExpression(,, 1, true)
+                        parseUnaryExpression(,, true)
+                          parsePrimary(,, expression)
+                            parseLiteralNull(,)
+                              listener: handleLiteralNull(null)
+                    listener: handleLiteralList(2, [, null, ])
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_equals, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_equals, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_equals, typeArgs_equals, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(==)
+              parsePrecedenceExpression(==, 8, true)
+                parseUnaryExpression(==, true)
+                  parsePrimary(==, expression)
+                    parseLiteralNull(==)
+                      listener: handleLiteralNull(null)
+              listener: endBinaryExpression(==)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_not_equals, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_not_equals, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_not_equals, typeArgs_not_equals, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(!=)
+              parsePrecedenceExpression(!=, 8, true)
+                parseUnaryExpression(!=, true)
+                  parsePrimary(!=, expression)
+                    parseLiteralNull(!=)
+                      listener: handleLiteralNull(null)
+              listener: endBinaryExpression(!=)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_openParen, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_openParen, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_openParen, typeArgs_openParen, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: beginTypeArguments(<)
+                      listener: handleIdentifier(a, typeReference)
+                      listener: handleNoTypeArguments(,)
+                      listener: handleType(a, null)
+                      listener: handleIdentifier(b, typeReference)
+                      listener: handleNoTypeArguments(>)
+                      listener: handleType(b, null)
+                      listener: endTypeArguments(2, <, >)
+                      parseArgumentsOpt(>)
+                        parseArguments(>)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            listener: endArguments(0, (, ))
+                      listener: handleSend(f, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_percent, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_percent, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_percent, typeArgs_percent, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(%)
+              parsePrecedenceExpression(%, 15, true)
+                parseUnaryExpression(%, true)
+                  parsePrimary(%, expression)
+                    parseLiteralInt(%)
+                      listener: handleLiteralInt(0)
+              listener: endBinaryExpression(%)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_period_methodInvocation, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_period_methodInvocation, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_period_methodInvocation, typeArgs_period_methodInvocation, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parseImplicitCreationExpression(=, Instance of 'ComplexTypeParamOrArgInfo')
+                  listener: beginImplicitCreationExpression(=)
+                  parseConstructorReference(=, Instance of 'ComplexTypeParamOrArgInfo')
+                    ensureIdentifier(=, constructorReference)
+                      listener: handleIdentifier(f, constructorReference)
+                    listener: beginConstructorReference(f)
+                    parseQualifiedRestOpt(f, constructorReferenceContinuation)
+                    listener: beginTypeArguments(<)
+                    listener: handleIdentifier(a, typeReference)
+                    listener: handleNoTypeArguments(,)
+                    listener: handleType(a, null)
+                    listener: handleIdentifier(b, typeReference)
+                    listener: handleNoTypeArguments(>)
+                    listener: handleType(b, null)
+                    listener: endTypeArguments(2, <, >)
+                    ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+                      listener: handleIdentifier(toString, constructorReferenceContinuationAfterTypeArguments)
+                    listener: endConstructorReference(f, ., ()
+                  parseConstructorInvocationArguments(toString)
+                    parseArgumentsRest(()
+                      listener: beginArguments(()
+                      listener: endArguments(0, (, ))
+                  listener: endImplicitCreationExpression(=)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_period_methodInvocation_generic, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_period_methodInvocation_generic, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_period_methodInvocation_generic, typeArgs_period_methodInvocation_generic, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parsePrimary(., expressionContinuation)
+                parseSendOrFunctionLiteral(., expressionContinuation)
+                  looksLikeFunctionBody(;)
+                  parseSend(., expressionContinuation)
+                    isNextIdentifier(.)
+                    ensureIdentifier(., expressionContinuation)
+                      listener: handleIdentifier(foo, expressionContinuation)
+                    listener: beginTypeArguments(<)
+                    listener: handleIdentifier(c, typeReference)
+                    listener: handleNoTypeArguments(>)
+                    listener: handleType(c, null)
+                    listener: endTypeArguments(1, <, >)
+                    parseArgumentsOpt(>)
+                      parseArguments(>)
+                        parseArgumentsRest(()
+                          listener: beginArguments(()
+                          listener: endArguments(0, (, ))
+                    listener: handleSend(foo, ;)
+              listener: handleEndingBinaryExpression(.)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_period_period, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_period_period, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_period_period, typeArgs_period_period, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parseCascadeExpression(>)
+                listener: beginCascade(..)
+                parseSend(.., expressionContinuation)
+                  isNextIdentifier(..)
+                  ensureIdentifier(.., expressionContinuation)
+                    listener: handleIdentifier(toString, expressionContinuation)
+                  listener: handleNoTypeArguments(()
+                  parseArgumentsOpt(toString)
+                    parseArguments(toString)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        listener: endArguments(0, (, ))
+                  listener: handleSend(toString, ;)
+                listener: handleEndingBinaryExpression(..)
+                parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
+                listener: endCascade()
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_period_propertyAccess, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_period_propertyAccess, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_period_propertyAccess, typeArgs_period_propertyAccess, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parsePrimary(., expressionContinuation)
+                parseSendOrFunctionLiteral(., expressionContinuation)
+                  parseSend(., expressionContinuation)
+                    isNextIdentifier(.)
+                    ensureIdentifier(., expressionContinuation)
+                      listener: handleIdentifier(hashCode, expressionContinuation)
+                    listener: handleNoTypeArguments(;)
+                    parseArgumentsOpt(hashCode)
+                      listener: handleNoArguments(;)
+                    listener: handleSend(hashCode, ;)
+              listener: handleEndingBinaryExpression(.)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_plus, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_plus, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_plus, typeArgs_plus, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(+)
+              parsePrecedenceExpression(+, 14, true)
+                parseUnaryExpression(+, true)
+                  parsePrimary(+, expression)
+                    parseLiteralInt(+)
+                      listener: handleLiteralInt(0)
+              listener: endBinaryExpression(+)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_question, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_question, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_question, typeArgs_question, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parseConditionalExpressionRest(>)
+                listener: beginConditionalExpression(?)
+                parseExpressionWithoutCascade(?)
+                  parsePrecedenceExpression(?, 1, false)
+                    parseUnaryExpression(?, false)
+                      parsePrimary(?, expression)
+                        parseLiteralNull(?)
+                          listener: handleLiteralNull(null)
+                ensureColon(null)
+                listener: handleConditionalExpressionColon()
+                parseExpressionWithoutCascade(:)
+                  parsePrecedenceExpression(:, 1, false)
+                    parseUnaryExpression(:, false)
+                      parsePrimary(:, expression)
+                        parseLiteralNull(:)
+                          listener: handleLiteralNull(null)
+                listener: endConditionalExpression(?, :)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_question_period_methodInvocation, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_question_period_methodInvocation, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_question_period_methodInvocation, typeArgs_question_period_methodInvocation, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parsePrimary(?., expressionContinuation)
+                parseSendOrFunctionLiteral(?., expressionContinuation)
+                  looksLikeFunctionBody(;)
+                  parseSend(?., expressionContinuation)
+                    isNextIdentifier(?.)
+                    ensureIdentifier(?., expressionContinuation)
+                      listener: handleIdentifier(toString, expressionContinuation)
+                    listener: handleNoTypeArguments(()
+                    parseArgumentsOpt(toString)
+                      parseArguments(toString)
+                        parseArgumentsRest(()
+                          listener: beginArguments(()
+                          listener: endArguments(0, (, ))
+                    listener: handleSend(toString, ;)
+              listener: handleEndingBinaryExpression(?.)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_question_period_methodInvocation_generic, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_question_period_methodInvocation_generic, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_question_period_methodInvocation_generic, typeArgs_question_period_methodInvocation_generic, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parsePrimary(?., expressionContinuation)
+                parseSendOrFunctionLiteral(?., expressionContinuation)
+                  looksLikeFunctionBody(;)
+                  parseSend(?., expressionContinuation)
+                    isNextIdentifier(?.)
+                    ensureIdentifier(?., expressionContinuation)
+                      listener: handleIdentifier(foo, expressionContinuation)
+                    listener: beginTypeArguments(<)
+                    listener: handleIdentifier(c, typeReference)
+                    listener: handleNoTypeArguments(>)
+                    listener: handleType(c, null)
+                    listener: endTypeArguments(1, <, >)
+                    parseArgumentsOpt(>)
+                      parseArguments(>)
+                        parseArgumentsRest(()
+                          listener: beginArguments(()
+                          listener: endArguments(0, (, ))
+                    listener: handleSend(foo, ;)
+              listener: handleEndingBinaryExpression(?.)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_question_period_period, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_question_period_period, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_question_period_period, typeArgs_question_period_period, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parseCascadeExpression(>)
+                listener: beginCascade(?..)
+                parseSend(?.., expressionContinuation)
+                  isNextIdentifier(?..)
+                  ensureIdentifier(?.., expressionContinuation)
+                    listener: handleIdentifier(toString, expressionContinuation)
+                  listener: handleNoTypeArguments(()
+                  parseArgumentsOpt(toString)
+                    parseArguments(toString)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        listener: endArguments(0, (, ))
+                  listener: handleSend(toString, ;)
+                listener: handleEndingBinaryExpression(?..)
+                parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
+                listener: endCascade()
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_question_period_propertyAccess, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_question_period_propertyAccess, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_question_period_propertyAccess, typeArgs_question_period_propertyAccess, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              parsePrimary(?., expressionContinuation)
+                parseSendOrFunctionLiteral(?., expressionContinuation)
+                  parseSend(?., expressionContinuation)
+                    isNextIdentifier(?.)
+                    ensureIdentifier(?., expressionContinuation)
+                      listener: handleIdentifier(hashCode, expressionContinuation)
+                    listener: handleNoTypeArguments(;)
+                    parseArgumentsOpt(hashCode)
+                      listener: handleNoArguments(;)
+                    listener: handleSend(hashCode, ;)
+              listener: handleEndingBinaryExpression(?.)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_question_question, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_question_question, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_question_question, typeArgs_question_question, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(??)
+              parsePrecedenceExpression(??, 5, true)
+                parseUnaryExpression(??, true)
+                  parsePrimary(??, expression)
+                    parseLiteralInt(??)
+                      listener: handleLiteralInt(0)
+              listener: endBinaryExpression(??)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_semicolon, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_semicolon, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_semicolon, typeArgs_semicolon, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_slash, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_slash, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_slash, typeArgs_slash, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(/)
+              parsePrecedenceExpression(/, 15, true)
+                parseUnaryExpression(/, true)
+                  parsePrimary(/, expression)
+                    parseLiteralInt(/)
+                      listener: handleLiteralInt(1)
+              listener: endBinaryExpression(/)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', typeArgs_tilde_slash, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(typeArgs_tilde_slash, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(typeArgs_tilde_slash, typeArgs_tilde_slash, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+              listener: beginBinaryExpression(~/)
+              parsePrecedenceExpression(~/, 15, true)
+                parseUnaryExpression(~/, true)
+                  parsePrimary(~/, expression)
+                    parseLiteralInt(~/)
+                      listener: handleLiteralInt(1)
+              listener: endBinaryExpression(~/)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', operators_bang_openBracket, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(operators_bang_openBracket, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(operators_bang_openBracket, operators_bang_openBracket, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(f)
+                        parseArguments(f)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseSendOrFunctionLiteral((, expression)
+                                      parseSend((, expression)
+                                        isNextIdentifier(()
+                                        ensureIdentifier((, expression)
+                                          listener: handleIdentifier(a, expression)
+                                        listener: handleNoTypeArguments(<)
+                                        parseArgumentsOpt(a)
+                                          listener: handleNoArguments(<)
+                                        listener: handleSend(a, <)
+                                listener: beginBinaryExpression(<)
+                                parsePrecedenceExpression(<, 9, true)
+                                  parseUnaryExpression(<, true)
+                                    parsePrimary(<, expression)
+                                      parseSendOrFunctionLiteral(<, expression)
+                                        parseSend(<, expression)
+                                          isNextIdentifier(<)
+                                          ensureIdentifier(<, expression)
+                                            listener: handleIdentifier(b, expression)
+                                          listener: handleNoTypeArguments(,)
+                                          parseArgumentsOpt(b)
+                                            listener: handleNoArguments(,)
+                                          listener: handleSend(b, ,)
+                                listener: endBinaryExpression(<)
+                            parseExpression(,)
+                              parsePrecedenceExpression(,, 1, true)
+                                parseUnaryExpression(,, true)
+                                  parsePrimary(,, expression)
+                                    parseSendOrFunctionLiteral(,, expression)
+                                      parseSend(,, expression)
+                                        isNextIdentifier(,)
+                                        ensureIdentifier(,, expression)
+                                          listener: handleIdentifier(c, expression)
+                                        listener: handleNoTypeArguments(>)
+                                        parseArgumentsOpt(c)
+                                          listener: handleNoArguments(>)
+                                        listener: handleSend(c, >)
+                                listener: beginBinaryExpression(>)
+                                parsePrecedenceExpression(>, 9, true)
+                                  parseUnaryExpression(>, true)
+                                    parsePrecedenceExpression(!, 16, true)
+                                      parseUnaryExpression(!, true)
+                                        parsePrimary(!, expression)
+                                          listener: handleNoTypeArguments([)
+                                          parseLiteralListSuffix(!, null)
+                                            parseExpression([)
+                                              parsePrecedenceExpression([, 1, true)
+                                                parseUnaryExpression([, true)
+                                                  parsePrimary([, expression)
+                                                    parseSendOrFunctionLiteral([, expression)
+                                                      parseSend([, expression)
+                                                        isNextIdentifier([)
+                                                        ensureIdentifier([, expression)
+                                                          listener: handleIdentifier(d, expression)
+                                                        listener: handleNoTypeArguments(])
+                                                        parseArgumentsOpt(d)
+                                                          listener: handleNoArguments(])
+                                                        listener: handleSend(d, ])
+                                            listener: handleLiteralList(1, [, null, ])
+                                    listener: handleUnaryPrefixExpression(!)
+                                listener: endBinaryExpression(>)
+                            listener: endArguments(2, (, ))
+                      listener: handleSend(f, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', operators_bang_paren, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(operators_bang_paren, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(operators_bang_paren, operators_bang_paren, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(f)
+                        parseArguments(f)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseSendOrFunctionLiteral((, expression)
+                                      parseSend((, expression)
+                                        isNextIdentifier(()
+                                        ensureIdentifier((, expression)
+                                          listener: handleIdentifier(a, expression)
+                                        listener: handleNoTypeArguments(<)
+                                        parseArgumentsOpt(a)
+                                          listener: handleNoArguments(<)
+                                        listener: handleSend(a, <)
+                                listener: beginBinaryExpression(<)
+                                parsePrecedenceExpression(<, 9, true)
+                                  parseUnaryExpression(<, true)
+                                    parsePrimary(<, expression)
+                                      parseSendOrFunctionLiteral(<, expression)
+                                        parseSend(<, expression)
+                                          isNextIdentifier(<)
+                                          ensureIdentifier(<, expression)
+                                            listener: handleIdentifier(b, expression)
+                                          listener: handleNoTypeArguments(,)
+                                          parseArgumentsOpt(b)
+                                            listener: handleNoArguments(,)
+                                          listener: handleSend(b, ,)
+                                listener: endBinaryExpression(<)
+                            parseExpression(,)
+                              parsePrecedenceExpression(,, 1, true)
+                                parseUnaryExpression(,, true)
+                                  parsePrimary(,, expression)
+                                    parseSendOrFunctionLiteral(,, expression)
+                                      parseSend(,, expression)
+                                        isNextIdentifier(,)
+                                        ensureIdentifier(,, expression)
+                                          listener: handleIdentifier(c, expression)
+                                        listener: handleNoTypeArguments(>)
+                                        parseArgumentsOpt(c)
+                                          listener: handleNoArguments(>)
+                                        listener: handleSend(c, >)
+                                listener: beginBinaryExpression(>)
+                                parsePrecedenceExpression(>, 9, true)
+                                  parseUnaryExpression(>, true)
+                                    parsePrecedenceExpression(!, 16, true)
+                                      parseUnaryExpression(!, true)
+                                        parsePrimary(!, expression)
+                                          parseParenthesizedExpressionOrFunctionLiteral(!)
+                                            parseParenthesizedExpression(!)
+                                              parseExpressionInParenthesis(!)
+                                                parseExpressionInParenthesisRest(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseSendOrFunctionLiteral((, expression)
+                                                            parseSend((, expression)
+                                                              isNextIdentifier(()
+                                                              ensureIdentifier((, expression)
+                                                                listener: handleIdentifier(d, expression)
+                                                              listener: handleNoTypeArguments())
+                                                              parseArgumentsOpt(d)
+                                                                listener: handleNoArguments())
+                                                              listener: handleSend(d, ))
+                                                  ensureCloseParen(d, ()
+                                              listener: handleParenthesizedExpression(()
+                                    listener: handleUnaryPrefixExpression(!)
+                                listener: endBinaryExpression(>)
+                            listener: endArguments(2, (, ))
+                      listener: handleSend(f, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', operators_lessThan, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(operators_lessThan, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(operators_lessThan, operators_lessThan, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginBinaryExpression(<)
+              parsePrecedenceExpression(<, 9, true)
+                parseUnaryExpression(<, true)
+                  parsePrimary(<, expression)
+                    parseSendOrFunctionLiteral(<, expression)
+                      parseSend(<, expression)
+                        isNextIdentifier(<)
+                        ensureIdentifier(<, expression)
+                          listener: handleIdentifier(a, expression)
+                        listener: handleNoTypeArguments(>)
+                        parseArgumentsOpt(a)
+                          listener: handleNoArguments(>)
+                        listener: handleSend(a, >)
+              listener: endBinaryExpression(<)
+              reportRecoverableError(>, EqualityCannotBeEqualityOperand)
+                listener: handleRecoverableError(EqualityCannotBeEqualityOperand, >, >)
+              listener: beginBinaryExpression(>)
+              parsePrecedenceExpression(>, 9, true)
+                parseUnaryExpression(>, true)
+                  parsePrimary(>, expression)
+                    parseLiteralListSetMapOrFunction(>, null)
+                      listener: beginTypeArguments(<)
+                      listener: handleIdentifier(b, typeReference)
+                      listener: handleNoTypeArguments(>)
+                      listener: handleType(b, null)
+                      listener: endTypeArguments(1, <, >)
+                      reportRecoverableError(;, Message[ExpectedButGot, Expected '[' before this., null, {string: [}])
+                        listener: handleRecoverableError(Message[ExpectedButGot, Expected '[' before this., null, {string: [}], ;, ;)
+                      rewriter()
+                      parseLiteralListSuffix(>, null)
+                        rewriteSquareBrackets(>)
+                          link([, ])
+                          rewriter()
+                        listener: handleLiteralList(0, [, null, ])
+              listener: endBinaryExpression(>)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', operators_minus, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(operators_minus, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(operators_minus, operators_minus, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(f)
+                        parseArguments(f)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseSendOrFunctionLiteral((, expression)
+                                      parseSend((, expression)
+                                        isNextIdentifier(()
+                                        ensureIdentifier((, expression)
+                                          listener: handleIdentifier(a, expression)
+                                        listener: handleNoTypeArguments(<)
+                                        parseArgumentsOpt(a)
+                                          listener: handleNoArguments(<)
+                                        listener: handleSend(a, <)
+                                listener: beginBinaryExpression(<)
+                                parsePrecedenceExpression(<, 9, true)
+                                  parseUnaryExpression(<, true)
+                                    parsePrimary(<, expression)
+                                      parseSendOrFunctionLiteral(<, expression)
+                                        parseSend(<, expression)
+                                          isNextIdentifier(<)
+                                          ensureIdentifier(<, expression)
+                                            listener: handleIdentifier(b, expression)
+                                          listener: handleNoTypeArguments(,)
+                                          parseArgumentsOpt(b)
+                                            listener: handleNoArguments(,)
+                                          listener: handleSend(b, ,)
+                                listener: endBinaryExpression(<)
+                            parseExpression(,)
+                              parsePrecedenceExpression(,, 1, true)
+                                parseUnaryExpression(,, true)
+                                  parsePrimary(,, expression)
+                                    parseSendOrFunctionLiteral(,, expression)
+                                      parseSend(,, expression)
+                                        isNextIdentifier(,)
+                                        ensureIdentifier(,, expression)
+                                          listener: handleIdentifier(c, expression)
+                                        listener: handleNoTypeArguments(>)
+                                        parseArgumentsOpt(c)
+                                          listener: handleNoArguments(>)
+                                        listener: handleSend(c, >)
+                                listener: beginBinaryExpression(>)
+                                parsePrecedenceExpression(>, 9, true)
+                                  parseUnaryExpression(>, true)
+                                    parsePrecedenceExpression(-, 16, true)
+                                      parseUnaryExpression(-, true)
+                                        parsePrimary(-, expression)
+                                          parseSendOrFunctionLiteral(-, expression)
+                                            parseSend(-, expression)
+                                              isNextIdentifier(-)
+                                              ensureIdentifier(-, expression)
+                                                listener: handleIdentifier(d, expression)
+                                              listener: handleNoTypeArguments())
+                                              parseArgumentsOpt(d)
+                                                listener: handleNoArguments())
+                                              listener: handleSend(d, ))
+                                    listener: handleUnaryPrefixExpression(-)
+                                listener: endBinaryExpression(>)
+                            listener: endArguments(2, (, ))
+                      listener: handleSend(f, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', operators_openBracket, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(operators_openBracket, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(operators_openBracket, operators_openBracket, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(f)
+                        parseArguments(f)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseSendOrFunctionLiteral((, expression)
+                                      parseSend((, expression)
+                                        isNextIdentifier(()
+                                        ensureIdentifier((, expression)
+                                          listener: handleIdentifier(a, expression)
+                                        listener: handleNoTypeArguments(<)
+                                        parseArgumentsOpt(a)
+                                          listener: handleNoArguments(<)
+                                        listener: handleSend(a, <)
+                                listener: beginBinaryExpression(<)
+                                parsePrecedenceExpression(<, 9, true)
+                                  parseUnaryExpression(<, true)
+                                    parsePrimary(<, expression)
+                                      parseSendOrFunctionLiteral(<, expression)
+                                        parseSend(<, expression)
+                                          isNextIdentifier(<)
+                                          ensureIdentifier(<, expression)
+                                            listener: handleIdentifier(b, expression)
+                                          listener: handleNoTypeArguments(,)
+                                          parseArgumentsOpt(b)
+                                            listener: handleNoArguments(,)
+                                          listener: handleSend(b, ,)
+                                listener: endBinaryExpression(<)
+                            parseExpression(,)
+                              parsePrecedenceExpression(,, 1, true)
+                                parseUnaryExpression(,, true)
+                                  parsePrimary(,, expression)
+                                    parseSendOrFunctionLiteral(,, expression)
+                                      parseSend(,, expression)
+                                        isNextIdentifier(,)
+                                        ensureIdentifier(,, expression)
+                                          listener: handleIdentifier(c, expression)
+                                        listener: handleNoTypeArguments(>)
+                                        parseArgumentsOpt(c)
+                                          listener: handleNoArguments(>)
+                                        listener: handleSend(c, >)
+                                listener: beginBinaryExpression(>)
+                                parsePrecedenceExpression(>, 9, true)
+                                  parseUnaryExpression(>, true)
+                                    parsePrimary(>, expression)
+                                      listener: handleNoTypeArguments([)
+                                      parseLiteralListSuffix(>, null)
+                                        parseExpression([)
+                                          parsePrecedenceExpression([, 1, true)
+                                            parseUnaryExpression([, true)
+                                              parsePrimary([, expression)
+                                                parseSendOrFunctionLiteral([, expression)
+                                                  parseSend([, expression)
+                                                    isNextIdentifier([)
+                                                    ensureIdentifier([, expression)
+                                                      listener: handleIdentifier(d, expression)
+                                                    listener: handleNoTypeArguments(])
+                                                    parseArgumentsOpt(d)
+                                                      listener: handleNoArguments(])
+                                                    listener: handleSend(d, ])
+                                        listener: handleLiteralList(1, [, null, ])
+                                listener: endBinaryExpression(>)
+                            listener: endArguments(2, (, ))
+                      listener: handleSend(f, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', operators_openBracket_error, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(operators_openBracket_error, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(operators_openBracket_error, operators_openBracket_error, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(f)
+                        parseArguments(f)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseSendOrFunctionLiteral((, expression)
+                                      parseSend((, expression)
+                                        isNextIdentifier(()
+                                        ensureIdentifier((, expression)
+                                          listener: handleIdentifier(a, expression)
+                                        listener: handleNoTypeArguments(<)
+                                        parseArgumentsOpt(a)
+                                          listener: handleNoArguments(<)
+                                        listener: handleSend(a, <)
+                                listener: beginBinaryExpression(<)
+                                parsePrecedenceExpression(<, 9, true)
+                                  parseUnaryExpression(<, true)
+                                    parsePrimary(<, expression)
+                                      parseSendOrFunctionLiteral(<, expression)
+                                        parseSend(<, expression)
+                                          isNextIdentifier(<)
+                                          ensureIdentifier(<, expression)
+                                            listener: handleIdentifier(b, expression)
+                                          listener: handleNoTypeArguments(,)
+                                          parseArgumentsOpt(b)
+                                            listener: handleNoArguments(,)
+                                          listener: handleSend(b, ,)
+                                listener: endBinaryExpression(<)
+                            parseExpression(,)
+                              parsePrecedenceExpression(,, 1, true)
+                                parseUnaryExpression(,, true)
+                                  parsePrimary(,, expression)
+                                    parseSendOrFunctionLiteral(,, expression)
+                                      parseSend(,, expression)
+                                        isNextIdentifier(,)
+                                        ensureIdentifier(,, expression)
+                                          listener: handleIdentifier(c, expression)
+                                        listener: handleNoTypeArguments(>)
+                                        parseArgumentsOpt(c)
+                                          listener: handleNoArguments(>)
+                                        listener: handleSend(c, >)
+                                listener: beginBinaryExpression(>)
+                                parsePrecedenceExpression(>, 9, true)
+                                  parseUnaryExpression(>, true)
+                                    parsePrimary(>, expression)
+                                      listener: handleNoTypeArguments([)
+                                      parseLiteralListSuffix(>, null)
+                                        parseExpression([)
+                                          parsePrecedenceExpression([, 1, true)
+                                            parseUnaryExpression([, true)
+                                              parsePrimary([, expression)
+                                                parseSendOrFunctionLiteral([, expression)
+                                                  parseSend([, expression)
+                                                    isNextIdentifier([)
+                                                    ensureIdentifier([, expression)
+                                                      listener: handleIdentifier(d, expression)
+                                                    listener: handleNoTypeArguments(])
+                                                    parseArgumentsOpt(d)
+                                                      listener: handleNoArguments(])
+                                                    listener: handleSend(d, ])
+                                        listener: handleLiteralList(1, [, null, ])
+                                listener: endBinaryExpression(>)
+                                reportRecoverableError(>, EqualityCannotBeEqualityOperand)
+                                  listener: handleRecoverableError(EqualityCannotBeEqualityOperand, >, >)
+                                listener: beginBinaryExpression(>)
+                                parsePrecedenceExpression(>, 9, true)
+                                  parseUnaryExpression(>, true)
+                                    parsePrimary(>, expression)
+                                      parseSendOrFunctionLiteral(>, expression)
+                                        parseSend(>, expression)
+                                          isNextIdentifier(>)
+                                          ensureIdentifier(>, expression)
+                                            listener: handleIdentifier(e, expression)
+                                          listener: handleNoTypeArguments())
+                                          parseArgumentsOpt(e)
+                                            listener: handleNoArguments())
+                                          listener: handleSend(e, ))
+                                listener: endBinaryExpression(>)
+                            listener: endArguments(2, (, ))
+                      listener: handleSend(f, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', operators_openBracket_unambiguous, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(operators_openBracket_unambiguous, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(operators_openBracket_unambiguous, operators_openBracket_unambiguous, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(;)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(f)
+                        parseArguments(f)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseSendOrFunctionLiteral((, expression)
+                                      parseSend((, expression)
+                                        isNextIdentifier(()
+                                        ensureIdentifier((, expression)
+                                          listener: handleIdentifier(a, expression)
+                                        listener: handleNoTypeArguments(<)
+                                        parseArgumentsOpt(a)
+                                          listener: handleNoArguments(<)
+                                        listener: handleSend(a, <)
+                                listener: beginBinaryExpression(<)
+                                parsePrecedenceExpression(<, 9, true)
+                                  parseUnaryExpression(<, true)
+                                    parsePrimary(<, expression)
+                                      parseSendOrFunctionLiteral(<, expression)
+                                        parseSend(<, expression)
+                                          isNextIdentifier(<)
+                                          ensureIdentifier(<, expression)
+                                            listener: handleIdentifier(b, expression)
+                                          listener: handleNoTypeArguments(,)
+                                          parseArgumentsOpt(b)
+                                            listener: handleNoArguments(,)
+                                          listener: handleSend(b, ,)
+                                listener: endBinaryExpression(<)
+                            parseExpression(,)
+                              parsePrecedenceExpression(,, 1, true)
+                                parseUnaryExpression(,, true)
+                                  parsePrimary(,, expression)
+                                    parseSendOrFunctionLiteral(,, expression)
+                                      parseSend(,, expression)
+                                        isNextIdentifier(,)
+                                        ensureIdentifier(,, expression)
+                                          listener: handleIdentifier(c, expression)
+                                        listener: handleNoTypeArguments(>)
+                                        parseArgumentsOpt(c)
+                                          listener: handleNoArguments(>)
+                                        listener: handleSend(c, >)
+                                listener: beginBinaryExpression(>)
+                                parsePrecedenceExpression(>, 9, true)
+                                  parseUnaryExpression(>, true)
+                                    parsePrimary(>, expression)
+                                      listener: handleNoTypeArguments([)
+                                      parseLiteralListSuffix(>, null)
+                                        parseExpression([)
+                                          parsePrecedenceExpression([, 1, true)
+                                            parseUnaryExpression([, true)
+                                              parsePrimary([, expression)
+                                                parseSendOrFunctionLiteral([, expression)
+                                                  parseSend([, expression)
+                                                    isNextIdentifier([)
+                                                    ensureIdentifier([, expression)
+                                                      listener: handleIdentifier(d, expression)
+                                                    listener: handleNoTypeArguments(,)
+                                                    parseArgumentsOpt(d)
+                                                      listener: handleNoArguments(,)
+                                                    listener: handleSend(d, ,)
+                                        parseExpression(,)
+                                          parsePrecedenceExpression(,, 1, true)
+                                            parseUnaryExpression(,, true)
+                                              parsePrimary(,, expression)
+                                                parseSendOrFunctionLiteral(,, expression)
+                                                  parseSend(,, expression)
+                                                    isNextIdentifier(,)
+                                                    ensureIdentifier(,, expression)
+                                                      listener: handleIdentifier(e, expression)
+                                                    listener: handleNoTypeArguments(])
+                                                    parseArgumentsOpt(e)
+                                                      listener: handleNoArguments(])
+                                                    listener: handleSend(e, ])
+                                        listener: handleLiteralList(2, [, null, ])
+                                listener: endBinaryExpression(>)
+                            listener: endArguments(2, (, ))
+                      listener: handleSend(f, ;)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(var)
+  listener: endCompilationUnit(34, )
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.parser.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.parser.expect
new file mode 100644
index 0000000..becf1b6
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.parser.expect
@@ -0,0 +1,159 @@
+NOTICE: Stream was rewritten by parser!
+
+var typeArgs_ampersand = f<a, b> & 0;
+var typeArgs_asterisk = f<a, b> * 0;
+var typeArgs_bar = f<a, b> | 0;
+var typeArgs_caret = f<a, b> ^ 0;
+var typeArgs_closeBrace = {f<a, b>};
+var typeArgs_closeBracket = [f<a, b>];
+var typeArgs_closeParen = g(f<a, b>);
+var typeArgs_colon = {f<a, b>: null};
+var typeArgs_comma = [f<a, b>, null];
+var typeArgs_equals = f<a, b> == null;
+var typeArgs_not_equals = f<a, b> != null;
+
+
+
+var typeArgs_openParen = f<a, b>();
+
+var typeArgs_percent = f<a, b> % 0;
+
+
+
+var typeArgs_period_methodInvocation = f<a, b>.toString();
+
+var typeArgs_period_methodInvocation_generic = f<a, b>.foo<c>();
+var typeArgs_period_period = f<a, b>..toString();
+var typeArgs_period_propertyAccess = f<a, b>.hashCode;
+var typeArgs_plus = f<a, b> + 0;
+
+
+
+
+
+var typeArgs_question = f<a, b> ? null : null;
+
+var typeArgs_question_period_methodInvocation = f<a, b>?.toString();
+var typeArgs_question_period_methodInvocation_generic = f<a, b>?.foo<c>();
+var typeArgs_question_period_period = f<a, b>?..toString();
+var typeArgs_question_period_propertyAccess = f<a, b>?.hashCode;
+var typeArgs_question_question = f<a, b> ?? 0;
+var typeArgs_semicolon = f<a, b>;
+var typeArgs_slash = f<a, b> / 1;
+var typeArgs_tilde_slash = f<a, b> ~/ 1;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var operators_bang_openBracket = f(a<b,c>![d]);
+
+var operators_bang_paren = f(a<b,c>!(d));
+
+
+
+
+
+var operators_lessThan = f<a><b>[];
+
+var operators_minus = f(a<b,c>-d);
+var operators_openBracket = f(a<b,c>[d]);
+
+
+
+
+
+
+var operators_openBracket_error = f(a<b,c>[d]>e);
+
+var operators_openBracket_unambiguous = f(a<b,c>[d, e]);
+
+
+var[KeywordToken] typeArgs_ampersand[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] &[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_asterisk[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] *[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_bar[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] |[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_caret[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ^[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_closeBrace[StringToken] =[SimpleToken] {[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]}[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_closeBracket[StringToken] =[SimpleToken] [[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]][SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_closeParen[StringToken] =[SimpleToken] g[StringToken]([BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_colon[StringToken] =[SimpleToken] {[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]:[SimpleToken] null[KeywordToken]}[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_comma[StringToken] =[SimpleToken] [[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken],[SimpleToken] null[KeywordToken]][SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ==[SimpleToken] null[KeywordToken];[SimpleToken]
+var[KeywordToken] typeArgs_not_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] !=[SimpleToken] null[KeywordToken];[SimpleToken]
+
+
+
+var[KeywordToken] typeArgs_openParen[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] typeArgs_percent[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] %[SimpleToken] 0[StringToken];[SimpleToken]
+
+
+
+var[KeywordToken] typeArgs_period_methodInvocation[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] typeArgs_period_methodInvocation_generic[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]<[BeginToken]c[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_period_period[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]..[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_period_propertyAccess[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken].[SimpleToken]hashCode[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_plus[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] +[SimpleToken] 0[StringToken];[SimpleToken]
+
+
+
+
+
+var[KeywordToken] typeArgs_question[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ?[SimpleToken] null[KeywordToken] :[SimpleToken] null[KeywordToken];[SimpleToken]
+
+var[KeywordToken] typeArgs_question_period_methodInvocation[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?.[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_period_methodInvocation_generic[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?.[SimpleToken]foo[StringToken]<[BeginToken]c[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_period_period[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?..[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_period_propertyAccess[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?.[SimpleToken]hashCode[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_question[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ??[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_semicolon[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_slash[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] /[SimpleToken] 1[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_tilde_slash[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ~/[SimpleToken] 1[StringToken];[SimpleToken]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var[KeywordToken] operators_bang_openBracket[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken]![SimpleToken][[BeginToken]d[StringToken]][SimpleToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] operators_bang_paren[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken]![SimpleToken]([BeginToken]d[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+
+
+
+
+var[KeywordToken] operators_lessThan[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken]>[SimpleToken]<[BeginToken]b[StringToken]>[SimpleToken][[SyntheticBeginToken]][SyntheticToken];[SimpleToken]
+
+var[KeywordToken] operators_minus[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken]-[SimpleToken]d[StringToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] operators_openBracket[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken][[BeginToken]d[StringToken]][SimpleToken])[SimpleToken];[SimpleToken]
+
+
+
+
+
+
+var[KeywordToken] operators_openBracket_error[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken][[BeginToken]d[StringToken]][SimpleToken]>[SimpleToken]e[StringToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] operators_openBracket_unambiguous[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken][[BeginToken]d[StringToken],[SimpleToken] e[StringToken]][SimpleToken])[SimpleToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.scanner.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.scanner.expect
new file mode 100644
index 0000000..32ed486
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.scanner.expect
@@ -0,0 +1,157 @@
+var typeArgs_ampersand = f<a, b> & 0;
+var typeArgs_asterisk = f<a, b> * 0;
+var typeArgs_bar = f<a, b> | 0;
+var typeArgs_caret = f<a, b> ^ 0;
+var typeArgs_closeBrace = {f<a, b>};
+var typeArgs_closeBracket = [f<a, b>];
+var typeArgs_closeParen = g(f<a, b>);
+var typeArgs_colon = {f<a, b>: null};
+var typeArgs_comma = [f<a, b>, null];
+var typeArgs_equals = f<a, b> == null;
+var typeArgs_not_equals = f<a, b> != null;
+
+
+
+var typeArgs_openParen = f<a, b>();
+
+var typeArgs_percent = f<a, b> % 0;
+
+
+
+var typeArgs_period_methodInvocation = f<a, b>.toString();
+
+var typeArgs_period_methodInvocation_generic = f<a, b>.foo<c>();
+var typeArgs_period_period = f<a, b>..toString();
+var typeArgs_period_propertyAccess = f<a, b>.hashCode;
+var typeArgs_plus = f<a, b> + 0;
+
+
+
+
+
+var typeArgs_question = f<a, b> ? null : null;
+
+var typeArgs_question_period_methodInvocation = f<a, b>?.toString();
+var typeArgs_question_period_methodInvocation_generic = f<a, b>?.foo<c>();
+var typeArgs_question_period_period = f<a, b>?..toString();
+var typeArgs_question_period_propertyAccess = f<a, b>?.hashCode;
+var typeArgs_question_question = f<a, b> ?? 0;
+var typeArgs_semicolon = f<a, b>;
+var typeArgs_slash = f<a, b> / 1;
+var typeArgs_tilde_slash = f<a, b> ~/ 1;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var operators_bang_openBracket = f(a<b,c>![d]);
+
+var operators_bang_paren = f(a<b,c>!(d));
+
+
+
+
+
+var operators_lessThan = f<a><b>;
+
+var operators_minus = f(a<b,c>-d);
+var operators_openBracket = f(a<b,c>[d]);
+
+
+
+
+
+
+var operators_openBracket_error = f(a<b,c>[d]>e);
+
+var operators_openBracket_unambiguous = f(a<b,c>[d, e]);
+
+
+var[KeywordToken] typeArgs_ampersand[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] &[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_asterisk[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] *[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_bar[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] |[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_caret[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ^[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_closeBrace[StringToken] =[SimpleToken] {[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]}[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_closeBracket[StringToken] =[SimpleToken] [[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]][SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_closeParen[StringToken] =[SimpleToken] g[StringToken]([BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_colon[StringToken] =[SimpleToken] {[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]:[SimpleToken] null[KeywordToken]}[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_comma[StringToken] =[SimpleToken] [[BeginToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken],[SimpleToken] null[KeywordToken]][SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ==[SimpleToken] null[KeywordToken];[SimpleToken]
+var[KeywordToken] typeArgs_not_equals[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] !=[SimpleToken] null[KeywordToken];[SimpleToken]
+
+
+
+var[KeywordToken] typeArgs_openParen[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] typeArgs_percent[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] %[SimpleToken] 0[StringToken];[SimpleToken]
+
+
+
+var[KeywordToken] typeArgs_period_methodInvocation[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] typeArgs_period_methodInvocation_generic[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]<[BeginToken]c[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_period_period[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]..[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_period_propertyAccess[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken].[SimpleToken]hashCode[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_plus[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] +[SimpleToken] 0[StringToken];[SimpleToken]
+
+
+
+
+
+var[KeywordToken] typeArgs_question[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ?[SimpleToken] null[KeywordToken] :[SimpleToken] null[KeywordToken];[SimpleToken]
+
+var[KeywordToken] typeArgs_question_period_methodInvocation[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?.[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_period_methodInvocation_generic[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?.[SimpleToken]foo[StringToken]<[BeginToken]c[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_period_period[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?..[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_period_propertyAccess[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken]?.[SimpleToken]hashCode[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_question_question[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ??[SimpleToken] 0[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_semicolon[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] typeArgs_slash[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] /[SimpleToken] 1[StringToken];[SimpleToken]
+var[KeywordToken] typeArgs_tilde_slash[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken] ~/[SimpleToken] 1[StringToken];[SimpleToken]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var[KeywordToken] operators_bang_openBracket[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken]![SimpleToken][[BeginToken]d[StringToken]][SimpleToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] operators_bang_paren[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken]![SimpleToken]([BeginToken]d[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+
+
+
+
+var[KeywordToken] operators_lessThan[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken]>[SimpleToken]<[BeginToken]b[StringToken]>[SimpleToken];[SimpleToken]
+
+var[KeywordToken] operators_minus[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken]-[SimpleToken]d[StringToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] operators_openBracket[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken][[BeginToken]d[StringToken]][SimpleToken])[SimpleToken];[SimpleToken]
+
+
+
+
+
+
+var[KeywordToken] operators_openBracket_error[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken][[BeginToken]d[StringToken]][SimpleToken]>[SimpleToken]e[StringToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] operators_openBracket_unambiguous[StringToken] =[SimpleToken] f[StringToken]([BeginToken]a[StringToken]<[BeginToken]b[StringToken],[SimpleToken]c[StringToken]>[SimpleToken][[BeginToken]d[StringToken],[SimpleToken] e[StringToken]][SimpleToken])[SimpleToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/function_reference_kinds.dart b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart
new file mode 100644
index 0000000..41ef715
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart
@@ -0,0 +1,8 @@
+// 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.
+
+var simpleIdentifier = f<a, b>;
+var method = f().m<a, b>;
+var prefixedIdentifier = prefix.f<a, b>;
+var three_identifiers = prefix.ClassName.m<a, b>;
diff --git a/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.expect b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.expect
new file mode 100644
index 0000000..c3fdd54
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.expect
@@ -0,0 +1,115 @@
+beginCompilationUnit(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields()
+      handleNoType(var)
+      handleIdentifier(simpleIdentifier, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(method, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(f, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(f, .)
+        handleIdentifier(m, expressionContinuation)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(m, <)
+        handleEndingBinaryExpression(.)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(prefixedIdentifier, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(prefix, expression)
+        handleNoTypeArguments(.)
+        handleNoArguments(.)
+        handleSend(prefix, .)
+        handleIdentifier(f, expressionContinuation)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(f, <)
+        handleEndingBinaryExpression(.)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    beginFields(;)
+      handleNoType(var)
+      handleIdentifier(three_identifiers, topLevelVariableDeclaration)
+      beginFieldInitializer(=)
+        handleIdentifier(prefix, expression)
+        handleNoTypeArguments(.)
+        handleNoArguments(.)
+        handleSend(prefix, .)
+        handleIdentifier(ClassName, expressionContinuation)
+        handleNoTypeArguments(.)
+        handleNoArguments(.)
+        handleSend(ClassName, .)
+        handleEndingBinaryExpression(.)
+        handleIdentifier(m, expressionContinuation)
+        handleNoTypeArguments(<)
+        handleNoArguments(<)
+        handleSend(m, <)
+        handleEndingBinaryExpression(.)
+        beginTypeArguments(<)
+          handleIdentifier(a, typeReference)
+          handleNoTypeArguments(,)
+          handleType(a, null)
+          handleIdentifier(b, typeReference)
+          handleNoTypeArguments(>)
+          handleType(b, null)
+        endTypeArguments(2, <, >)
+        handleTypeArgumentApplication(<)
+      endFieldInitializer(=, ;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration()
+endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.intertwined.expect
new file mode 100644
index 0000000..93e6d37
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.intertwined.expect
@@ -0,0 +1,206 @@
+parseUnit(var)
+  skipErrorTokens(var)
+  listener: beginCompilationUnit(var)
+  syntheticPreviousToken(var)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(var)
+      parseFields(, null, null, null, null, null, var, var, Instance of 'NoType', simpleIdentifier, DeclarationKind.TopLevel, null, false)
+        listener: beginFields()
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(simpleIdentifier, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(simpleIdentifier, simpleIdentifier, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(<)
+                      parseArgumentsOpt(f)
+                        listener: handleNoArguments(<)
+                      listener: handleSend(f, <)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', method, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(method, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(method, method, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    looksLikeFunctionBody(.)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(f, expression)
+                      listener: handleNoTypeArguments(()
+                      parseArgumentsOpt(f)
+                        parseArguments(f)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            listener: endArguments(0, (, ))
+                      listener: handleSend(f, .)
+              parsePrimary(., expressionContinuation)
+                parseSendOrFunctionLiteral(., expressionContinuation)
+                  parseSend(., expressionContinuation)
+                    isNextIdentifier(.)
+                    ensureIdentifier(., expressionContinuation)
+                      listener: handleIdentifier(m, expressionContinuation)
+                    listener: handleNoTypeArguments(<)
+                    parseArgumentsOpt(m)
+                      listener: handleNoArguments(<)
+                    listener: handleSend(m, <)
+              listener: handleEndingBinaryExpression(.)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', prefixedIdentifier, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(prefixedIdentifier, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(prefixedIdentifier, prefixedIdentifier, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(prefix, expression)
+                      listener: handleNoTypeArguments(.)
+                      parseArgumentsOpt(prefix)
+                        listener: handleNoArguments(.)
+                      listener: handleSend(prefix, .)
+              parsePrimary(., expressionContinuation)
+                parseSendOrFunctionLiteral(., expressionContinuation)
+                  parseSend(., expressionContinuation)
+                    isNextIdentifier(.)
+                    ensureIdentifier(., expressionContinuation)
+                      listener: handleIdentifier(f, expressionContinuation)
+                    listener: handleNoTypeArguments(<)
+                    parseArgumentsOpt(f)
+                      listener: handleNoArguments(<)
+                    listener: handleSend(f, <)
+              listener: handleEndingBinaryExpression(.)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      parseFields(;, null, null, null, null, null, var, var, Instance of 'NoType', three_identifiers, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(var)
+        ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(three_identifiers, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(three_identifiers, three_identifiers, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: beginFieldInitializer(=)
+          parseExpression(=)
+            parsePrecedenceExpression(=, 1, true)
+              parseUnaryExpression(=, true)
+                parsePrimary(=, expression)
+                  parseSendOrFunctionLiteral(=, expression)
+                    parseSend(=, expression)
+                      isNextIdentifier(=)
+                      ensureIdentifier(=, expression)
+                        listener: handleIdentifier(prefix, expression)
+                      listener: handleNoTypeArguments(.)
+                      parseArgumentsOpt(prefix)
+                        listener: handleNoArguments(.)
+                      listener: handleSend(prefix, .)
+              parsePrimary(., expressionContinuation)
+                parseSendOrFunctionLiteral(., expressionContinuation)
+                  parseSend(., expressionContinuation)
+                    isNextIdentifier(.)
+                    ensureIdentifier(., expressionContinuation)
+                      listener: handleIdentifier(ClassName, expressionContinuation)
+                    listener: handleNoTypeArguments(.)
+                    parseArgumentsOpt(ClassName)
+                      listener: handleNoArguments(.)
+                    listener: handleSend(ClassName, .)
+              listener: handleEndingBinaryExpression(.)
+              parsePrimary(., expressionContinuation)
+                parseSendOrFunctionLiteral(., expressionContinuation)
+                  parseSend(., expressionContinuation)
+                    isNextIdentifier(.)
+                    ensureIdentifier(., expressionContinuation)
+                      listener: handleIdentifier(m, expressionContinuation)
+                    listener: handleNoTypeArguments(<)
+                    parseArgumentsOpt(m)
+                      listener: handleNoArguments(<)
+                    listener: handleSend(m, <)
+              listener: handleEndingBinaryExpression(.)
+              listener: beginTypeArguments(<)
+              listener: handleIdentifier(a, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(a, null)
+              listener: handleIdentifier(b, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(b, null)
+              listener: endTypeArguments(2, <, >)
+              listener: handleTypeArgumentApplication(<)
+          listener: endFieldInitializer(=, ;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(var)
+  listener: endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.parser.expect b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.parser.expect
new file mode 100644
index 0000000..f8a341f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.parser.expect
@@ -0,0 +1,11 @@
+var simpleIdentifier = f<a, b>;
+var method = f().m<a, b>;
+var prefixedIdentifier = prefix.f<a, b>;
+var three_identifiers = prefix.ClassName.m<a, b>;
+
+
+var[KeywordToken] simpleIdentifier[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] method[StringToken] =[SimpleToken] f[StringToken]([BeginToken])[SimpleToken].[SimpleToken]m[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] prefixedIdentifier[StringToken] =[SimpleToken] prefix[StringToken].[SimpleToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] three_identifiers[StringToken] =[SimpleToken] prefix[StringToken].[SimpleToken]ClassName[StringToken].[SimpleToken]m[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.scanner.expect b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.scanner.expect
new file mode 100644
index 0000000..f8a341f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/function_reference_kinds.dart.scanner.expect
@@ -0,0 +1,11 @@
+var simpleIdentifier = f<a, b>;
+var method = f().m<a, b>;
+var prefixedIdentifier = prefix.f<a, b>;
+var three_identifiers = prefix.ClassName.m<a, b>;
+
+
+var[KeywordToken] simpleIdentifier[StringToken] =[SimpleToken] f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] method[StringToken] =[SimpleToken] f[StringToken]([BeginToken])[SimpleToken].[SimpleToken]m[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] prefixedIdentifier[StringToken] =[SimpleToken] prefix[StringToken].[SimpleToken]f[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+var[KeywordToken] three_identifiers[StringToken] =[SimpleToken] prefix[StringToken].[SimpleToken]ClassName[StringToken].[SimpleToken]m[StringToken]<[BeginToken]a[StringToken],[SimpleToken] b[StringToken]>[SimpleToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/test/comments_on_certain_arguments_tool.dart b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
index 8d1a909..56ddf2e 100644
--- a/pkg/front_end/test/comments_on_certain_arguments_tool.dart
+++ b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
@@ -5,32 +5,52 @@
 // @dart = 2.9
 
 import 'dart:convert' show utf8;
+
 import 'dart:io'
     show Directory, File, FileSystemEntity, exitCode, stdin, stdout;
 
+import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
+
 import 'package:_fe_analyzer_shared/src/scanner/token.dart'
     show CommentToken, Token;
-import 'package:front_end/src/api_prototype/compiler_options.dart' as api;
-import 'package:front_end/src/api_prototype/file_system.dart' as api;
-import 'package:front_end/src/api_unstable/ddc.dart'
-    show CompilerContext, IncrementalCompiler, ProcessedOptions, Severity;
+
+import 'package:front_end/src/api_prototype/compiler_options.dart' as api
+    show CompilerOptions, DiagnosticMessage;
+
+import 'package:front_end/src/api_prototype/file_system.dart' as api
+    show FileSystem;
+
+import 'package:front_end/src/base/processed_options.dart'
+    show ProcessedOptions;
+
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
 import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
+
 import 'package:front_end/src/fasta/incremental_compiler.dart'
     show IncrementalCompiler, IncrementalKernelTarget;
+
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
+
 import 'package:front_end/src/fasta/source/source_library_builder.dart'
     show SourceLibraryBuilder;
+
 import 'package:front_end/src/fasta/source/source_loader.dart'
     show SourceLoader;
+
 import 'package:front_end/src/fasta/uri_translator.dart' show UriTranslator;
-import 'package:kernel/kernel.dart';
+
+import 'package:kernel/ast.dart';
+
 import 'package:kernel/target/targets.dart' show TargetFlags;
+
 import "package:vm/target/vm.dart" show VmTarget;
 
-import "utils/io_utils.dart";
+import "utils/io_utils.dart" show computeRepoDirUri;
 
 final Uri repoDir = computeRepoDirUri();
 
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index 2da47c7f..4cbd8e7 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
@@ -9,14 +9,20 @@
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage, getMessageCodeObject;
 
+import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
+
 import 'package:expect/expect.dart' show Expect;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions;
 
+import 'package:front_end/src/api_prototype/experimental_flags.dart'
+    show ExperimentalFlag;
+
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem;
-import 'package:front_end/src/api_unstable/bazel_worker.dart';
+
+import 'package:front_end/src/base/nnbd_mode.dart' show NnbdMode;
 
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
@@ -37,6 +43,8 @@
 import 'package:front_end/src/fasta/incremental_compiler.dart'
     show IncrementalCompiler;
 
+import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
+
 import 'package:kernel/kernel.dart'
     show Component, Library, NonNullableByDefaultCompiledMode;
 
diff --git a/pkg/front_end/test/incremental_suite.dart b/pkg/front_end/test/incremental_suite.dart
index b623b65..f340d68 100644
--- a/pkg/front_end/test/incremental_suite.dart
+++ b/pkg/front_end/test/incremental_suite.dart
@@ -23,7 +23,9 @@
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, parseExperimentalArguments, parseExperimentalFlags;
-import 'package:front_end/src/api_prototype/experimental_flags.dart';
+
+import 'package:front_end/src/api_prototype/experimental_flags.dart'
+    show ExperimentalFlag, experimentEnabledVersion;
 
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem;
@@ -46,20 +48,23 @@
 
 import 'package:front_end/src/fasta/incremental_serializer.dart'
     show IncrementalSerializer;
-import 'package:front_end/src/fasta/kernel/kernel_api.dart';
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
+
 import 'package:kernel/ast.dart';
 
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
 
 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
-import 'package:kernel/class_hierarchy.dart';
+
+import 'package:kernel/class_hierarchy.dart'
+    show ClassHierarchy, ClosedWorldClassHierarchy, ForTestingClassInfo;
 
 import 'package:kernel/target/targets.dart'
     show NoneTarget, LateLowering, Target, TargetFlags;
 
-import 'package:kernel/text/ast_to_text.dart' show Printer, componentToString;
+import 'package:kernel/text/ast_to_text.dart'
+    show NameSystem, Printer, componentToString;
 
 import "package:testing/testing.dart"
     show Chain, ChainContext, Expectation, Result, Step, TestDescription, runMe;
diff --git a/pkg/front_end/test/multiple_simultaneous_compiles_test.dart b/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
index c64e9fe..3e5d055 100644
--- a/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
+++ b/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
@@ -4,11 +4,17 @@
 
 // @dart = 2.9
 
-import 'dart:io';
+import 'dart:io' show File, Platform;
 
-import 'package:front_end/src/api_unstable/vm.dart';
-import 'package:front_end/src/fasta/incremental_compiler.dart';
-import 'package:kernel/ast.dart';
+import 'package:front_end/src/base/processed_options.dart'
+    show ProcessedOptions;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+
+import 'package:kernel/ast.dart' show Component;
 
 import 'incremental_suite.dart' show getOptions;
 
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index c3a0373..ca40095 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -2209,4 +2209,9 @@
   void handleNoCommentReference() {
     doPrint('handleNoCommentReference()');
   }
+
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    seen(openAngleBracket);
+    doPrint('handleTypeArgumentApplication(' '$openAngleBracket)');
+  }
 }
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index a1b8799..dab3f99 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -23,6 +23,7 @@
 activated
 adequate
 adi
+advantage
 affecting
 afterwards
 agree
@@ -300,6 +301,7 @@
 degree
 del
 delimit
+delimiting
 demands
 demangle
 demangled
@@ -333,6 +335,7 @@
 dirtifying
 dirty
 disallow
+disambiguating
 disambiguator
 disjoint
 dispatched
@@ -611,6 +614,7 @@
 invariants
 io
 is64
+isolated
 issuecomment
 issuing
 iterables
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 5136f0f..5b999be 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -42,6 +42,7 @@
 asdf
 asserter
 assure
+asterisk
 auth
 authority
 autobianchi
@@ -145,6 +146,7 @@
 columns
 commented
 commit
+commits
 companion
 comparative
 comparer
@@ -497,11 +499,13 @@
 logd
 logs
 loo
+lookahead
 loopback
 mac
 maker
 matters
 mds
+meaningless
 measured
 method1d
 metric
@@ -541,6 +545,7 @@
 nondefault
 nonexisting
 noo
+noted
 numerator
 ob
 obool
@@ -642,6 +647,7 @@
 regenerate
 regressions
 reify
+reject
 reload
 remap
 remaps
diff --git a/pkg/front_end/test/spelling_test_base.dart b/pkg/front_end/test/spelling_test_base.dart
index 1c3a3ff..a7dd236 100644
--- a/pkg/front_end/test/spelling_test_base.dart
+++ b/pkg/front_end/test/spelling_test_base.dart
@@ -10,7 +10,8 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show ErrorToken;
 
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/token.dart'
+    show BeginToken, KeywordToken, StringToken, Token;
 
 import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
     show Utf8BytesScanner;
@@ -18,7 +19,7 @@
 import 'package:front_end/src/fasta/command_line_reporting.dart'
     as command_line_reporting;
 
-import 'package:kernel/kernel.dart';
+import 'package:kernel/kernel.dart' show Location, Source;
 
 import 'package:testing/testing.dart'
     show Chain, ChainContext, Result, Step, TestDescription;
diff --git a/pkg/front_end/test/static_types/analysis_helper.dart b/pkg/front_end/test/static_types/analysis_helper.dart
index 2c50697..3ae2d5b 100644
--- a/pkg/front_end/test/static_types/analysis_helper.dart
+++ b/pkg/front_end/test/static_types/analysis_helper.dart
@@ -9,8 +9,9 @@
 
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart';
 import 'package:expect/expect.dart';
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/api_unstable/ddc.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/kernel_generator.dart';
+import 'package:front_end/src/api_prototype/terminal_color_support.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart';
 import 'package:front_end/src/fasta/command_line_reporting.dart';
 import 'package:front_end/src/fasta/fasta_codes.dart';
diff --git a/pkg/front_end/testcases/general/issue44347.dart.weak.expect b/pkg/front_end/testcases/general/issue44347.dart.weak.expect
index df1f308..23f91b5 100644
--- a/pkg/front_end/testcases/general/issue44347.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue44347.dart.weak.expect
@@ -2,16 +2,27 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/issue44347.dart:6:6: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   Set<int>.();
+//      ^
+//
+// pkg/front_end/testcases/general/issue44347.dart:6:13: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   Set<int>.();
+//             ^
+//
 // pkg/front_end/testcases/general/issue44347.dart:6:12: Error: Expected an identifier, but got '('.
 // Try inserting an identifier before '('.
 //   Set<int>.();
 //            ^
 //
 import self as self;
-import "dart:collection" as col;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  col::LinkedHashSet::•<core::int*>();
+  invalid-expression "pkg/front_end/testcases/general/issue44347.dart:6:12: Error: Expected an identifier, but got '('.
+Try inserting an identifier before '('.
+  Set<int>.();
+           ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue44347.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue44347.dart.weak.transformed.expect
index a3adab2..23f91b5 100644
--- a/pkg/front_end/testcases/general/issue44347.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue44347.dart.weak.transformed.expect
@@ -2,16 +2,27 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/issue44347.dart:6:6: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   Set<int>.();
+//      ^
+//
+// pkg/front_end/testcases/general/issue44347.dart:6:13: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   Set<int>.();
+//             ^
+//
 // pkg/front_end/testcases/general/issue44347.dart:6:12: Error: Expected an identifier, but got '('.
 // Try inserting an identifier before '('.
 //   Set<int>.();
 //            ^
 //
 import self as self;
-import "dart:collection" as col;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  new col::_CompactLinkedHashSet::•<core::int*>();
+  invalid-expression "pkg/front_end/testcases/general/issue44347.dart:6:12: Error: Expected an identifier, but got '('.
+Try inserting an identifier before '('.
+  Set<int>.();
+           ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
index 93a9e56..502a159 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f<dynamic>)(/*@returnType=int**/() {
+var v = (f<dynamic>)/*@typeArgs=int**/(/*@returnType=int**/() {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.textual_outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.textual_outline.expect
index 57b0e1a..a630be5 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.textual_outline.expect
@@ -1,5 +1,5 @@
 // @dart = 2.9
 library test;
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f<dynamic>)( () { return 1; });
+var v = (f<dynamic>) ( () { return 1; });
 main() {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.expect
index ab6bbb7..c90ed22 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.expect
@@ -2,34 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:19: Error: A comparison expression can't be an operand of another comparison expression.
-// Try putting parentheses around one of the comparisons.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
-//                   ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: Expected an identifier, but got ')'.
-// Try inserting an identifier before ')'.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
-//                    ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
-//  - 'List' is from 'dart:core'.
-// Try correcting the operator to an existing operator, or defining a '<' operator.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// var v = (f<dynamic>)/*@typeArgs=int**/(/*@returnType=int**/() {
 //           ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
- - 'List' is from 'dart:core'.
-Try correcting the operator to an existing operator, or defining a '<' operator.
-var v = (f<dynamic>)(/*@returnType=int**/() {
-          ^"{dynamic}.>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: This couldn't be parsed.
-var v = (f<dynamic>)(/*@returnType=int**/() {
-                   ^"){dynamic}.call(() → core::int* {
+static field core::List<core::int*>* v = (#C1)<core::int*>(() → core::int* {
   return 1;
-});
+}){(() →* core::int*) →* core::List<core::int*>*};
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   return <self::f::T*>[g(){() →* self::f::T*}];
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.outline.expect
index 91c3ff0..ff81030 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.outline.expect
@@ -2,20 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:19: Error: A comparison expression can't be an operand of another comparison expression.
-// Try putting parentheses around one of the comparisons.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
-//                   ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: Expected an identifier, but got ')'.
-// Try inserting an identifier before ')'.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
-//                    ^
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// var v = (f<dynamic>)/*@typeArgs=int**/(/*@returnType=int**/() {
+//           ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v;
+static field core::List<core::int*>* v;
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.transformed.expect
index 96fca33..2c7a1d7 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.transformed.expect
@@ -2,34 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:19: Error: A comparison expression can't be an operand of another comparison expression.
-// Try putting parentheses around one of the comparisons.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
-//                   ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: Expected an identifier, but got ')'.
-// Try inserting an identifier before ')'.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
-//                    ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
-//  - 'List' is from 'dart:core'.
-// Try correcting the operator to an existing operator, or defining a '<' operator.
-// var v = (f<dynamic>)(/*@returnType=int**/() {
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// var v = (f<dynamic>)/*@typeArgs=int**/(/*@returnType=int**/() {
 //           ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
- - 'List' is from 'dart:core'.
-Try correcting the operator to an existing operator, or defining a '<' operator.
-var v = (f<dynamic>)(/*@returnType=int**/() {
-          ^"{dynamic}.>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: This couldn't be parsed.
-var v = (f<dynamic>)(/*@returnType=int**/() {
-                   ^"){dynamic}.call(() → core::int* {
+static field core::List<core::int*>* v = (#C1)<core::int*>(() → core::int* {
   return 1;
-});
+}){(() →* core::int*) →* core::List<core::int*>*};
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   return core::_GrowableList::_literal1<self::f::T*>(g(){() →* self::f::T*});
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
index b147aac..da80b1a 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f<int>)(/*@returnType=int**/() {
+var v = (f<int>)/*@typeArgs=int**/(/*@returnType=int**/() {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.textual_outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.textual_outline.expect
index 8194b88..9b37c02 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.textual_outline.expect
@@ -1,5 +1,5 @@
 // @dart = 2.9
 library test;
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f<int>)( () { return 1; });
+var v = (f<int>) ( () { return 1; });
 main() {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.expect
index d66c0af..d25a131 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.expect
@@ -2,34 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:15: Error: A comparison expression can't be an operand of another comparison expression.
-// Try putting parentheses around one of the comparisons.
-// var v = (f<int>)(/*@returnType=int**/() {
-//               ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: Expected an identifier, but got ')'.
-// Try inserting an identifier before ')'.
-// var v = (f<int>)(/*@returnType=int**/() {
-//                ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
-//  - 'List' is from 'dart:core'.
-// Try correcting the operator to an existing operator, or defining a '<' operator.
-// var v = (f<int>)(/*@returnType=int**/() {
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// var v = (f<int>)/*@typeArgs=int**/(/*@returnType=int**/() {
 //           ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
- - 'List' is from 'dart:core'.
-Try correcting the operator to an existing operator, or defining a '<' operator.
-var v = (f<int>)(/*@returnType=int**/() {
-          ^"{dynamic}.>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: This couldn't be parsed.
-var v = (f<int>)(/*@returnType=int**/() {
-               ^"){dynamic}.call(() → core::int* {
+static field core::List<core::int*>* v = (#C1)<core::int*>(() → core::int* {
   return 1;
-});
+}){(() →* core::int*) →* core::List<core::int*>*};
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   return <self::f::T*>[g(){() →* self::f::T*}];
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.outline.expect
index ac5f82d..337c89c 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.outline.expect
@@ -2,20 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:15: Error: A comparison expression can't be an operand of another comparison expression.
-// Try putting parentheses around one of the comparisons.
-// var v = (f<int>)(/*@returnType=int**/() {
-//               ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: Expected an identifier, but got ')'.
-// Try inserting an identifier before ')'.
-// var v = (f<int>)(/*@returnType=int**/() {
-//                ^
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// var v = (f<int>)/*@typeArgs=int**/(/*@returnType=int**/() {
+//           ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v;
+static field core::List<core::int*>* v;
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.transformed.expect
index 6c6b1ff..6d9032c 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.transformed.expect
@@ -2,34 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:15: Error: A comparison expression can't be an operand of another comparison expression.
-// Try putting parentheses around one of the comparisons.
-// var v = (f<int>)(/*@returnType=int**/() {
-//               ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: Expected an identifier, but got ')'.
-// Try inserting an identifier before ')'.
-// var v = (f<int>)(/*@returnType=int**/() {
-//                ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
-//  - 'List' is from 'dart:core'.
-// Try correcting the operator to an existing operator, or defining a '<' operator.
-// var v = (f<int>)(/*@returnType=int**/() {
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+// var v = (f<int>)/*@typeArgs=int**/(/*@returnType=int**/() {
 //           ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: The operator '<' isn't defined for the class 'List<T> Function<T>(T Function())'.
- - 'List' is from 'dart:core'.
-Try correcting the operator to an existing operator, or defining a '<' operator.
-var v = (f<int>)(/*@returnType=int**/() {
-          ^"{dynamic}.>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: This couldn't be parsed.
-var v = (f<int>)(/*@returnType=int**/() {
-               ^"){dynamic}.call(() → core::int* {
+static field core::List<core::int*>* v = (#C1)<core::int*>(() → core::int* {
   return 1;
-});
+}){(() →* core::int*) →* core::List<core::int*>*};
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   return core::_GrowableList::_literal1<self::f::T*>(g(){() →* self::f::T*});
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.textual_outline.expect b/pkg/front_end/testcases/regress/issue_31188.dart.textual_outline.expect
index a967c78..2c07051 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.textual_outline.expect
@@ -1,4 +1,3 @@
 // @dart = 2.9
 main() {}
-type T = Map<A, B;
->
+type T = Map<A, B> ;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.weak.expect b/pkg/front_end/testcases/regress/issue_31188.dart.weak.expect
index d20d13f..cdeea07 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.weak.expect
@@ -2,11 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
-// type T = Map<A, B>
-//                 ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' after this.
 // type T = Map<A, B>
 //                  ^
 //
@@ -18,22 +14,25 @@
 // type T = Map<A, B>
 // ^^^^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: 'A' isn't a type.
 // type T = Map<A, B>
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
-//  - 'Type' is from 'dart:core'.
-// Try correcting the operator to an existing operator, or defining a '<' operator.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: 'B' isn't a type.
+// type T = Map<A, B>
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
 // type T = Map<A, B>
 //             ^
 //
 import self as self;
+import "dart:core" as core;
 
-static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
- - 'Type' is from 'dart:core'.
-Try correcting the operator to an existing operator, or defining a '<' operator.
-type T = Map<A, B>
-            ^";
-static field invalid-type B;
+static field invalid-type T = #C1;
 static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Map<dynamic, dynamic>*)
+}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_31188.dart.weak.outline.expect
index a5b32ff..71e9e57 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.weak.outline.expect
@@ -2,11 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
-// type T = Map<A, B>
-//                 ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' after this.
 // type T = Map<A, B>
 //                  ^
 //
@@ -17,6 +13,5 @@
 import self as self;
 
 static field invalid-type T;
-static field invalid-type B;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.weak.transformed.expect
index d20d13f..cdeea07 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.weak.transformed.expect
@@ -2,11 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
-// type T = Map<A, B>
-//                 ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' after this.
 // type T = Map<A, B>
 //                  ^
 //
@@ -18,22 +14,25 @@
 // type T = Map<A, B>
 // ^^^^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: 'A' isn't a type.
 // type T = Map<A, B>
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
-//  - 'Type' is from 'dart:core'.
-// Try correcting the operator to an existing operator, or defining a '<' operator.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: 'B' isn't a type.
+// type T = Map<A, B>
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
 // type T = Map<A, B>
 //             ^
 //
 import self as self;
+import "dart:core" as core;
 
-static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
- - 'Type' is from 'dart:core'.
-Try correcting the operator to an existing operator, or defining a '<' operator.
-type T = Map<A, B>
-            ^";
-static field invalid-type B;
+static field invalid-type T = #C1;
 static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Map<dynamic, dynamic>*)
+}
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.weak.expect b/pkg/front_end/testcases/regress/issue_34403.dart.weak.expect
index 681977f..5391261 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.weak.expect
@@ -12,6 +12,11 @@
 //   var c2 = new C.bar<int>();
 //                  ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:20:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var c3 = C<String>.bar<int>();
+//             ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:20:22: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   var c3 = C<String>.bar<int>();
@@ -32,6 +37,11 @@
 //   const d2 = const D.foo<int>();
 //                      ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:29:15: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const d3 = D<String>.foo<int>();
+//               ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:29:24: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   const d3 = D<String>.foo<int>();
@@ -52,6 +62,11 @@
 //   var e2 = new p.E.bar<int>();
 //                    ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:38:15: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var e3 = p.E<String>.bar<int>();
+//               ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:38:24: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   var e3 = p.E<String>.bar<int>();
@@ -72,6 +87,11 @@
 //   const f2 = const p.F.foo<int>();
 //                        ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:47:17: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const f3 = p.F<String>.foo<int>();
+//                 ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:47:26: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   const f3 = p.F<String>.foo<int>();
@@ -123,25 +143,25 @@
   c1.{self::C::toString}(){() →* core::String*};
   self::C<core::int*>* c2 = new self::C::bar<core::int*>();
   c2.{self::C::toString}(){() →* core::String*};
-  self::C<core::String*>* c3 = new self::C::bar<core::String*>();
+  self::C<core::int*>* c3 = new self::C::bar<core::int*>();
   c3.{self::C::toString}(){() →* core::String*};
   self::C<core::String*>* c4 = new self::C::bar<core::String*>();
   c4.{self::C::toString}(){() →* core::String*};
   (#C1).{self::D::toString}(){() →* core::String*};
   (#C1).{self::D::toString}(){() →* core::String*};
-  (#C2).{self::D::toString}(){() →* core::String*};
+  (#C1).{self::D::toString}(){() →* core::String*};
   (#C2).{self::D::toString}(){() →* core::String*};
   iss::E<core::int*>* e1 = new iss::E::bar<core::int*>();
   e1.{iss::E::toString}(){() →* core::String*};
   iss::E<dynamic>* e2 = new iss::E::bar<dynamic>();
   e2.{iss::E::toString}(){() →* core::String*};
-  iss::E<core::String*>* e3 = new iss::E::bar<core::String*>();
+  iss::E<core::int*>* e3 = new iss::E::bar<core::int*>();
   e3.{iss::E::toString}(){() →* core::String*};
   iss::E<core::String*>* e4 = new iss::E::bar<core::String*>();
   e4.{iss::E::toString}(){() →* core::String*};
   (#C3).{iss::F::toString}(){() →* core::String*};
   (#C4).{iss::F::toString}(){() →* core::String*};
-  (#C5).{iss::F::toString}(){() →* core::String*};
+  (#C3).{iss::F::toString}(){() →* core::String*};
   (#C5).{iss::F::toString}(){() →* core::String*};
 }
 
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_34403.dart.weak.transformed.expect
index 681977f..5391261 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.weak.transformed.expect
@@ -12,6 +12,11 @@
 //   var c2 = new C.bar<int>();
 //                  ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:20:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var c3 = C<String>.bar<int>();
+//             ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:20:22: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   var c3 = C<String>.bar<int>();
@@ -32,6 +37,11 @@
 //   const d2 = const D.foo<int>();
 //                      ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:29:15: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const d3 = D<String>.foo<int>();
+//               ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:29:24: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   const d3 = D<String>.foo<int>();
@@ -52,6 +62,11 @@
 //   var e2 = new p.E.bar<int>();
 //                    ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:38:15: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var e3 = p.E<String>.bar<int>();
+//               ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:38:24: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   var e3 = p.E<String>.bar<int>();
@@ -72,6 +87,11 @@
 //   const f2 = const p.F.foo<int>();
 //                        ^^^
 //
+// pkg/front_end/testcases/regress/issue_34403.dart:47:17: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const f3 = p.F<String>.foo<int>();
+//                 ^
+//
 // pkg/front_end/testcases/regress/issue_34403.dart:47:26: Error: A constructor invocation can't have type arguments on the constructor name.
 // Try to place the type arguments on the class name.
 //   const f3 = p.F<String>.foo<int>();
@@ -123,25 +143,25 @@
   c1.{self::C::toString}(){() →* core::String*};
   self::C<core::int*>* c2 = new self::C::bar<core::int*>();
   c2.{self::C::toString}(){() →* core::String*};
-  self::C<core::String*>* c3 = new self::C::bar<core::String*>();
+  self::C<core::int*>* c3 = new self::C::bar<core::int*>();
   c3.{self::C::toString}(){() →* core::String*};
   self::C<core::String*>* c4 = new self::C::bar<core::String*>();
   c4.{self::C::toString}(){() →* core::String*};
   (#C1).{self::D::toString}(){() →* core::String*};
   (#C1).{self::D::toString}(){() →* core::String*};
-  (#C2).{self::D::toString}(){() →* core::String*};
+  (#C1).{self::D::toString}(){() →* core::String*};
   (#C2).{self::D::toString}(){() →* core::String*};
   iss::E<core::int*>* e1 = new iss::E::bar<core::int*>();
   e1.{iss::E::toString}(){() →* core::String*};
   iss::E<dynamic>* e2 = new iss::E::bar<dynamic>();
   e2.{iss::E::toString}(){() →* core::String*};
-  iss::E<core::String*>* e3 = new iss::E::bar<core::String*>();
+  iss::E<core::int*>* e3 = new iss::E::bar<core::int*>();
   e3.{iss::E::toString}(){() →* core::String*};
   iss::E<core::String*>* e4 = new iss::E::bar<core::String*>();
   e4.{iss::E::toString}(){() →* core::String*};
   (#C3).{iss::F::toString}(){() →* core::String*};
   (#C4).{iss::F::toString}(){() →* core::String*};
-  (#C5).{iss::F::toString}(){() →* core::String*};
+  (#C3).{iss::F::toString}(){() →* core::String*};
   (#C5).{iss::F::toString}(){() →* core::String*};
 }
 
diff --git a/pkg/front_end/tool/kernel_ast_file_rewriter.dart b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
index eaa6bcc..7f3e6da 100644
--- a/pkg/front_end/tool/kernel_ast_file_rewriter.dart
+++ b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
@@ -7,10 +7,14 @@
 import "dart:io" show File, Platform, stdout;
 import "dart:typed_data" show Uint8List;
 
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import "package:front_end/src/fasta/util/direct_parser_ast.dart";
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show IdentifierContext;
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart'
+    show CommentToken, Token;
+
+import "package:front_end/src/fasta/util/direct_parser_ast.dart";
+
 import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
 
 void main(List<String> args) {
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index a7a04be..503bb93 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -4020,8 +4020,7 @@
     if (Snapshot::IncludesCode(d->kind())) {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
         type ^= refs.At(id);
-        stub = type.type_test_stub();
-        type.SetTypeTestingStub(stub);  // Update type_test_stub_entry_point_
+        type.UpdateTypeTestingStubEntryPoint();
       }
     } else {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -4154,8 +4153,7 @@
     if (Snapshot::IncludesCode(d->kind())) {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
         type ^= refs.At(id);
-        stub = type.type_test_stub();
-        type.SetTypeTestingStub(stub);  // Update type_test_stub_entry_point_
+        type.UpdateTypeTestingStubEntryPoint();
       }
     } else {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -4245,9 +4243,7 @@
     if (Snapshot::IncludesCode(d->kind())) {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
         type_ref ^= refs.At(id);
-        stub = type_ref.type_test_stub();
-        type_ref.SetTypeTestingStub(
-            stub);  // Update type_test_stub_entry_point_
+        type_ref.UpdateTypeTestingStubEntryPoint();
       }
     } else {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -4380,9 +4376,7 @@
     if (Snapshot::IncludesCode(d->kind())) {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
         type_param ^= refs.At(id);
-        stub = type_param.type_test_stub();
-        type_param.SetTypeTestingStub(
-            stub);  // Update type_test_stub_entry_point_
+        type_param.UpdateTypeTestingStubEntryPoint();
       }
     } else {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index c3361b3..d6a92d4 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -8111,6 +8111,10 @@
   CodePtr type_test_stub() const { return untag()->type_test_stub(); }
 
   void SetTypeTestingStub(const Code& stub) const;
+  void UpdateTypeTestingStubEntryPoint() const {
+    StoreNonPointer(&untag()->type_test_stub_entry_point_,
+                    Code::EntryPointOf(untag()->type_test_stub()));
+  }
 
   // No instances of type AbstractType are allocated, but InstanceSize() and
   // NextFieldOffset() are required to register class _AbstractType.
diff --git a/samples/ffi/resource_management/arena.dart b/samples/ffi/resource_management/arena.dart
new file mode 100644
index 0000000..8d30382
--- /dev/null
+++ b/samples/ffi/resource_management/arena.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Explicit arena used for managing resources.
+
+import 'dart:async';
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+/// An [Allocator] which frees all allocations at the same time.
+///
+/// The arena allows you to allocate heap memory, but ignores calls to [free].
+/// Instead you call [releaseAll] to release all the allocations at the same
+/// time.
+///
+/// Also allows other resources to be associated with the arena, through the
+/// [using] method, to have a release function called for them when the arena is
+/// released.
+///
+/// An [Allocator] can be provided to do the actual allocation and freeing.
+/// Defaults to using [calloc].
+class Arena implements Allocator {
+  /// The [Allocator] used for allocation and freeing.
+  final Allocator _wrappedAllocator;
+
+  /// Native memory under management by this [Arena].
+  final List<Pointer<NativeType>> _managedMemoryPointers = [];
+
+  /// Callbacks for releasing native resources under management by this [Arena].
+  final List<void Function()> _managedResourceReleaseCallbacks = [];
+
+  bool _inUse = true;
+
+  /// Creates a arena of allocations.
+  ///
+  /// The [allocator] is used to do the actual allocation and freeing of
+  /// memory. It defaults to using [calloc].
+  Arena([Allocator allocator = calloc]) : _wrappedAllocator = allocator;
+
+  /// Allocates memory and includes it in the arena.
+  ///
+  /// Uses the allocator provided to the [Arena] constructor to do the
+  /// allocation.
+  ///
+  /// Throws an [ArgumentError] if the number of bytes or alignment cannot be
+  /// satisfied.
+  @override
+  Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
+    _ensureInUse();
+    final p = _wrappedAllocator.allocate<T>(byteCount, alignment: alignment);
+    _managedMemoryPointers.add(p);
+    return p;
+  }
+
+  /// Registers [resource] in this arena.
+  ///
+  /// Executes [releaseCallback] on [releaseAll].
+  ///
+  /// Returns [resource] again, to allow for easily inserting
+  /// `arena.using(resource, ...)` where the resource is allocated.
+  T using<T>(T resource, void Function(T) releaseCallback) {
+    _ensureInUse();
+    releaseCallback = Zone.current.bindUnaryCallback(releaseCallback);
+    _managedResourceReleaseCallbacks.add(() => releaseCallback(resource));
+    return resource;
+  }
+
+  /// Registers [releaseResourceCallback] to be executed on [releaseAll].
+  void onReleaseAll(void Function() releaseResourceCallback) {
+    _managedResourceReleaseCallbacks.add(releaseResourceCallback);
+  }
+
+  /// Releases all resources that this [Arena] manages.
+  ///
+  /// If [reuse] is `true`, the arena can be used again after resources
+  /// have been released. If not, the default, then the [allocate]
+  /// and [using] methods must not be called after a call to `releaseAll`.
+  ///
+  /// If any of the callbacks throw, [releaseAll] is interrupted, and should
+  /// be started again.
+  void releaseAll({bool reuse = false}) {
+    if (!reuse) {
+      _inUse = false;
+    }
+    // The code below is deliberately wirtten to allow allocations to happen
+    // during `releaseAll(reuse:true)`. The arena will still be guaranteed
+    // empty when the `releaseAll` call returns.
+    while (_managedResourceReleaseCallbacks.isNotEmpty) {
+      _managedResourceReleaseCallbacks.removeLast()();
+    }
+    for (final p in _managedMemoryPointers) {
+      _wrappedAllocator.free(p);
+    }
+    _managedMemoryPointers.clear();
+  }
+
+  /// Does nothing, invoke [releaseAll] instead.
+  @override
+  void free(Pointer<NativeType> pointer) {}
+
+  void _ensureInUse() {
+    if (!_inUse) {
+      throw StateError(
+          'Arena no longer in use, `releaseAll(reuse: false)` was called.');
+    }
+  }
+}
+
+/// Runs [computation] with a new [Arena], and releases all allocations at the
+/// end.
+///
+/// If the return value of [computation] is a [Future], all allocations are
+/// released when the future completes.
+///
+/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_
+/// cleaned up.
+R using<R>(R Function(Arena) computation,
+    [Allocator wrappedAllocator = calloc]) {
+  final arena = Arena(wrappedAllocator);
+  bool isAsync = false;
+  try {
+    final result = computation(arena);
+    if (result is Future) {
+      isAsync = true;
+      return (result.whenComplete(arena.releaseAll) as R);
+    }
+    return result;
+  } finally {
+    if (!isAsync) {
+      arena.releaseAll();
+    }
+  }
+}
+
+/// Creates a zoned [Arena] to manage native resources.
+///
+/// The arena is availabe through [zoneArena].
+///
+/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_ cleaned up.
+R withZoneArena<R>(R Function() computation,
+    [Allocator wrappedAllocator = calloc]) {
+  final arena = Arena(wrappedAllocator);
+  var arenaHolder = [arena];
+  bool isAsync = false;
+  try {
+    return runZoned(() {
+      final result = computation();
+      if (result is Future) {
+        isAsync = true;
+        result.whenComplete(arena.releaseAll);
+      }
+      return result;
+    }, zoneValues: {#_arena: arenaHolder});
+  } finally {
+    if (!isAsync) {
+      arena.releaseAll();
+      arenaHolder.clear();
+    }
+  }
+}
+
+/// A zone-specific [Arena].
+///
+/// Asynchronous computations can share a [Arena]. Use [withZoneArena] to create
+/// a new zone with a fresh [Arena], and that arena will then be released
+/// automatically when the function passed to [withZoneArena] completes.
+/// All code inside that zone can use `zoneArena` to access the arena.
+///
+/// The current arena must not be accessed by code which is not running inside
+/// a zone created by [withZoneArena].
+Arena get zoneArena {
+  final List<Arena>? arenaHolder = Zone.current[#_arena];
+  if (arenaHolder == null) {
+    throw StateError('Not inside a zone created by `useArena`');
+  }
+  if (arenaHolder.isNotEmpty) {
+    return arenaHolder.single;
+  }
+  throw StateError('Arena has already been cleared with releaseAll.');
+}
diff --git a/samples/ffi/resource_management/pool_isolate_shutdown_sample.dart b/samples/ffi/resource_management/arena_isolate_shutdown_sample.dart
similarity index 95%
rename from samples/ffi/resource_management/pool_isolate_shutdown_sample.dart
rename to samples/ffi/resource_management/arena_isolate_shutdown_sample.dart
index 39de01d..52ec773 100644
--- a/samples/ffi/resource_management/pool_isolate_shutdown_sample.dart
+++ b/samples/ffi/resource_management/arena_isolate_shutdown_sample.dart
@@ -10,7 +10,7 @@
 
 import 'package:expect/expect.dart';
 
-import 'pool.dart';
+import 'arena.dart';
 import '../dylib_utils.dart';
 
 void main() {
@@ -50,9 +50,9 @@
 const keepHelperIsolateAlive = true;
 
 void helperIsolateMain(SendPort sendToMain) {
-  using((Pool pool) {
-    final resource = pool.using(allocateResource(), releaseResource);
-    pool.onReleaseAll(() {
+  using((Arena arena) {
+    final resource = arena.using(allocateResource(), releaseResource);
+    arena.onReleaseAll(() {
       // Will only run print if [keepHelperIsolateAlive] is false.
       print("Helper: Releasing all resources.");
     });
diff --git a/samples/ffi/resource_management/pool_sample.dart b/samples/ffi/resource_management/arena_sample.dart
similarity index 77%
rename from samples/ffi/resource_management/pool_sample.dart
rename to samples/ffi/resource_management/arena_sample.dart
index 1f75165..a12b553 100644
--- a/samples/ffi/resource_management/pool_sample.dart
+++ b/samples/ffi/resource_management/arena_sample.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// Sample illustrating resource management with an explicit pool.
+// Sample illustrating resource management with an explicit arena.
 
 import 'dart:async';
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
 
-import 'pool.dart';
+import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
@@ -22,8 +22,8 @@
       void Function(Pointer<Void>, Pointer<Void>, int)>("MemMove");
 
   // To ensure resources are freed, wrap them in a [using] call.
-  using((Pool pool) {
-    final p = pool<Int64>(2);
+  using((Arena arena) {
+    final p = arena<Int64>(2);
     p[0] = 24;
     MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), sizeOf<Int64>());
     print(p[1]);
@@ -32,8 +32,8 @@
 
   // Resources are freed also when abnormal control flow occurs.
   try {
-    using((Pool pool) {
-      final p = pool<Int64>(2);
+    using((Arena arena) {
+      final p = arena<Int64>(2);
       p[0] = 25;
       MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), 8);
       print(p[1]);
@@ -45,11 +45,11 @@
     print("Caught exception: $e");
   }
 
-  // In a pool multiple resources can be allocated, which will all be freed
+  // In a arena multiple resources can be allocated, which will all be freed
   // at the end of the scope.
-  using((Pool pool) {
-    final p = pool<Int64>(2);
-    final p2 = pool<Int64>(2);
+  using((Arena arena) {
+    final p = arena<Int64>(2);
+    final p2 = arena<Int64>(2);
     p[0] = 1;
     p[1] = 2;
     MemMove(p2.cast<Void>(), p.cast<Void>(), 2 * sizeOf<Int64>());
@@ -58,14 +58,14 @@
   });
 
   // If the resource allocation happens in a different scope, then one either
-  // needs to pass the pool to that scope.
-  f1(Pool pool) {
-    return pool<Int64>(2);
+  // needs to pass the arena to that scope.
+  f1(Arena arena) {
+    return arena<Int64>(2);
   }
 
-  using((Pool pool) {
-    final p = f1(pool);
-    final p2 = f1(pool);
+  using((Arena arena) {
+    final p = f1(arena);
+    final p2 = f1(arena);
     p[0] = 1;
     p[1] = 2;
     MemMove(p2.cast<Void>(), p.cast<Void>(), 2 * sizeOf<Int64>());
@@ -74,8 +74,8 @@
   });
 
   // Using Strings.
-  using((Pool pool) {
-    final p = "Hello world!".toUtf8(pool);
+  using((Arena arena) {
+    final p = "Hello world!".toUtf8(arena);
     print(p.contents());
   });
 
@@ -92,15 +92,15 @@
       void Function(Pointer<SomeResource>)>("ReleaseResource");
 
   // Using an FFI call to release a resource.
-  using((Pool pool) {
-    final r = pool.using(allocateResource(), releaseResource);
+  using((Arena arena) {
+    final r = arena.using(allocateResource(), releaseResource);
     useResource(r);
   });
 
   // Using an FFI call to release a resource with abnormal control flow.
   try {
-    using((Pool pool) {
-      final r = pool.using(allocateResource(), releaseResource);
+    using((Arena arena) {
+      final r = arena.using(allocateResource(), releaseResource);
       useResource(r);
 
       throw Exception("Some random exception");
@@ -117,9 +117,9 @@
     freed.add(i);
   }
 
-  Future<int> myFutureInt = using((Pool pool) {
+  Future<int> myFutureInt = using((Arena arena) {
     return Future.microtask(() {
-      pool.using(1, freeInt);
+      arena.using(1, freeInt);
       return 1;
     });
   });
diff --git a/samples/ffi/resource_management/arena_test.dart b/samples/ffi/resource_management/arena_test.dart
new file mode 100644
index 0000000..18ffaa9
--- /dev/null
+++ b/samples/ffi/resource_management/arena_test.dart
@@ -0,0 +1,208 @@
+// 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:async';
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+import 'package:test/test.dart';
+
+// TODO(dacoharkes): After merging into `package:ffi`, roll package in DEPS
+// and remove arena.dart.
+import 'arena.dart';
+
+void main() async {
+  test('sync', () async {
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    using((Arena arena) {
+      arena.using(1234, freeInt);
+      expect(freed.isEmpty, true);
+    });
+    expect(freed, [1234]);
+  });
+
+  test('async', () async {
+    /// Calling [using] waits with releasing its resources until after
+    /// [Future]s complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    Future<int> myFutureInt = using((Arena arena) {
+      return Future.microtask(() {
+        arena.using(1234, freeInt);
+        return 1;
+      });
+    });
+
+    expect(freed.isEmpty, true);
+    await myFutureInt;
+    expect(freed, [1234]);
+  });
+
+  test('throw', () {
+    /// [using] waits with releasing its resources until after [Future]s
+    /// complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    // Resources are freed also when abnormal control flow occurs.
+    var didThrow = false;
+    try {
+      using((Arena arena) {
+        arena.using(1234, freeInt);
+        expect(freed.isEmpty, true);
+        throw Exception('Exception 1');
+      });
+    } on Exception {
+      expect(freed.single, 1234);
+      didThrow = true;
+    }
+    expect(didThrow, true);
+  });
+
+  test(
+    'allocate',
+    () {
+      final countingAllocator = CountingAllocator();
+      // To ensure resources are freed, wrap them in a [using] call.
+      using((Arena arena) {
+        final p = arena<Int64>(2);
+        p[1] = p[0];
+      }, countingAllocator);
+      expect(countingAllocator.freeCount, 1);
+    },
+  );
+
+  test('allocate throw', () {
+    // Resources are freed also when abnormal control flow occurs.
+    bool didThrow = false;
+    final countingAllocator = CountingAllocator();
+    try {
+      using((Arena arena) {
+        final p = arena<Int64>(2);
+        p[0] = 25;
+        throw Exception('Exception 2');
+      }, countingAllocator);
+    } on Exception {
+      expect(countingAllocator.freeCount, 1);
+      didThrow = true;
+    }
+    expect(didThrow, true);
+  });
+
+  test('toNativeUtf8', () {
+    final countingAllocator = CountingAllocator();
+    using((Arena arena) {
+      final p = 'Hello world!'.toNativeUtf8(allocator: arena);
+      expect(p.toDartString(), 'Hello world!');
+    }, countingAllocator);
+    expect(countingAllocator.freeCount, 1);
+  });
+
+  test('zone', () async {
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    withZoneArena(() {
+      zoneArena.using(1234, freeInt);
+      expect(freed.isEmpty, true);
+    });
+    expect(freed.length, 1);
+    expect(freed.single, 1234);
+  });
+
+  test('zone async', () async {
+    /// [using] waits with releasing its resources until after [Future]s
+    /// complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    Future<int> myFutureInt = withZoneArena(() {
+      return Future.microtask(() {
+        zoneArena.using(1234, freeInt);
+        return 1;
+      });
+    });
+
+    expect(freed.isEmpty, true);
+    await myFutureInt;
+    expect(freed.length, 1);
+    expect(freed.single, 1234);
+  });
+
+  test('zone throw', () {
+    /// [using] waits with releasing its resources until after [Future]s
+    /// complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    // Resources are freed also when abnormal control flow occurs.
+    bool didThrow = false;
+    try {
+      withZoneArena(() {
+        zoneArena.using(1234, freeInt);
+        expect(freed.isEmpty, true);
+        throw Exception('Exception 3');
+      });
+    } on Exception {
+      expect(freed.single, 1234);
+      didThrow = true;
+    }
+    expect(didThrow, true);
+    expect(freed.single, 1234);
+  });
+
+  test('allocate during releaseAll', () {
+    final countingAllocator = CountingAllocator();
+    final arena = Arena(countingAllocator);
+
+    arena.using(arena<Uint8>(), (Pointer discard) {
+      arena<Uint8>();
+    });
+
+    expect(countingAllocator.allocationCount, 1);
+    expect(countingAllocator.freeCount, 0);
+
+    arena.releaseAll(reuse: true);
+
+    expect(countingAllocator.allocationCount, 2);
+    expect(countingAllocator.freeCount, 2);
+  });
+}
+
+/// Keeps track of the number of allocates and frees for testing purposes.
+class CountingAllocator implements Allocator {
+  final Allocator wrappedAllocator;
+
+  int allocationCount = 0;
+  int freeCount = 0;
+
+  CountingAllocator([this.wrappedAllocator = calloc]);
+
+  @override
+  Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
+    allocationCount++;
+    return wrappedAllocator.allocate(byteCount, alignment: alignment);
+  }
+
+  @override
+  void free(Pointer<NativeType> pointer) {
+    freeCount++;
+    return wrappedAllocator.free(pointer);
+  }
+}
diff --git a/samples/ffi/resource_management/pool_zoned_sample.dart b/samples/ffi/resource_management/arena_zoned_sample.dart
similarity index 77%
rename from samples/ffi/resource_management/pool_zoned_sample.dart
rename to samples/ffi/resource_management/arena_zoned_sample.dart
index b5b9eed..bb1defa 100644
--- a/samples/ffi/resource_management/pool_zoned_sample.dart
+++ b/samples/ffi/resource_management/arena_zoned_sample.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// Sample illustrating resource management with an implicit pool in the zone.
+// Sample illustrating resource management with an implicit arena in the zone.
 
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
 
-import 'pool.dart';
+import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
@@ -20,9 +20,9 @@
       Void Function(Pointer<Void>, Pointer<Void>, IntPtr),
       void Function(Pointer<Void>, Pointer<Void>, int)>("MemMove");
 
-  // To ensure resources are freed, wrap them in a [withZonePool] call.
-  withZonePool(() {
-    final p = zonePool<Int64>(2);
+  // To ensure resources are freed, wrap them in a [withZoneArena] call.
+  withZoneArena(() {
+    final p = zoneArena<Int64>(2);
     p[0] = 24;
     MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), sizeOf<Int64>());
     print(p[1]);
@@ -31,8 +31,8 @@
 
   // Resources are freed also when abnormal control flow occurs.
   try {
-    withZonePool(() {
-      final p = zonePool<Int64>(2);
+    withZoneArena(() {
+      final p = zoneArena<Int64>(2);
       p[0] = 25;
       MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), 8);
       print(p[1]);
@@ -43,11 +43,11 @@
     print("Caught exception: ${e}");
   }
 
-  // In a pool multiple resources can be allocated, which will all be freed
+  // In a arena multiple resources can be allocated, which will all be freed
   // at the end of the scope.
-  withZonePool(() {
-    final p = zonePool<Int64>(2);
-    final p2 = zonePool<Int64>(2);
+  withZoneArena(() {
+    final p = zoneArena<Int64>(2);
+    final p2 = zoneArena<Int64>(2);
     p[0] = 1;
     p[1] = 2;
     MemMove(p2.cast<Void>(), p.cast<Void>(), 2 * sizeOf<Int64>());
@@ -56,12 +56,12 @@
   });
 
   // If the resource allocation happens in a different scope, it is in the
-  // same zone, so it's lifetime is automatically managed by the pool.
+  // same zone, so it's lifetime is automatically managed by the arena.
   f1() {
-    return zonePool<Int64>(2);
+    return zoneArena<Int64>(2);
   }
 
-  withZonePool(() {
+  withZoneArena(() {
     final p = f1();
     final p2 = f1();
     p[0] = 1;
@@ -72,8 +72,8 @@
   });
 
   // Using Strings.
-  withZonePool(() {
-    final p = "Hello world!".toUtf8(zonePool);
+  withZoneArena(() {
+    final p = "Hello world!".toUtf8(zoneArena);
     print(p.contents());
   });
 
@@ -90,15 +90,15 @@
       void Function(Pointer<SomeResource>)>("ReleaseResource");
 
   // Using an FFI call to release a resource.
-  withZonePool(() {
-    final r = zonePool.using(allocateResource(), releaseResource);
+  withZoneArena(() {
+    final r = zoneArena.using(allocateResource(), releaseResource);
     useResource(r);
   });
 
   // Using an FFI call to release a resource with abnormal control flow.
   try {
-    withZonePool(() {
-      final r = zonePool.using(allocateResource(), releaseResource);
+    withZoneArena(() {
+      final r = zoneArena.using(allocateResource(), releaseResource);
       useResource(r);
 
       throw Exception("Some random exception");
@@ -116,9 +116,9 @@
     freed.add(i);
   }
 
-  Future<int> myFutureInt = withZonePool(() {
+  Future<int> myFutureInt = withZoneArena(() {
     return Future.microtask(() {
-      zonePool.using(1, freeInt);
+      zoneArena.using(1, freeInt);
       return 1;
     });
   });
diff --git a/samples/ffi/resource_management/pool.dart b/samples/ffi/resource_management/pool.dart
deleted file mode 100644
index e37fd22..0000000
--- a/samples/ffi/resource_management/pool.dart
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// Explicit pool used for managing resources.
-
-import "dart:async";
-import 'dart:ffi';
-
-import 'package:ffi/ffi.dart';
-
-/// An [Allocator] which frees all allocations at the same time.
-///
-/// The pool allows you to allocate heap memory, but ignores calls to [free].
-/// Instead you call [releaseAll] to release all the allocations at the same
-/// time.
-///
-/// Also allows other resources to be associated with the pool, through the
-/// [using] method, to have a release function called for them when the pool is
-/// released.
-///
-/// An [Allocator] can be provided to do the actual allocation and freeing.
-/// Defaults to using [calloc].
-class Pool implements Allocator {
-  /// The [Allocator] used for allocation and freeing.
-  final Allocator _wrappedAllocator;
-
-  /// Native memory under management by this [Pool].
-  final List<Pointer<NativeType>> _managedMemoryPointers = [];
-
-  /// Callbacks for releasing native resources under management by this [Pool].
-  final List<Function()> _managedResourceReleaseCallbacks = [];
-
-  bool _inUse = true;
-
-  /// Creates a pool of allocations.
-  ///
-  /// The [allocator] is used to do the actual allocation and freeing of
-  /// memory. It defaults to using [calloc].
-  Pool([Allocator allocator = calloc]) : _wrappedAllocator = allocator;
-
-  /// Allocates memory and includes it in the pool.
-  ///
-  /// Uses the allocator provided to the [Pool] constructor to do the
-  /// allocation.
-  ///
-  /// Throws an [ArgumentError] if the number of bytes or alignment cannot be
-  /// satisfied.
-  @override
-  Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
-    _ensureInUse();
-    final p = _wrappedAllocator.allocate<T>(byteCount, alignment: alignment);
-    _managedMemoryPointers.add(p);
-    return p;
-  }
-
-  /// Registers [resource] in this pool.
-  ///
-  /// Executes [releaseCallback] on [releaseAll].
-  T using<T>(T resource, Function(T) releaseCallback) {
-    _ensureInUse();
-    releaseCallback = Zone.current.bindUnaryCallback(releaseCallback);
-    _managedResourceReleaseCallbacks.add(() => releaseCallback(resource));
-    return resource;
-  }
-
-  /// Registers [releaseResourceCallback] to be executed on [releaseAll].
-  void onReleaseAll(Function() releaseResourceCallback) {
-    _managedResourceReleaseCallbacks.add(releaseResourceCallback);
-  }
-
-  /// Releases all resources that this [Pool] manages.
-  ///
-  /// If [reuse] is `true`, the pool can be used again after resources
-  /// have been released. If not, the default, then the [allocate]
-  /// and [using] methods must not be called after a call to `releaseAll`.
-  void releaseAll({bool reuse = false}) {
-    if (!reuse) {
-      _inUse = false;
-    }
-    while (_managedResourceReleaseCallbacks.isNotEmpty) {
-      _managedResourceReleaseCallbacks.removeLast()();
-    }
-    for (final p in _managedMemoryPointers) {
-      _wrappedAllocator.free(p);
-    }
-    _managedMemoryPointers.clear();
-  }
-
-  /// Does nothing, invoke [releaseAll] instead.
-  @override
-  void free(Pointer<NativeType> pointer) {}
-
-  void _ensureInUse() {
-    if (!_inUse) {
-      throw StateError(
-          "Pool no longer in use, `releaseAll(reuse: false)` was called.");
-    }
-  }
-}
-
-/// Runs [computation] with a new [Pool], and releases all allocations at the end.
-///
-/// If [R] is a [Future], all allocations are released when the future completes.
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_
-/// cleaned up.
-R using<R>(R Function(Pool) computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final pool = Pool(wrappedAllocator);
-  bool isAsync = false;
-  try {
-    final result = computation(pool);
-    if (result is Future) {
-      isAsync = true;
-      return (result.whenComplete(pool.releaseAll) as R);
-    }
-    return result;
-  } finally {
-    if (!isAsync) {
-      pool.releaseAll();
-    }
-  }
-}
-
-/// Creates a zoned [Pool] to manage native resources.
-///
-/// The pool is availabe through [zonePool].
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_ cleaned up.
-R withZonePool<R>(R Function() computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final pool = Pool(wrappedAllocator);
-  var poolHolder = [pool];
-  bool isAsync = false;
-  try {
-    return runZoned(() {
-      final result = computation();
-      if (result is Future) {
-        isAsync = true;
-        result.whenComplete(pool.releaseAll);
-      }
-      return result;
-    }, zoneValues: {#_pool: poolHolder});
-  } finally {
-    if (!isAsync) {
-      pool.releaseAll();
-      poolHolder.remove(pool);
-    }
-  }
-}
-
-/// A zone-specific [Pool].
-///
-/// Asynchronous computations can share a [Pool]. Use [withZonePool] to create
-/// a new zone with a fresh [Pool], and that pool will then be released
-/// automatically when the function passed to [withZonePool] completes.
-/// All code inside that zone can use `zonePool` to access the pool.
-///
-/// The current pool must not be accessed by code which is not running inside
-/// a zone created by [withZonePool].
-Pool get zonePool {
-  final List<Pool>? poolHolder = Zone.current[#_pool];
-  if (poolHolder == null) {
-    throw StateError("Not inside a zone created by `usePool`");
-  }
-  if (!poolHolder.isEmpty) {
-    return poolHolder.single;
-  }
-  throw StateError("Pool as already been cleared with releaseAll.");
-}
diff --git a/samples/ffi/resource_management/resource_management_test.dart b/samples/ffi/resource_management/resource_management_test.dart
index 1cc14f7..96fc129 100644
--- a/samples/ffi/resource_management/resource_management_test.dart
+++ b/samples/ffi/resource_management/resource_management_test.dart
@@ -6,14 +6,14 @@
 //
 // SharedObjects=ffi_test_dynamic_library ffi_test_functions
 
-import 'pool_isolate_shutdown_sample.dart' as pool_isolate;
-import 'pool_sample.dart' as pool;
-import 'pool_zoned_sample.dart' as pool_zoned;
+import 'arena_isolate_shutdown_sample.dart' as arena_isolate;
+import 'arena_sample.dart' as arena;
+import 'arena_zoned_sample.dart' as arena_zoned;
 import 'unmanaged_sample.dart' as unmanaged;
 
 main() {
-  pool_isolate.main();
-  pool.main();
-  pool_zoned.main();
+  arena_isolate.main();
+  arena.main();
+  arena_zoned.main();
   unmanaged.main();
 }
diff --git a/samples/ffi/resource_management/unmanaged_sample.dart b/samples/ffi/resource_management/unmanaged_sample.dart
index 5ddb6ae..495564d 100644
--- a/samples/ffi/resource_management/unmanaged_sample.dart
+++ b/samples/ffi/resource_management/unmanaged_sample.dart
@@ -22,7 +22,7 @@
 
   // To ensure resources are freed, call free manually.
   //
-  // For automatic management use a Pool.
+  // For automatic management use a Arena.
   final p = calloc<Int64>(2);
   p[0] = 24;
   memMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), sizeOf<Int64>());
diff --git a/samples/ffi/resource_management/utf8_helpers.dart b/samples/ffi/resource_management/utf8_helpers.dart
index a27ccd6..4ef8a45 100644
--- a/samples/ffi/resource_management/utf8_helpers.dart
+++ b/samples/ffi/resource_management/utf8_helpers.dart
@@ -8,7 +8,7 @@
 
 import 'package:ffi/ffi.dart';
 
-extension Utf8InPool on String {
+extension Utf8InArena on String {
   /// Convert a [String] to a Utf8-encoded null-terminated C string.
   ///
   /// If 'string' contains NULL bytes, the converted string will be truncated
diff --git a/samples_2/ffi/resource_management/arena.dart b/samples_2/ffi/resource_management/arena.dart
new file mode 100644
index 0000000..4916c3a
--- /dev/null
+++ b/samples_2/ffi/resource_management/arena.dart
@@ -0,0 +1,184 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Explicit arena used for managing resources.
+
+// @dart = 2.9
+
+import 'dart:async';
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+/// An [Allocator] which frees all allocations at the same time.
+///
+/// The arena allows you to allocate heap memory, but ignores calls to [free].
+/// Instead you call [releaseAll] to release all the allocations at the same
+/// time.
+///
+/// Also allows other resources to be associated with the arena, through the
+/// [using] method, to have a release function called for them when the arena is
+/// released.
+///
+/// An [Allocator] can be provided to do the actual allocation and freeing.
+/// Defaults to using [calloc].
+class Arena implements Allocator {
+  /// The [Allocator] used for allocation and freeing.
+  final Allocator _wrappedAllocator;
+
+  /// Native memory under management by this [Arena].
+  final List<Pointer<NativeType>> _managedMemoryPointers = [];
+
+  /// Callbacks for releasing native resources under management by this [Arena].
+  final List<void Function()> _managedResourceReleaseCallbacks = [];
+
+  bool _inUse = true;
+
+  /// Creates a arena of allocations.
+  ///
+  /// The [allocator] is used to do the actual allocation and freeing of
+  /// memory. It defaults to using [calloc].
+  Arena([Allocator allocator = calloc]) : _wrappedAllocator = allocator;
+
+  /// Allocates memory and includes it in the arena.
+  ///
+  /// Uses the allocator provided to the [Arena] constructor to do the
+  /// allocation.
+  ///
+  /// Throws an [ArgumentError] if the number of bytes or alignment cannot be
+  /// satisfied.
+  @override
+  Pointer<T> allocate<T extends NativeType>(int byteCount, {int alignment}) {
+    _ensureInUse();
+    final p = _wrappedAllocator.allocate<T>(byteCount, alignment: alignment);
+    _managedMemoryPointers.add(p);
+    return p;
+  }
+
+  /// Registers [resource] in this arena.
+  ///
+  /// Executes [releaseCallback] on [releaseAll].
+  ///
+  /// Returns [resource] again, to allow for easily inserting
+  /// `arena.using(resource, ...)` where the resource is allocated.
+  T using<T>(T resource, void Function(T) releaseCallback) {
+    _ensureInUse();
+    releaseCallback = Zone.current.bindUnaryCallback(releaseCallback);
+    _managedResourceReleaseCallbacks.add(() => releaseCallback(resource));
+    return resource;
+  }
+
+  /// Registers [releaseResourceCallback] to be executed on [releaseAll].
+  void onReleaseAll(void Function() releaseResourceCallback) {
+    _managedResourceReleaseCallbacks.add(releaseResourceCallback);
+  }
+
+  /// Releases all resources that this [Arena] manages.
+  ///
+  /// If [reuse] is `true`, the arena can be used again after resources
+  /// have been released. If not, the default, then the [allocate]
+  /// and [using] methods must not be called after a call to `releaseAll`.
+  ///
+  /// If any of the callbacks throw, [releaseAll] is interrupted, and should
+  /// be started again.
+  void releaseAll({bool reuse = false}) {
+    if (!reuse) {
+      _inUse = false;
+    }
+    // The code below is deliberately wirtten to allow allocations to happen
+    // during `releaseAll(reuse:true)`. The arena will still be guaranteed
+    // empty when the `releaseAll` call returns.
+    while (_managedResourceReleaseCallbacks.isNotEmpty) {
+      _managedResourceReleaseCallbacks.removeLast()();
+    }
+    for (final p in _managedMemoryPointers) {
+      _wrappedAllocator.free(p);
+    }
+    _managedMemoryPointers.clear();
+  }
+
+  /// Does nothing, invoke [releaseAll] instead.
+  @override
+  void free(Pointer<NativeType> pointer) {}
+
+  void _ensureInUse() {
+    if (!_inUse) {
+      throw StateError(
+          'Arena no longer in use, `releaseAll(reuse: false)` was called.');
+    }
+  }
+}
+
+/// Runs [computation] with a new [Arena], and releases all allocations at the
+/// end.
+///
+/// If the return value of [computation] is a [Future], all allocations are
+/// released when the future completes.
+///
+/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_
+/// cleaned up.
+R using<R>(R Function(Arena) computation,
+    [Allocator wrappedAllocator = calloc]) {
+  final arena = Arena(wrappedAllocator);
+  bool isAsync = false;
+  try {
+    final result = computation(arena);
+    if (result is Future) {
+      isAsync = true;
+      return (result.whenComplete(arena.releaseAll) as R);
+    }
+    return result;
+  } finally {
+    if (!isAsync) {
+      arena.releaseAll();
+    }
+  }
+}
+
+/// Creates a zoned [Arena] to manage native resources.
+///
+/// The arena is availabe through [zoneArena].
+///
+/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_ cleaned up.
+R withZoneArena<R>(R Function() computation,
+    [Allocator wrappedAllocator = calloc]) {
+  final arena = Arena(wrappedAllocator);
+  var arenaHolder = [arena];
+  bool isAsync = false;
+  try {
+    return runZoned(() {
+      final result = computation();
+      if (result is Future) {
+        isAsync = true;
+        result.whenComplete(arena.releaseAll);
+      }
+      return result;
+    }, zoneValues: {#_arena: arenaHolder});
+  } finally {
+    if (!isAsync) {
+      arena.releaseAll();
+      arenaHolder.clear();
+    }
+  }
+}
+
+/// A zone-specific [Arena].
+///
+/// Asynchronous computations can share a [Arena]. Use [withZoneArena] to create
+/// a new zone with a fresh [Arena], and that arena will then be released
+/// automatically when the function passed to [withZoneArena] completes.
+/// All code inside that zone can use `zoneArena` to access the arena.
+///
+/// The current arena must not be accessed by code which is not running inside
+/// a zone created by [withZoneArena].
+Arena get zoneArena {
+  final List<Arena> arenaHolder = Zone.current[#_arena];
+  if (arenaHolder == null) {
+    throw StateError('Not inside a zone created by `useArena`');
+  }
+  if (arenaHolder.isNotEmpty) {
+    return arenaHolder.single;
+  }
+  throw StateError('Arena has already been cleared with releaseAll.');
+}
diff --git a/samples_2/ffi/resource_management/pool_isolate_shutdown_sample.dart b/samples_2/ffi/resource_management/arena_isolate_shutdown_sample.dart
similarity index 95%
rename from samples_2/ffi/resource_management/pool_isolate_shutdown_sample.dart
rename to samples_2/ffi/resource_management/arena_isolate_shutdown_sample.dart
index 4c8eb0f..8d1e5c7 100644
--- a/samples_2/ffi/resource_management/pool_isolate_shutdown_sample.dart
+++ b/samples_2/ffi/resource_management/arena_isolate_shutdown_sample.dart
@@ -12,7 +12,7 @@
 
 import 'package:expect/expect.dart';
 
-import 'pool.dart';
+import 'arena.dart';
 import '../dylib_utils.dart';
 
 void main() {
@@ -52,9 +52,9 @@
 const keepHelperIsolateAlive = true;
 
 void helperIsolateMain(SendPort sendToMain) {
-  using((Pool pool) {
-    final resource = pool.using(allocateResource(), releaseResource);
-    pool.onReleaseAll(() {
+  using((Arena arena) {
+    final resource = arena.using(allocateResource(), releaseResource);
+    arena.onReleaseAll(() {
       // Will only run print if [keepHelperIsolateAlive] is false.
       print("Helper: Releasing all resources.");
     });
diff --git a/samples_2/ffi/resource_management/pool_sample.dart b/samples_2/ffi/resource_management/arena_sample.dart
similarity index 77%
rename from samples_2/ffi/resource_management/pool_sample.dart
rename to samples_2/ffi/resource_management/arena_sample.dart
index e3441c1..d8cbe80 100644
--- a/samples_2/ffi/resource_management/pool_sample.dart
+++ b/samples_2/ffi/resource_management/arena_sample.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// Sample illustrating resource management with an explicit pool.
+// Sample illustrating resource management with an explicit arena.
 
 // @dart = 2.9
 
@@ -10,7 +10,7 @@
 
 import 'package:expect/expect.dart';
 
-import 'pool.dart';
+import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
@@ -23,8 +23,8 @@
       void Function(Pointer<Void>, Pointer<Void>, int)>("MemMove");
 
   // To ensure resources are freed, wrap them in a [using] call.
-  using((Pool pool) {
-    final p = pool<Int64>(2);
+  using((Arena arena) {
+    final p = arena<Int64>(2);
     p[0] = 24;
     MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), sizeOf<Int64>());
     print(p[1]);
@@ -33,8 +33,8 @@
 
   // Resources are freed also when abnormal control flow occurs.
   try {
-    using((Pool pool) {
-      final p = pool<Int64>(2);
+    using((Arena arena) {
+      final p = arena<Int64>(2);
       p[0] = 25;
       MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), 8);
       print(p[1]);
@@ -46,11 +46,11 @@
     print("Caught exception: $e");
   }
 
-  // In a pool multiple resources can be allocated, which will all be freed
+  // In a arena multiple resources can be allocated, which will all be freed
   // at the end of the scope.
-  using((Pool pool) {
-    final p = pool<Int64>(2);
-    final p2 = pool<Int64>(2);
+  using((Arena arena) {
+    final p = arena<Int64>(2);
+    final p2 = arena<Int64>(2);
     p[0] = 1;
     p[1] = 2;
     MemMove(p2.cast<Void>(), p.cast<Void>(), 2 * sizeOf<Int64>());
@@ -59,14 +59,14 @@
   });
 
   // If the resource allocation happens in a different scope, then one either
-  // needs to pass the pool to that scope.
-  f1(Pool pool) {
-    return pool<Int64>(2);
+  // needs to pass the arena to that scope.
+  f1(Arena arena) {
+    return arena<Int64>(2);
   }
 
-  using((Pool pool) {
-    final p = f1(pool);
-    final p2 = f1(pool);
+  using((Arena arena) {
+    final p = f1(arena);
+    final p2 = f1(arena);
     p[0] = 1;
     p[1] = 2;
     MemMove(p2.cast<Void>(), p.cast<Void>(), 2 * sizeOf<Int64>());
@@ -75,8 +75,8 @@
   });
 
   // Using Strings.
-  using((Pool pool) {
-    final p = "Hello world!".toUtf8(pool);
+  using((Arena arena) {
+    final p = "Hello world!".toUtf8(arena);
     print(p.contents());
   });
 
@@ -93,15 +93,15 @@
       void Function(Pointer<SomeResource>)>("ReleaseResource");
 
   // Using an FFI call to release a resource.
-  using((Pool pool) {
-    final r = pool.using(allocateResource(), releaseResource);
+  using((Arena arena) {
+    final r = arena.using(allocateResource(), releaseResource);
     useResource(r);
   });
 
   // Using an FFI call to release a resource with abnormal control flow.
   try {
-    using((Pool pool) {
-      final r = pool.using(allocateResource(), releaseResource);
+    using((Arena arena) {
+      final r = arena.using(allocateResource(), releaseResource);
       useResource(r);
 
       throw Exception("Some random exception");
@@ -118,9 +118,9 @@
     freed.add(i);
   }
 
-  Future<int> myFutureInt = using((Pool pool) {
+  Future<int> myFutureInt = using((Arena arena) {
     return Future.microtask(() {
-      pool.using(1, freeInt);
+      arena.using(1, freeInt);
       return 1;
     });
   });
diff --git a/samples_2/ffi/resource_management/arena_test.dart b/samples_2/ffi/resource_management/arena_test.dart
new file mode 100644
index 0000000..699d94b
--- /dev/null
+++ b/samples_2/ffi/resource_management/arena_test.dart
@@ -0,0 +1,210 @@
+// 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.
+//
+// @dart = 2.9
+
+import 'dart:async';
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+import 'package:test/test.dart';
+
+// TODO(dacoharkes): After merging into `package:ffi`, roll package in DEPS
+// and remove arena.dart.
+import 'arena.dart';
+
+void main() async {
+  test('sync', () async {
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    using((Arena arena) {
+      arena.using(1234, freeInt);
+      expect(freed.isEmpty, true);
+    });
+    expect(freed, [1234]);
+  });
+
+  test('async', () async {
+    /// Calling [using] waits with releasing its resources until after
+    /// [Future]s complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    Future<int> myFutureInt = using((Arena arena) {
+      return Future.microtask(() {
+        arena.using(1234, freeInt);
+        return 1;
+      });
+    });
+
+    expect(freed.isEmpty, true);
+    await myFutureInt;
+    expect(freed, [1234]);
+  });
+
+  test('throw', () {
+    /// [using] waits with releasing its resources until after [Future]s
+    /// complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    // Resources are freed also when abnormal control flow occurs.
+    var didThrow = false;
+    try {
+      using((Arena arena) {
+        arena.using(1234, freeInt);
+        expect(freed.isEmpty, true);
+        throw Exception('Exception 1');
+      });
+    } on Exception {
+      expect(freed.single, 1234);
+      didThrow = true;
+    }
+    expect(didThrow, true);
+  });
+
+  test(
+    'allocate',
+    () {
+      final countingAllocator = CountingAllocator();
+      // To ensure resources are freed, wrap them in a [using] call.
+      using((Arena arena) {
+        final p = arena<Int64>(2);
+        p[1] = p[0];
+      }, countingAllocator);
+      expect(countingAllocator.freeCount, 1);
+    },
+  );
+
+  test('allocate throw', () {
+    // Resources are freed also when abnormal control flow occurs.
+    bool didThrow = false;
+    final countingAllocator = CountingAllocator();
+    try {
+      using((Arena arena) {
+        final p = arena<Int64>(2);
+        p[0] = 25;
+        throw Exception('Exception 2');
+      }, countingAllocator);
+    } on Exception {
+      expect(countingAllocator.freeCount, 1);
+      didThrow = true;
+    }
+    expect(didThrow, true);
+  });
+
+  test('toNativeUtf8', () {
+    final countingAllocator = CountingAllocator();
+    using((Arena arena) {
+      final p = 'Hello world!'.toNativeUtf8(allocator: arena);
+      expect(p.toDartString(), 'Hello world!');
+    }, countingAllocator);
+    expect(countingAllocator.freeCount, 1);
+  });
+
+  test('zone', () async {
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    withZoneArena(() {
+      zoneArena.using(1234, freeInt);
+      expect(freed.isEmpty, true);
+    });
+    expect(freed.length, 1);
+    expect(freed.single, 1234);
+  });
+
+  test('zone async', () async {
+    /// [using] waits with releasing its resources until after [Future]s
+    /// complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    Future<int> myFutureInt = withZoneArena(() {
+      return Future.microtask(() {
+        zoneArena.using(1234, freeInt);
+        return 1;
+      });
+    });
+
+    expect(freed.isEmpty, true);
+    await myFutureInt;
+    expect(freed.length, 1);
+    expect(freed.single, 1234);
+  });
+
+  test('zone throw', () {
+    /// [using] waits with releasing its resources until after [Future]s
+    /// complete.
+    List<int> freed = [];
+    void freeInt(int i) {
+      freed.add(i);
+    }
+
+    // Resources are freed also when abnormal control flow occurs.
+    bool didThrow = false;
+    try {
+      withZoneArena(() {
+        zoneArena.using(1234, freeInt);
+        expect(freed.isEmpty, true);
+        throw Exception('Exception 3');
+      });
+    } on Exception {
+      expect(freed.single, 1234);
+      didThrow = true;
+    }
+    expect(didThrow, true);
+    expect(freed.single, 1234);
+  });
+
+  test('allocate during releaseAll', () {
+    final countingAllocator = CountingAllocator();
+    final arena = Arena(countingAllocator);
+
+    arena.using(arena<Uint8>(), (Pointer discard) {
+      arena<Uint8>();
+    });
+
+    expect(countingAllocator.allocationCount, 1);
+    expect(countingAllocator.freeCount, 0);
+
+    arena.releaseAll(reuse: true);
+
+    expect(countingAllocator.allocationCount, 2);
+    expect(countingAllocator.freeCount, 2);
+  });
+}
+
+/// Keeps track of the number of allocates and frees for testing purposes.
+class CountingAllocator implements Allocator {
+  final Allocator wrappedAllocator;
+
+  int allocationCount = 0;
+  int freeCount = 0;
+
+  CountingAllocator([this.wrappedAllocator = calloc]);
+
+  @override
+  Pointer<T> allocate<T extends NativeType>(int byteCount, {int alignment}) {
+    allocationCount++;
+    return wrappedAllocator.allocate(byteCount, alignment: alignment);
+  }
+
+  @override
+  void free(Pointer<NativeType> pointer) {
+    freeCount++;
+    return wrappedAllocator.free(pointer);
+  }
+}
diff --git a/samples_2/ffi/resource_management/pool_zoned_sample.dart b/samples_2/ffi/resource_management/arena_zoned_sample.dart
similarity index 77%
rename from samples_2/ffi/resource_management/pool_zoned_sample.dart
rename to samples_2/ffi/resource_management/arena_zoned_sample.dart
index b9142c2..a22e279 100644
--- a/samples_2/ffi/resource_management/pool_zoned_sample.dart
+++ b/samples_2/ffi/resource_management/arena_zoned_sample.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// Sample illustrating resource management with an implicit pool in the zone.
+// Sample illustrating resource management with an implicit arena in the zone.
 
 // @dart = 2.9
 
@@ -10,7 +10,7 @@
 
 import 'package:expect/expect.dart';
 
-import 'pool.dart';
+import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
@@ -22,9 +22,9 @@
       Void Function(Pointer<Void>, Pointer<Void>, IntPtr),
       void Function(Pointer<Void>, Pointer<Void>, int)>("MemMove");
 
-  // To ensure resources are freed, wrap them in a [withZonePool] call.
-  withZonePool(() {
-    final p = zonePool<Int64>(2);
+  // To ensure resources are freed, wrap them in a [withZoneArena] call.
+  withZoneArena(() {
+    final p = zoneArena<Int64>(2);
     p[0] = 24;
     MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), sizeOf<Int64>());
     print(p[1]);
@@ -33,8 +33,8 @@
 
   // Resources are freed also when abnormal control flow occurs.
   try {
-    withZonePool(() {
-      final p = zonePool<Int64>(2);
+    withZoneArena(() {
+      final p = zoneArena<Int64>(2);
       p[0] = 25;
       MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), 8);
       print(p[1]);
@@ -45,11 +45,11 @@
     print("Caught exception: ${e}");
   }
 
-  // In a pool multiple resources can be allocated, which will all be freed
+  // In a arena multiple resources can be allocated, which will all be freed
   // at the end of the scope.
-  withZonePool(() {
-    final p = zonePool<Int64>(2);
-    final p2 = zonePool<Int64>(2);
+  withZoneArena(() {
+    final p = zoneArena<Int64>(2);
+    final p2 = zoneArena<Int64>(2);
     p[0] = 1;
     p[1] = 2;
     MemMove(p2.cast<Void>(), p.cast<Void>(), 2 * sizeOf<Int64>());
@@ -58,12 +58,12 @@
   });
 
   // If the resource allocation happens in a different scope, it is in the
-  // same zone, so it's lifetime is automatically managed by the pool.
+  // same zone, so it's lifetime is automatically managed by the arena.
   f1() {
-    return zonePool<Int64>(2);
+    return zoneArena<Int64>(2);
   }
 
-  withZonePool(() {
+  withZoneArena(() {
     final p = f1();
     final p2 = f1();
     p[0] = 1;
@@ -74,8 +74,8 @@
   });
 
   // Using Strings.
-  withZonePool(() {
-    final p = "Hello world!".toUtf8(zonePool);
+  withZoneArena(() {
+    final p = "Hello world!".toUtf8(zoneArena);
     print(p.contents());
   });
 
@@ -92,15 +92,15 @@
       void Function(Pointer<SomeResource>)>("ReleaseResource");
 
   // Using an FFI call to release a resource.
-  withZonePool(() {
-    final r = zonePool.using(allocateResource(), releaseResource);
+  withZoneArena(() {
+    final r = zoneArena.using(allocateResource(), releaseResource);
     useResource(r);
   });
 
   // Using an FFI call to release a resource with abnormal control flow.
   try {
-    withZonePool(() {
-      final r = zonePool.using(allocateResource(), releaseResource);
+    withZoneArena(() {
+      final r = zoneArena.using(allocateResource(), releaseResource);
       useResource(r);
 
       throw Exception("Some random exception");
@@ -118,9 +118,9 @@
     freed.add(i);
   }
 
-  Future<int> myFutureInt = withZonePool(() {
+  Future<int> myFutureInt = withZoneArena(() {
     return Future.microtask(() {
-      zonePool.using(1, freeInt);
+      zoneArena.using(1, freeInt);
       return 1;
     });
   });
diff --git a/samples_2/ffi/resource_management/pool.dart b/samples_2/ffi/resource_management/pool.dart
deleted file mode 100644
index ddb5026..0000000
--- a/samples_2/ffi/resource_management/pool.dart
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// Explicit pool used for managing resources.
-
-// @dart = 2.9
-
-import "dart:async";
-import 'dart:ffi';
-
-import 'package:ffi/ffi.dart';
-
-/// An [Allocator] which frees all allocations at the same time.
-///
-/// The pool allows you to allocate heap memory, but ignores calls to [free].
-/// Instead you call [releaseAll] to release all the allocations at the same
-/// time.
-///
-/// Also allows other resources to be associated with the pool, through the
-/// [using] method, to have a release function called for them when the pool is
-/// released.
-///
-/// An [Allocator] can be provided to do the actual allocation and freeing.
-/// Defaults to using [calloc].
-class Pool implements Allocator {
-  /// The [Allocator] used for allocation and freeing.
-  final Allocator _wrappedAllocator;
-
-  /// Native memory under management by this [Pool].
-  final List<Pointer<NativeType>> _managedMemoryPointers = [];
-
-  /// Callbacks for releasing native resources under management by this [Pool].
-  final List<Function()> _managedResourceReleaseCallbacks = [];
-
-  bool _inUse = true;
-
-  /// Creates a pool of allocations.
-  ///
-  /// The [allocator] is used to do the actual allocation and freeing of
-  /// memory. It defaults to using [calloc].
-  Pool([Allocator allocator = calloc]) : _wrappedAllocator = allocator;
-
-  /// Allocates memory and includes it in the pool.
-  ///
-  /// Uses the allocator provided to the [Pool] constructor to do the
-  /// allocation.
-  ///
-  /// Throws an [ArgumentError] if the number of bytes or alignment cannot be
-  /// satisfied.
-  @override
-  Pointer<T> allocate<T extends NativeType>(int byteCount, {int alignment}) {
-    _ensureInUse();
-    final p = _wrappedAllocator.allocate<T>(byteCount, alignment: alignment);
-    _managedMemoryPointers.add(p);
-    return p;
-  }
-
-  /// Registers [resource] in this pool.
-  ///
-  /// Executes [releaseCallback] on [releaseAll].
-  T using<T>(T resource, Function(T) releaseCallback) {
-    _ensureInUse();
-    releaseCallback = Zone.current.bindUnaryCallback(releaseCallback);
-    _managedResourceReleaseCallbacks.add(() => releaseCallback(resource));
-    return resource;
-  }
-
-  /// Registers [releaseResourceCallback] to be executed on [releaseAll].
-  void onReleaseAll(Function() releaseResourceCallback) {
-    _managedResourceReleaseCallbacks.add(releaseResourceCallback);
-  }
-
-  /// Releases all resources that this [Pool] manages.
-  ///
-  /// If [reuse] is `true`, the pool can be used again after resources
-  /// have been released. If not, the default, then the [allocate]
-  /// and [using] methods must not be called after a call to `releaseAll`.
-  void releaseAll({bool reuse = false}) {
-    if (!reuse) {
-      _inUse = false;
-    }
-    while (_managedResourceReleaseCallbacks.isNotEmpty) {
-      _managedResourceReleaseCallbacks.removeLast()();
-    }
-    for (final p in _managedMemoryPointers) {
-      _wrappedAllocator.free(p);
-    }
-    _managedMemoryPointers.clear();
-  }
-
-  /// Does nothing, invoke [releaseAll] instead.
-  @override
-  void free(Pointer<NativeType> pointer) {}
-
-  void _ensureInUse() {
-    if (!_inUse) {
-      throw StateError(
-          "Pool no longer in use, `releaseAll(reuse: false)` was called.");
-    }
-  }
-}
-
-/// Runs [computation] with a new [Pool], and releases all allocations at the end.
-///
-/// If [R] is a [Future], all allocations are released when the future completes.
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_
-/// cleaned up.
-R using<R>(R Function(Pool) computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final pool = Pool(wrappedAllocator);
-  bool isAsync = false;
-  try {
-    final result = computation(pool);
-    if (result is Future) {
-      isAsync = true;
-      return (result.whenComplete(pool.releaseAll) as R);
-    }
-    return result;
-  } finally {
-    if (!isAsync) {
-      pool.releaseAll();
-    }
-  }
-}
-
-/// Creates a zoned [Pool] to manage native resources.
-///
-/// The pool is availabe through [zonePool].
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_ cleaned up.
-R withZonePool<R>(R Function() computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final pool = Pool(wrappedAllocator);
-  var poolHolder = [pool];
-  bool isAsync = false;
-  try {
-    return runZoned(() {
-      final result = computation();
-      if (result is Future) {
-        isAsync = true;
-        result.whenComplete(pool.releaseAll);
-      }
-      return result;
-    }, zoneValues: {#_pool: poolHolder});
-  } finally {
-    if (!isAsync) {
-      pool.releaseAll();
-      poolHolder.remove(pool);
-    }
-  }
-}
-
-/// A zone-specific [Pool].
-///
-/// Asynchronous computations can share a [Pool]. Use [withZonePool] to create
-/// a new zone with a fresh [Pool], and that pool will then be released
-/// automatically when the function passed to [withZonePool] completes.
-/// All code inside that zone can use `zonePool` to access the pool.
-///
-/// The current pool must not be accessed by code which is not running inside
-/// a zone created by [withZonePool].
-Pool get zonePool {
-  final List<Pool> poolHolder = Zone.current[#_pool];
-  if (poolHolder == null) {
-    throw StateError("Not inside a zone created by `usePool`");
-  }
-  if (!poolHolder.isEmpty) {
-    return poolHolder.single;
-  }
-  throw StateError("Pool as already been cleared with releaseAll.");
-}
diff --git a/samples_2/ffi/resource_management/resource_management_test.dart b/samples_2/ffi/resource_management/resource_management_test.dart
index 4b2bbb0..6c596dd 100644
--- a/samples_2/ffi/resource_management/resource_management_test.dart
+++ b/samples_2/ffi/resource_management/resource_management_test.dart
@@ -8,14 +8,14 @@
 
 // @dart = 2.9
 
-import 'pool_isolate_shutdown_sample.dart' as pool_isolate;
-import 'pool_sample.dart' as pool;
-import 'pool_zoned_sample.dart' as pool_zoned;
+import 'arena_isolate_shutdown_sample.dart' as arena_isolate;
+import 'arena_sample.dart' as arena;
+import 'arena_zoned_sample.dart' as arena_zoned;
 import 'unmanaged_sample.dart' as unmanaged;
 
 main() {
-  pool_isolate.main();
-  pool.main();
-  pool_zoned.main();
+  arena_isolate.main();
+  arena.main();
+  arena_zoned.main();
   unmanaged.main();
 }
diff --git a/samples_2/ffi/resource_management/unmanaged_sample.dart b/samples_2/ffi/resource_management/unmanaged_sample.dart
index fa5a60b..0cf460b 100644
--- a/samples_2/ffi/resource_management/unmanaged_sample.dart
+++ b/samples_2/ffi/resource_management/unmanaged_sample.dart
@@ -24,7 +24,7 @@
 
   // To ensure resources are freed, call free manually.
   //
-  // For automatic management use a Pool.
+  // For automatic management use a Arena.
   final p = calloc<Int64>(2);
   p[0] = 24;
   MemMove(p.elementAt(1).cast<Void>(), p.cast<Void>(), sizeOf<Int64>());
diff --git a/samples_2/ffi/resource_management/utf8_helpers.dart b/samples_2/ffi/resource_management/utf8_helpers.dart
index f3d574d..64cc601 100644
--- a/samples_2/ffi/resource_management/utf8_helpers.dart
+++ b/samples_2/ffi/resource_management/utf8_helpers.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// Explicit pool used for managing resources.
+// Explicit arena used for managing resources.
 
 // @dart = 2.9
 
@@ -12,7 +12,7 @@
 
 import 'package:ffi/ffi.dart';
 
-extension Utf8InPool on String {
+extension Utf8InArena on String {
   /// Convert a [String] to a Utf8-encoded null-terminated C string.
   ///
   /// If 'string' contains NULL bytes, the converted string will be truncated
diff --git a/sdk/bin/dart2native b/sdk/bin/dart2native
index 057490f..6f59f3f 100755
--- a/sdk/bin/dart2native
+++ b/sdk/bin/dart2native
@@ -5,6 +5,8 @@
 
 # Run dart2native.dart.snapshot on the Dart VM
 
+echo "Warning: 'dart2native' is deprecated. Please use 'dart compile exe'." 1>&2
+
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
diff --git a/sdk/bin/dart2native.bat b/sdk/bin/dart2native.bat
index 631dce8..ca4d8d7 100644
--- a/sdk/bin/dart2native.bat
+++ b/sdk/bin/dart2native.bat
@@ -3,6 +3,8 @@
 REM for details. All rights reserved. Use of this source code is governed by a
 REM BSD-style license that can be found in the LICENSE file.
 
+echo Warning: 'dart2native' is deprecated. Please use 'dart compile exe'. 1>&2
+
 setlocal
 rem Handle the case where dart-sdk/bin has been symlinked to.
 set DIR_NAME_WITH_SLASH=%~dp0
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index 82349e8..16826bf 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -5,6 +5,9 @@
 [ $builder_tag == msan ]
 vmspecific_handle_test: Skip # https://dartbug.com/42314
 
+[ $compiler == app_jitk ]
+vmspecific_leaf_call_test: Skip # https://dartbug.com/46125: Snapshot fails to generate.
+
 [ $mode == debug ]
 function_callbacks_structs_by_value_generated_test: Pass, Slow
 
diff --git a/tests/ffi_2/ffi_2.status b/tests/ffi_2/ffi_2.status
index 82349e8..16826bf 100644
--- a/tests/ffi_2/ffi_2.status
+++ b/tests/ffi_2/ffi_2.status
@@ -5,6 +5,9 @@
 [ $builder_tag == msan ]
 vmspecific_handle_test: Skip # https://dartbug.com/42314
 
+[ $compiler == app_jitk ]
+vmspecific_leaf_call_test: Skip # https://dartbug.com/46125: Snapshot fails to generate.
+
 [ $mode == debug ]
 function_callbacks_structs_by_value_generated_test: Pass, Slow
 
diff --git a/tests/language/constructor/reference_test.dart b/tests/language/constructor/reference_test.dart
index 9246d2b..f57a26f 100644
--- a/tests/language/constructor/reference_test.dart
+++ b/tests/language/constructor/reference_test.dart
@@ -92,12 +92,13 @@
   Foo<int>();
   Foo<int>.bar();
   Foo<int>.bar.baz();
-  //       ^^^
-  // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-  // [cfe] Expected '(' after this.
-  //           ^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
-  // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
+//^^^
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // ^^^^^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'constructor-tearoffs' language feature to be enabled.
+  //       ^
+  // [cfe] Getter not found: 'bar'.
   Foo.bar<int>();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
diff --git a/tests/language_2/constructor/reference_test.dart b/tests/language_2/constructor/reference_test.dart
index f4fa2fe..73abdb9 100644
--- a/tests/language_2/constructor/reference_test.dart
+++ b/tests/language_2/constructor/reference_test.dart
@@ -94,12 +94,13 @@
   Foo<int>();
   Foo<int>.bar();
   Foo<int>.bar.baz();
-  //       ^^^
-  // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-  // [cfe] Expected '(' after this.
-  //           ^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
-  // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
+//^^^
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // ^^^^^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'constructor-tearoffs' language feature to be enabled.
+  //       ^
+  // [cfe] Getter not found: 'bar'.
   Foo.bar<int>();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
diff --git a/tools/VERSION b/tools/VERSION
index bc449ec..865c9b1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 150
+PRERELEASE 151
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/aot_smoke_tests.dart b/tools/bots/aot_smoke_tests.dart
index b9a035e..406fb08 100755
--- a/tools/bots/aot_smoke_tests.dart
+++ b/tools/bots/aot_smoke_tests.dart
@@ -15,12 +15,11 @@
 import 'package:test/test.dart';
 
 final String newline = Platform.isWindows ? '\r\n' : '\n';
-final String scriptSuffix = Platform.isWindows ? ".bat" : "";
 final String executableSuffix = Platform.isWindows ? ".exe" : "";
 final String sdkBinDir = path.dirname(Platform.executable);
 final String dartaotruntime =
     path.join(sdkBinDir, 'dartaotruntime${executableSuffix}');
-final String dart2native = path.join(sdkBinDir, 'dart2native${scriptSuffix}');
+final String dart = path.join(sdkBinDir, 'dart${executableSuffix}');
 
 Future<void> withTempDir(Future fun(String dir)) async {
   final Directory tempDir = Directory.systemTemp.createTempSync();
@@ -32,14 +31,14 @@
 }
 
 void main(List<String> args) {
-  test("dart2native: Can compile and run AOT", () async {
+  test("Dart native: Can compile and run AOT snapshot", () async {
     await withTempDir((String tmp) async {
       final String testCode = path.join('tools', 'bots', 'dart_aot_test.dart');
       final String tmpAot = path.join(tmp, 'dart_aot_test.aot');
 
       {
-        final ProcessResult result = await Process.run(dart2native,
-            [testCode, '--output', tmpAot, '--output-kind', 'aot']);
+        final ProcessResult result = await Process.run(
+            dart, ['compile', 'aot-snapshot', testCode, '--output', tmpAot]);
         expect(result.stderr, '');
         expect(result.exitCode, 0);
       }
@@ -55,14 +54,14 @@
     });
   });
 
-  test("dart2native: Can compile and run exe", () async {
+  test("Dart native: Can compile and run exe", () async {
     await withTempDir((String tmp) async {
       final String testCode = path.join('tools', 'bots', 'dart_aot_test.dart');
       final String tmpExe = path.join(tmp, 'dart_aot_test.exe');
 
       {
-        final ProcessResult result =
-            await Process.run(dart2native, [testCode, '--output', tmpExe]);
+        final ProcessResult result = await Process.run(
+            dart, ['compile', 'exe', testCode, '--output', tmpExe]);
         expect(result.stderr, '');
         expect(result.exitCode, 0);
       }
@@ -77,27 +76,27 @@
     });
   });
 
-  test("dart2native: Returns non-zero on missing file.", () async {
+  test("Dart native: Returns non-zero on missing file.", () async {
     await withTempDir((String tmp) async {
       final String testCode = path.join(tmp, 'does_not_exist.dart');
       final String tmpExe = path.join(tmp, 'dart_aot_test.exe');
 
       {
-        final ProcessResult result =
-            await Process.run(dart2native, [testCode, '--output', tmpExe]);
+        final ProcessResult result = await Process.run(
+            dart, ['compile', 'exe', testCode, '--output', tmpExe]);
         expect(result.exitCode, isNonZero);
       }
     });
   });
 
-  test("dart2native: Returns non-zero on non-file.", () async {
+  test("Dart native: Returns non-zero on non-file.", () async {
     await withTempDir((String tmp) async {
       final String testCode = tmp; // This is a directory, not a file.
       final String tmpExe = path.join(tmp, 'dart_aot_test.exe');
 
       {
-        final ProcessResult result =
-            await Process.run(dart2native, [testCode, '--output', tmpExe]);
+        final ProcessResult result = await Process.run(
+            dart, ['compile', 'exe', testCode, '--output', tmpExe]);
         expect(result.exitCode, isNonZero);
       }
     });
diff --git a/tools/bots/dart_aot_test.dart b/tools/bots/dart_aot_test.dart
index a1657c1..9449b27 100755
--- a/tools/bots/dart_aot_test.dart
+++ b/tools/bots/dart_aot_test.dart
@@ -3,7 +3,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Test program for Dart AOT (dart2native, dartaotruntime).
+// Test program for Dart AOT (dart compile, dartaotruntime).
 
 void main(List<String> args) async {
   final String who = !args.isEmpty ? args[0] : '世界';