Version 2.14.0-35.0.dev

Merge commit 'b3c0b58e93834d63e6205f103c86abf6ef4230f9' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7bf5a3a..dbc15dc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,14 +27,8 @@
 
 #### Linter
 
-Updated the Linter to `1.4.0`, which includes:
+Updated the Linter to `1.3.0`, which includes:
 
-- `directives_ordering` now checks ordering of `package:` imports in code
-  outside pub packages.
-- simple reachability analysis added to `use_build_context_synchronously` to
-  short-circuit await-discovery in terminating blocks.
-- `use_build_context_synchronously` updated to recognize nullable types when
-  accessed from legacy libraries.
 - updated `non_constant_identifier_names` to check local variables, for-loop
   initializers and catch clauses.
 - updated error range of `lines_longer_than_80_chars` to start at 80 to make
diff --git a/DEPS b/DEPS
index 146ab90..dab41b0 100644
--- a/DEPS
+++ b/DEPS
@@ -124,7 +124,7 @@
   "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "b8dfe403fd8528fd14399dee3a6527b55802dd4d",
-  "linter_tag": "1.4.0",
+  "linter_tag": "1.3.0",
   "logging_rev": "e2f633b543ef89c54688554b15ca3d7e425b86a2",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "markdown_rev": "9c4beaac96d8f008078e00b027915f81b665d2de",
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index a9154dd..23ba26d 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -270,18 +270,23 @@
   /// Verbosity level used for filtering emitted messages.
   Verbosity verbosity = Verbosity.all;
 
-  bool isExperimentEnabledByDefault(ExperimentalFlag flag) {
-    return flags.isExperimentEnabled(flag,
-        defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting);
-  }
-
-  /// Returns
+  /// Returns `true` if the experiment with the given [flag] is enabled, either
+  /// explicitly or implicitly.
+  ///
+  /// Note that libraries can still opt out of the experiment by having a lower
+  /// language version than required for the experiment.
   bool isExperimentEnabled(ExperimentalFlag flag) {
     return flags.isExperimentEnabled(flag,
         explicitExperimentalFlags: explicitExperimentalFlags,
         defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting);
   }
 
+  /// Returns `true` if the experiment with the given [flag] is enabled either
+  /// explicitly or implicitly for the library with the given [importUri].
+  ///
+  /// Note that the library can still opt out of the experiment by having a
+  /// lower language version than required for the experiment. See
+  /// [getExperimentEnabledVersionInLibrary].
   bool isExperimentEnabledInLibrary(ExperimentalFlag flag, Uri importUri) {
     return flags.isExperimentEnabledInLibrary(flag, importUri,
         defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
@@ -289,6 +294,11 @@
         allowedExperimentalFlags: allowedExperimentalFlagsForTesting);
   }
 
+  /// Returns the minimum language version needed for a library with the given
+  /// [importUri] to opt in to the experiment with the given [flag].
+  ///
+  /// Note that the experiment might not be enabled at all for the library, as
+  /// computed by [isExperimentEnabledInLibrary].
   Version getExperimentEnabledVersionInLibrary(
       ExperimentalFlag flag, Uri importUri) {
     return flags.getExperimentEnabledVersionInLibrary(
@@ -300,6 +310,8 @@
             experimentReleasedVersionForTesting);
   }
 
+  /// Return `true` if the experiment with the given [flag] is enabled for the
+  /// library with the given [importUri] and language [version].
   bool isExperimentEnabledInLibraryByVersion(
       ExperimentalFlag flag, Uri importUri, Version version) {
     return flags.isExperimentEnabledInLibraryByVersion(flag, importUri, version,
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index bd9a076..9220790 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:kernel/kernel.dart' show Version;
 
 part 'experimental_flags_generated.dart';
@@ -33,7 +31,7 @@
 
   /// Return the set of enabled experiments for the package with the [name],
   /// e.g. "path", possibly `null`.
-  Set<ExperimentalFlag> forPackage(String name) {
+  Set<ExperimentalFlag>? forPackage(String name) {
     return packageExperiments[name];
   }
 
@@ -53,16 +51,16 @@
 /// If [flag] is marked as expired in [expiredExperimentalFlags], the value from
 /// [defaultExperimentalFlags] is always returned.
 bool isExperimentEnabled(ExperimentalFlag flag,
-    {Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting}) {
+    {Map<ExperimentalFlag, bool>? explicitExperimentalFlags,
+    Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
   assert(expiredExperimentalFlags.containsKey(flag),
       "No expired value for $flag.");
-  if (expiredExperimentalFlags[flag]) {
-    return defaultExperimentalFlags[flag];
+  if (expiredExperimentalFlags[flag]!) {
+    return defaultExperimentalFlags[flag]!;
   }
-  bool enabled;
+  bool? enabled;
   if (explicitExperimentalFlags != null) {
     enabled = explicitExperimentalFlags[flag];
   }
@@ -70,7 +68,7 @@
     enabled ??= defaultExperimentFlagsForTesting[flag];
   }
   enabled ??= defaultExperimentalFlags[flag];
-  return enabled;
+  return enabled!;
 }
 
 /// Returns `true` if [flag] is enabled in the library with the [canonicalUri]
@@ -90,17 +88,17 @@
 /// defines the identity of a library, for instance `dart:core`, `package:foo`,
 /// or `file:///path/dir/file.dart`.
 bool isExperimentEnabledInLibrary(ExperimentalFlag flag, Uri canonicalUri,
-    {Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
-    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    AllowedExperimentalFlags allowedExperimentalFlags}) {
+    {Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting,
+    Map<ExperimentalFlag, bool>? explicitExperimentalFlags,
+    AllowedExperimentalFlags? allowedExperimentalFlags}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
   assert(expiredExperimentalFlags.containsKey(flag),
       "No expired value for $flag.");
-  if (expiredExperimentalFlags[flag]) {
-    return defaultExperimentalFlags[flag];
+  if (expiredExperimentalFlags[flag]!) {
+    return defaultExperimentalFlags[flag]!;
   }
-  bool enabled;
+  bool? enabled;
   if (explicitExperimentalFlags != null) {
     enabled = explicitExperimentalFlags[flag];
   }
@@ -108,9 +106,9 @@
     enabled ??= defaultExperimentFlagsForTesting[flag];
   }
   enabled ??= defaultExperimentalFlags[flag];
-  if (!enabled) {
+  if (!enabled!) {
     allowedExperimentalFlags ??= defaultAllowedExperimentalFlags;
-    Set<ExperimentalFlag> allowedFlags;
+    Set<ExperimentalFlag>? allowedFlags;
     if (canonicalUri.scheme == 'dart') {
       allowedFlags = allowedExperimentalFlags.forSdkLibrary(canonicalUri.path);
     } else if (canonicalUri.scheme == 'package') {
@@ -134,13 +132,13 @@
 /// [canonicalUri].
 Version getExperimentEnabledVersionInLibrary(ExperimentalFlag flag,
     Uri canonicalUri, Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    {AllowedExperimentalFlags allowedExperimentalFlags,
-    Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
-    Map<ExperimentalFlag, Version> experimentEnabledVersionForTesting,
-    Map<ExperimentalFlag, Version> experimentReleasedVersionForTesting}) {
+    {AllowedExperimentalFlags? allowedExperimentalFlags,
+    Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting,
+    Map<ExperimentalFlag, Version>? experimentEnabledVersionForTesting,
+    Map<ExperimentalFlag, Version>? experimentReleasedVersionForTesting}) {
   allowedExperimentalFlags ??= defaultAllowedExperimentalFlags;
 
-  Set<ExperimentalFlag> allowedFlags;
+  Set<ExperimentalFlag>? allowedFlags;
   if (canonicalUri.scheme == 'dart') {
     allowedFlags = allowedExperimentalFlags.forSdkLibrary(canonicalUri.path);
   } else if (canonicalUri.scheme == 'package') {
@@ -153,8 +151,8 @@
     }
     allowedFlags = allowedExperimentalFlags.forPackage(packageName);
   }
-  Version version;
-  bool enabledByDefault;
+  Version? version;
+  bool? enabledByDefault;
   if (defaultExperimentFlagsForTesting != null) {
     enabledByDefault = defaultExperimentFlagsForTesting[flag];
   }
@@ -162,7 +160,7 @@
 
   bool enabledExplicitly = explicitExperimentalFlags[flag] ?? false;
 
-  if (!enabledByDefault ||
+  if (!enabledByDefault! ||
       enabledExplicitly ||
       (allowedFlags != null && allowedFlags.contains(flag))) {
     // If the feature is not enabled by default or is enabled by the allowed
@@ -180,25 +178,25 @@
     version ??= experimentEnabledVersion[flag];
   }
   assert(version != null, "No version for enabling $flag in $canonicalUri.");
-  return version;
+  return version!;
 }
 
 bool isExperimentEnabledInLibraryByVersion(
     ExperimentalFlag flag, Uri canonicalUri, Version version,
-    {Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
-    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    AllowedExperimentalFlags allowedExperimentalFlags,
-    Map<ExperimentalFlag, Version> experimentEnabledVersionForTesting,
-    Map<ExperimentalFlag, Version> experimentReleasedVersionForTesting}) {
+    {Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting,
+    required Map<ExperimentalFlag, bool> explicitExperimentalFlags,
+    AllowedExperimentalFlags? allowedExperimentalFlags,
+    Map<ExperimentalFlag, Version>? experimentEnabledVersionForTesting,
+    Map<ExperimentalFlag, Version>? experimentReleasedVersionForTesting}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
   assert(expiredExperimentalFlags.containsKey(flag),
       "No expired value for $flag.");
-  if (expiredExperimentalFlags[flag]) {
-    return defaultExperimentalFlags[flag];
+  if (expiredExperimentalFlags[flag]!) {
+    return defaultExperimentalFlags[flag]!;
   }
 
-  bool enabledByDefault;
+  bool? enabledByDefault;
   if (defaultExperimentFlagsForTesting != null) {
     enabledByDefault = defaultExperimentFlagsForTesting[flag];
   }
@@ -208,7 +206,7 @@
 
   allowedExperimentalFlags ??= defaultAllowedExperimentalFlags;
 
-  Set<ExperimentalFlag> allowedFlags;
+  Set<ExperimentalFlag>? allowedFlags;
   bool enabledByAllowed = false;
   if (canonicalUri.scheme == 'dart') {
     allowedFlags = allowedExperimentalFlags.forSdkLibrary(canonicalUri.path);
@@ -226,14 +224,14 @@
     enabledByAllowed = allowedFlags.contains(flag);
   }
 
-  if (enabledByDefault || enabledExplicitly || enabledByAllowed) {
+  if (enabledByDefault! || enabledExplicitly || enabledByAllowed) {
     // The feature is enabled depending on the library language version.
-    Version enabledVersion;
+    Version? enabledVersion;
     if (!enabledByDefault || enabledExplicitly || enabledByAllowed) {
       // If the feature is not enabled by default or is enabled by the allowed
       // list, use the experiment release version.
       if (experimentReleasedVersionForTesting != null) {
-        enabledVersion = experimentReleasedVersionForTesting[flag];
+        enabledVersion = experimentReleasedVersionForTesting[flag]!;
       }
       enabledVersion ??= experimentReleasedVersion[flag];
     } else {
@@ -244,7 +242,7 @@
       }
       enabledVersion ??= experimentEnabledVersion[flag];
     }
-    return version >= enabledVersion;
+    return version >= enabledVersion!;
   } else {
     // The feature is not enabled, regardless of library language version.
     return false;
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index af04e106..42d985f 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 // NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
 //
 // Instead modify 'tools/experimental_features.yaml' and run
@@ -44,7 +42,7 @@
 const Version enableValueClassVersion = const Version(2, 14);
 const Version enableVarianceVersion = const Version(2, 14);
 
-ExperimentalFlag parseExperimentalFlag(String flag) {
+ExperimentalFlag? parseExperimentalFlag(String flag) {
   switch (flag) {
     case "alternative-invalidation-strategy":
       return ExperimentalFlag.alternativeInvalidationStrategy;
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 04951b8..60c4162 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -362,11 +362,7 @@
   Target get target =>
       _target ??= _raw.target ?? new NoneTarget(new TargetFlags());
 
-  /// Returns `true` if the [flag] is enabled globally.
-  ///
-  /// This is `true` either if the [flag] is passed through an explicit
-  /// `--enable-experiment` option or if the [flag] is expired and on by
-  /// default.
+  /// Returns `true` if the [flag] is enabled globally by default.
   bool isExperimentEnabledByDefault(flags.ExperimentalFlag flag) {
     return flags.isExperimentEnabled(flag,
         defaultExperimentFlagsForTesting:
@@ -385,22 +381,29 @@
             _raw.defaultExperimentFlagsForTesting);
   }
 
-  /// Returns `true` if the [flag] is enabled in the library with the given
-  /// [importUri].
+  /// Returns `true` if the experiment with the given [flag] is enabled either
+  /// explicitly or implicitly for the library with the given [importUri].
   ///
-  /// This is `true` either if the [flag] is enabled globally as defined
-  /// by [isExperimentEnabledGlobally] or is explicitly enabled through
-  /// the 'allowed_experiments.json' file for this library.
+  /// Note that the library can still opt out of the experiment by having a
+  /// lower language version than required for the experiment. See
+  /// [getExperimentEnabledVersionInLibrary].
   bool isExperimentEnabledInLibrary(
       flags.ExperimentalFlag flag, Uri importUri) {
     return _raw.isExperimentEnabledInLibrary(flag, importUri);
   }
 
+  /// Returns the minimum language version needed for a library with the given
+  /// [importUri] to opt in to the experiment with the given [flag].
+  ///
+  /// Note that the experiment might not be enabled at all for the library, as
+  /// computed by [isExperimentEnabledInLibrary].
   Version getExperimentEnabledVersionInLibrary(
       flags.ExperimentalFlag flag, Uri importUri) {
     return _raw.getExperimentEnabledVersionInLibrary(flag, importUri);
   }
 
+  /// Return `true` if the experiment with the given [flag] is enabled for the
+  /// library with the given [importUri] and language [version].
   bool isExperimentEnabledInLibraryByVersion(
       flags.ExperimentalFlag flag, Uri importUri, Version version) {
     return _raw.isExperimentEnabledInLibraryByVersion(flag, importUri, version);
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index 6b31ffd..8ccfba3 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -34,6 +34,10 @@
 class Sub extends Super;
 class FBound<T extends FBound<T>>;
 class MixinApplication extends Object with FBound<MixinApplication>;
+class ExtendedClass;
+class ExtendedGenericClass<X>;
+extension Extension on ExtendedClass;
+extension GenericExtension<Y> on ExtendedGenericClass<Y>;
 """;
 
 const String expectedSdk = """
@@ -81,6 +85,14 @@
 }
 class MixinApplication = self::Object with self::FBound<self::MixinApplication> {
 }
+class ExtendedClass extends self::Object {
+}
+class ExtendedGenericClass<X extends self::Object? = dynamic> extends self::Object {
+}
+extension Extension on self::ExtendedClass {
+}
+extension GenericExtension<Y extends self::Object? = dynamic> on self::ExtendedGenericClass<Y%> {
+}
 """;
 
 Component parseSdk(Uri uri, TypeParserEnvironment environment) {
diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
index c3ec736..cd96105 100644
--- a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
+++ b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
@@ -97,8 +97,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 // NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
 //
 // Instead modify 'tools/experimental_features.yaml' and run
@@ -154,7 +152,7 @@
 
   sb.write('''
 
-ExperimentalFlag parseExperimentalFlag(String flag) {
+ExperimentalFlag? parseExperimentalFlag(String flag) {
   switch (flag) {
 ''');
   for (String key in keys) {
diff --git a/pkg/kernel/lib/testing/type_parser.dart b/pkg/kernel/lib/testing/type_parser.dart
index 4b935b4e..45ffeab 100644
--- a/pkg/kernel/lib/testing/type_parser.dart
+++ b/pkg/kernel/lib/testing/type_parser.dart
@@ -123,6 +123,32 @@
   }
 }
 
+class ParsedExtension extends ParsedDeclaration {
+  final List<ParsedTypeVariable> typeVariables;
+  final ParsedInterfaceType onType;
+
+  ParsedExtension(String name, this.typeVariables, this.onType) : super(name);
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("extension ");
+    sb.write(name);
+    if (typeVariables.isNotEmpty) {
+      sb.write("<");
+      sb.writeAll(typeVariables, ", ");
+      sb.write(">");
+    }
+    sb.write(" on ");
+    sb.write(onType);
+    sb.write(";");
+    return "$sb";
+  }
+
+  R accept<R, A>(Visitor<R, A> visitor, [A a]) {
+    return visitor.visitExtension(this, a);
+  }
+}
+
 class ParsedTypedef extends ParsedDeclaration {
   final List<ParsedTypeVariable> typeVariables;
 
@@ -347,6 +373,7 @@
   ParsedType parseType() {
     if (optional("class")) return parseClass();
     if (optional("typedef")) return parseTypedef();
+    if (optional("extension")) return parseExtension();
     List<ParsedType> results = <ParsedType>[];
     do {
       ParsedType type;
@@ -494,6 +521,16 @@
         name, typeVariables, supertype, mixedInType, interfaces, callableType);
   }
 
+  ParsedExtension parseExtension() {
+    expect("extension");
+    String name = parseName();
+    List<ParsedTypeVariable> typeVariables = parseTypeVariablesOpt();
+    expect("on");
+    ParsedType onType = parseType();
+    expect(";");
+    return new ParsedExtension(name, typeVariables, onType);
+  }
+
   /// This parses a general typedef on this form:
   ///
   ///     typedef <name> <type-variables-opt> <type> ;
@@ -628,6 +665,10 @@
     return DefaultAction.perform<R, A>(this, node, a);
   }
 
+  R visitExtension(ParsedExtension node, A a) {
+    return DefaultAction.perform<R, A>(this, node, a);
+  }
+
   R visitTypedef(ParsedTypedef node, A a) {
     return DefaultAction.perform<R, A>(this, node, a);
   }
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index fcc984c..262ae20 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -4,30 +4,7 @@
 
 // @dart = 2.9
 
-import "package:kernel/ast.dart"
-    show
-        Class,
-        Component,
-        DartType,
-        DynamicType,
-        FunctionType,
-        FutureOrType,
-        InterfaceType,
-        InvalidType,
-        Library,
-        NamedType,
-        NeverType,
-        Node,
-        NullType,
-        Nullability,
-        Supertype,
-        TreeNode,
-        TypeParameter,
-        TypeParameterType,
-        Typedef,
-        TypedefType,
-        VoidType,
-        setParents;
+import "package:kernel/ast.dart" hide Visitor;
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
@@ -78,6 +55,13 @@
           new Class(fileUri: fileUri, name: name)
             ..typeParameters.addAll(new List<TypeParameter>.filled(
                 type.typeVariables.length, null)));
+    } else if (type is ParsedExtension) {
+      String name = type.name;
+      environment._registerDeclaration(
+          name,
+          new Extension(fileUri: fileUri, name: name)
+            ..typeParameters.addAll(new List<TypeParameter>.filled(
+                type.typeVariables.length, null)));
     }
   }
   for (ParsedType type in types) {
@@ -86,6 +70,8 @@
       library.addClass(node);
     } else if (node is Typedef) {
       library.addTypedef(node);
+    } else if (node is Extension) {
+      library.addExtension(node);
     } else {
       throw "Unsupported: $node";
     }
@@ -381,6 +367,26 @@
     return cls;
   }
 
+  Extension visitExtension(
+      ParsedExtension node, TypeParserEnvironment environment) {
+    String name = node.name;
+    Extension ext = environment.lookupDeclaration(name);
+    ParameterEnvironment parameterEnvironment =
+        computeTypeParameterEnvironment(node.typeVariables, environment);
+    List<TypeParameter> parameters = parameterEnvironment.parameters;
+    setParents(parameters, ext);
+    ext.typeParameters
+      ..clear()
+      ..addAll(parameters);
+    {
+      TypeParserEnvironment environment = parameterEnvironment.environment;
+      InterfaceType onType =
+          node.onType?.accept<Node, TypeParserEnvironment>(this, environment);
+      ext.onType = onType;
+    }
+    return ext;
+  }
+
   Typedef visitTypedef(ParsedTypedef node, TypeParserEnvironment environment) {
     String name = node.name;
     Typedef def = environment._registerDeclaration(
diff --git a/tests/standalone/io/process_non_ascii_test.dart b/tests/standalone/io/process_non_ascii_test.dart
index fd08f06..8944eda 100644
--- a/tests/standalone/io/process_non_ascii_test.dart
+++ b/tests/standalone/io/process_non_ascii_test.dart
@@ -35,6 +35,11 @@
         ..add(script),
       workingDirectory: nonAsciiDir.path,
       environment: {'DART_CRASHPAD_HANDLER': ''}).then((result) {
+    if (result.exitCode != 0) {
+      print('exitCode:\n${result.exitCode}');
+      print('stdout:\n${result.stdout}');
+      print('stderr:\n${result.stderr}');
+    }
     Expect.equals(0, result.exitCode);
     tempDir.deleteSync(recursive: true);
     asyncEnd();
diff --git a/tests/standalone_2/io/process_non_ascii_test.dart b/tests/standalone_2/io/process_non_ascii_test.dart
index fd08f06..8944eda 100644
--- a/tests/standalone_2/io/process_non_ascii_test.dart
+++ b/tests/standalone_2/io/process_non_ascii_test.dart
@@ -35,6 +35,11 @@
         ..add(script),
       workingDirectory: nonAsciiDir.path,
       environment: {'DART_CRASHPAD_HANDLER': ''}).then((result) {
+    if (result.exitCode != 0) {
+      print('exitCode:\n${result.exitCode}');
+      print('stdout:\n${result.stdout}');
+      print('stderr:\n${result.stderr}');
+    }
     Expect.equals(0, result.exitCode);
     tempDir.deleteSync(recursive: true);
     asyncEnd();
diff --git a/tools/VERSION b/tools/VERSION
index 7713491..d059f6c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 34
+PRERELEASE 35
 PRERELEASE_PATCH 0
\ No newline at end of file