diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index d5be3ee..ee22cc5 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -831,6 +831,10 @@
   /// necessary; in this case, [viaInitializer] should be `true`.
   void write(
       Variable variable, Type writtenType, Expression? writtenExpression);
+
+  /// Prints out a summary of the current state of flow analysis, intended for
+  /// debugging use only.
+  void _dumpState();
 }
 
 /// Alternate implementation of [FlowAnalysis] that prints out inputs and output
@@ -838,7 +842,7 @@
 class FlowAnalysisDebug<Node extends Object, Statement extends Node,
         Expression extends Object, Variable extends Object, Type extends Object>
     implements FlowAnalysis<Node, Statement, Expression, Variable, Type> {
-  _FlowAnalysisImpl<Node, Statement, Expression, Variable, Type> _wrapped;
+  FlowAnalysis<Node, Statement, Expression, Variable, Type> _wrapped;
 
   bool _exceptionOccurred = false;
 
@@ -1305,6 +1309,9 @@
         () => _wrapped.write(variable, writtenType, writtenExpression));
   }
 
+  @override
+  void _dumpState() => _wrapped._dumpState();
+
   T _wrap<T>(String description, T callback(),
       {bool isQuery: false, bool? isPure}) {
     isPure ??= isQuery;
@@ -3806,6 +3813,7 @@
         _current.write(variable, writtenType, newSsaNode, typeOperations);
   }
 
+  @override
   void _dumpState() {
     print('  current: $_current');
     print('  expressionWithInfo: $_expressionWithInfo');
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 1ea05e1..d2ba523 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -5937,6 +5937,39 @@
     tip: r"""Try replacing them with normal or optional parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String name2,
+        String
+            string3)> templateJsInteropNativeClassInAnnotation = const Template<
+        Message Function(String name, String name2, String string3)>(
+    messageTemplate:
+        r"""JS interop class '#name' conflicts with natively supported class '#name2' in '#string3'.""",
+    withArguments: _withArgumentsJsInteropNativeClassInAnnotation);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2, String string3)>
+    codeJsInteropNativeClassInAnnotation =
+    const Code<Message Function(String name, String name2, String string3)>(
+  "JsInteropNativeClassInAnnotation",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsJsInteropNativeClassInAnnotation(
+    String name, String name2, String string3) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  if (string3.isEmpty) throw 'No string provided';
+  return new Message(codeJsInteropNativeClassInAnnotation,
+      message:
+          """JS interop class '${name}' conflicts with natively supported class '${name2}' in '${string3}'.""",
+      arguments: {'name': name, 'name2': name2, 'string3': string3});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropNonExternalConstructor =
     messageJsInteropNonExternalConstructor;
 
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 8bb8c6d..e3f0978 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -17,17 +17,40 @@
         messageJsInteropNonExternalConstructor,
         messageJsInteropNonExternalMember,
         templateJsInteropDartClassExtendsJSClass,
-        templateJsInteropJSClassExtendsDartClass;
+        templateJsInteropJSClassExtendsDartClass,
+        templateJsInteropNativeClassInAnnotation;
 
 import 'src/js_interop.dart';
 
 class JsInteropChecks extends RecursiveVisitor<void> {
   final CoreTypes _coreTypes;
   final DiagnosticReporter<Message, LocatedMessage> _diagnosticsReporter;
+  final Map<String, Class> _nativeClasses;
   bool _classHasJSAnnotation = false;
+  bool _classHasAnonymousAnnotation = false;
   bool _libraryHasJSAnnotation = false;
+  bool _libraryIsGlobalNamespace = false;
 
-  JsInteropChecks(this._coreTypes, this._diagnosticsReporter);
+  JsInteropChecks(
+      this._coreTypes, this._diagnosticsReporter, this._nativeClasses);
+
+  /// Extract all native class names from the [component].
+  ///
+  /// Returns a map from the name to the underlying Class node. This is a
+  /// static method so that the result can be cached in the corresponding
+  /// compiler target.
+  static Map<String, Class> getNativeClasses(Component component) {
+    Map<String, Class> nativeClasses = {};
+    for (var library in component.libraries) {
+      for (var cls in library.classes) {
+        var nativeNames = getNativeNames(cls);
+        for (var nativeName in nativeNames) {
+          nativeClasses[nativeName] = cls;
+        }
+      }
+    }
+    return nativeClasses;
+  }
 
   @override
   void defaultMember(Member member) {
@@ -40,6 +63,7 @@
   @override
   void visitClass(Class cls) {
     _classHasJSAnnotation = hasJSInteropAnnotation(cls);
+    _classHasAnonymousAnnotation = hasAnonymousAnnotation(cls);
     var superclass = cls.superclass;
     if (superclass != null && superclass != _coreTypes.objectClass) {
       var superHasJSAnnotation = hasJSInteropAnnotation(superclass);
@@ -59,14 +83,53 @@
             cls.location.file);
       }
     }
+    if (_classHasJSAnnotation &&
+        !_classHasAnonymousAnnotation &&
+        _libraryIsGlobalNamespace) {
+      var jsClass = getJSName(cls);
+      if (jsClass.isEmpty) {
+        // No rename, take the name of the class directly.
+        jsClass = cls.name;
+      } else {
+        // Remove any global prefixes. Regex here is greedy and will only return
+        // a value for `className` that doesn't start with 'self.' or 'window.'.
+        var classRegexp = new RegExp(r'^((self|window)\.)*(?<className>.*)$');
+        var matches = classRegexp.allMatches(jsClass);
+        jsClass = matches.first.namedGroup('className');
+      }
+      if (_nativeClasses.containsKey(jsClass)) {
+        var nativeClass = _nativeClasses[jsClass];
+        _diagnosticsReporter.report(
+            templateJsInteropNativeClassInAnnotation.withArguments(
+                cls.name,
+                nativeClass.name,
+                nativeClass.enclosingLibrary.importUri.toString()),
+            cls.fileOffset,
+            cls.name.length,
+            cls.location.file);
+      }
+    }
     super.visitClass(cls);
+    _classHasAnonymousAnnotation = false;
     _classHasJSAnnotation = false;
   }
 
   @override
   void visitLibrary(Library lib) {
     _libraryHasJSAnnotation = hasJSInteropAnnotation(lib);
+    _libraryIsGlobalNamespace = false;
+    if (_libraryHasJSAnnotation) {
+      var libraryAnnotation = getJSName(lib);
+      var globalRegexp = new RegExp(r'^(self|window)(\.(self|window))*$');
+      if (libraryAnnotation.isEmpty ||
+          globalRegexp.hasMatch(libraryAnnotation)) {
+        _libraryIsGlobalNamespace = true;
+      }
+    } else {
+      _libraryIsGlobalNamespace = true;
+    }
     super.visitLibrary(lib);
+    _libraryIsGlobalNamespace = false;
     _libraryHasJSAnnotation = false;
   }
 
@@ -98,7 +161,7 @@
     }
 
     var isAnonymousFactory =
-        isAnonymousClassMember(procedure) && procedure.isFactory;
+        _classHasAnonymousAnnotation && procedure.isFactory;
 
     if (isAnonymousFactory) {
       if (procedure.function != null &&
diff --git a/pkg/_js_interop_checks/lib/src/js_interop.dart b/pkg/_js_interop_checks/lib/src/js_interop.dart
index 33ab00b..7831f2d 100644
--- a/pkg/_js_interop_checks/lib/src/js_interop.dart
+++ b/pkg/_js_interop_checks/lib/src/js_interop.dart
@@ -9,15 +9,48 @@
 bool hasJSInteropAnnotation(Annotatable a) =>
     a.annotations.any(_isPublicJSAnnotation);
 
-/// Returns true if [m] belongs to an anonymous class.
-bool isAnonymousClassMember(Member m) {
-  var enclosingClass = m.enclosingClass;
-  if (enclosingClass == null) return false;
-  return enclosingClass.annotations.any(_isAnonymousAnnotation);
+/// Returns true iff the node has an `@anonymous(...)` annotation from
+/// `package:js` or from the internal `dart:_js_annotations`.
+bool hasAnonymousAnnotation(Annotatable a) =>
+    a.annotations.any(_isAnonymousAnnotation);
+
+/// If [a] has a `@JS('...')` annotation, returns the value inside the
+/// parentheses.
+///
+/// If there is none or the class does not have a `@JS()` annotation, returns
+/// an empty String.
+String getJSName(Annotatable a) {
+  String jsClass = '';
+  for (var annotation in a.annotations) {
+    if (_isPublicJSAnnotation(annotation)) {
+      var jsClasses = _stringAnnotationValues(annotation);
+      if (jsClasses.length > 0) {
+        jsClass = jsClasses[0];
+      }
+    }
+  }
+  return jsClass;
+}
+
+/// If [a] has a `@Native('...')` annotation, returns the values inside the
+/// parentheses.
+///
+/// If there are none or the class does not have a `@Native()` annotation,
+/// returns an empty list. Unlike `@JS()`, the string within `@Native()` is
+/// allowed to contain several classes separated by a `,`.
+List<String> getNativeNames(Annotatable a) {
+  List<String> nativeClasses = [];
+  for (var annotation in a.annotations) {
+    if (_isNativeAnnotation(annotation)) {
+      nativeClasses.addAll(_stringAnnotationValues(annotation));
+    }
+  }
+  return nativeClasses;
 }
 
 final _packageJs = Uri.parse('package:js/js.dart');
 final _internalJs = Uri.parse('dart:_js_annotations');
+final _jsHelper = Uri.parse('dart:_js_helper');
 
 /// Returns true if [value] is the `JS` annotation from `package:js` or from
 /// `dart:_js_annotations`.
@@ -39,12 +72,20 @@
           c.enclosingLibrary.importUri == _internalJs);
 }
 
+bool _isNativeAnnotation(Expression value) {
+  var c = _annotationClass(value);
+  return c != null &&
+      c.name == 'Native' &&
+      c.enclosingLibrary.importUri == _jsHelper;
+}
+
 /// Returns the class of the instance referred to by metadata annotation [node].
 ///
 /// For example:
 ///
 /// - `@JS()` would return the "JS" class in "package:js".
 /// - `@anonymous` would return the "_Anonymous" class in "package:js".
+/// - `@Native` would return the "Native" class in "dart:_js_helper".
 ///
 /// This function works regardless of whether the CFE is evaluating constants,
 /// or whether the constant is a field reference (such as "anonymous" above).
@@ -60,3 +101,40 @@
   }
   return null;
 }
+
+/// Returns the string values inside of a metadata annotation [node].
+///
+/// For example:
+/// - `@JS('Foo')` would return ['Foo'].
+/// - `@Native('Foo,Bar')` would return ['Foo', 'Bar'].
+///
+/// [node] is expected to be an annotation with either StringConstants or
+/// StringLiterals that can be made up of multiple values. If there are none,
+/// this method returns an empty list. This method throws an assertion if there
+/// are multiple arguments or a named arg in the annotation.
+List<String> _stringAnnotationValues(Expression node) {
+  List<String> values = [];
+  if (node is ConstantExpression) {
+    var constant = node.constant;
+    if (constant is InstanceConstant) {
+      var argLength = constant.fieldValues.values.length;
+      if (argLength == 1) {
+        var value = constant.fieldValues.values.elementAt(0);
+        if (value is StringConstant) values.addAll(value.value.split(','));
+      } else if (argLength > 1) {
+        throw new ArgumentError('Method expects annotation with at most one '
+            'positional argument: $node.');
+      }
+    }
+  } else if (node is ConstructorInvocation) {
+    var argLength = node.arguments.positional.length;
+    if (argLength > 1 || node.arguments.named.length > 0) {
+      throw new ArgumentError('Method expects annotation with at most one '
+          'positional argument: $node.');
+    } else if (argLength == 1) {
+      var value = node.arguments.positional[0];
+      if (value is StringLiteral) values.addAll(value.value.split(','));
+    }
+  }
+  return values;
+}
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index d693387..aabef45 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -3,10 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/plugin/protocol/protocol_dart.dart';
-import 'package:analyzer/dart/ast/ast.dart' as engine;
 import 'package:analyzer/dart/element/element.dart' as engine;
 import 'package:analyzer/src/dart/element/element.dart' as engine;
-import 'package:analyzer/src/generated/testing/element_search.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -91,20 +89,13 @@
 
 @reflectiveTest
 class ElementTest extends AbstractSingleUnitTest {
-  engine.Element findElementInUnit(engine.CompilationUnit unit, String name,
-      [engine.ElementKind kind]) {
-    return findElementsByName(unit, name)
-        .where((e) => kind == null || e.kind == kind)
-        .single;
-  }
-
   Future<void> test_fromElement_CLASS() async {
     await resolveTestCode('''
 @deprecated
 abstract class _A {}
 class B<K, V> {}''');
     {
-      engine.ClassElement engineElement = findElementInUnit(testUnit, '_A');
+      var engineElement = findElement.class_('_A');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.CLASS);
@@ -126,7 +117,7 @@
               Element.FLAG_PRIVATE);
     }
     {
-      engine.ClassElement engineElement = findElementInUnit(testUnit, 'B');
+      var engineElement = findElement.class_('B');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.CLASS);
@@ -141,8 +132,7 @@
 class A {
   const A.myConstructor(int a, [String b]);
 }''');
-    engine.ConstructorElement engineElement =
-        findElementInUnit(testUnit, 'myConstructor');
+    var engineElement = findElement.constructor('myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.CONSTRUCTOR);
@@ -169,8 +159,7 @@
   const A.myConstructor(int a, {int b, @required int c});
 }''');
 
-    engine.ConstructorElement engineElement =
-        findElementInUnit(testUnit, 'myConstructor');
+    var engineElement = findElement.constructor('myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters, '(int a, {@required int c, int b})');
@@ -185,8 +174,7 @@
   const A.myConstructor(int a, {int b, @required int d, @required int c});
 }''');
 
-    engine.ConstructorElement engineElement =
-        findElementInUnit(testUnit, 'myConstructor');
+    var engineElement = findElement.constructor('myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters,
@@ -203,8 +191,7 @@
   const A.myConstructor(int a, {int b, @required int d, @required int c, int a});
 }''');
 
-    engine.ConstructorElement engineElement =
-        findElementInUnit(testUnit, 'myConstructor');
+    var engineElement = findElement.constructor('myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters,
@@ -229,7 +216,7 @@
 enum _E1 { one, two }
 enum E2 { three, four }''');
     {
-      engine.ClassElement engineElement = findElementInUnit(testUnit, '_E1');
+      var engineElement = findElement.enum_('_E1');
       expect(engineElement.hasDeprecated, isTrue);
       // create notification Element
       var element = convertElement(engineElement);
@@ -251,7 +238,7 @@
               Element.FLAG_PRIVATE);
     }
     {
-      engine.ClassElement engineElement = findElementInUnit(testUnit, 'E2');
+      var engineElement = findElement.enum_('E2');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM);
@@ -267,7 +254,7 @@
 enum _E1 { one, two }
 enum E2 { three, four }''');
     {
-      engine.FieldElement engineElement = findElementInUnit(testUnit, 'one');
+      var engineElement = findElement.field('one');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM_CONSTANT);
@@ -291,7 +278,7 @@
           Element.FLAG_CONST | Element.FLAG_STATIC);
     }
     {
-      engine.FieldElement engineElement = findElementInUnit(testUnit, 'three');
+      var engineElement = findElement.field('three');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM_CONSTANT);
@@ -309,7 +296,7 @@
       expect(element.flags, Element.FLAG_CONST | Element.FLAG_STATIC);
     }
     {
-      var engineElement = testUnit.declaredElement.enums[1].getField('index');
+      var engineElement = findElement.field('index', of: 'E2');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.FIELD);
@@ -327,7 +314,7 @@
       expect(element.flags, Element.FLAG_FINAL);
     }
     {
-      var engineElement = testUnit.declaredElement.enums[1].getField('values');
+      var engineElement = findElement.field('values', of: 'E2');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.FIELD);
@@ -351,7 +338,7 @@
 class A {
   static const myField = 42;
 }''');
-    engine.FieldElement engineElement = findElementInUnit(testUnit, 'myField');
+    var engineElement = findElement.field('myField');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FIELD);
@@ -373,8 +360,7 @@
     await resolveTestCode('''
 typedef int F<T>(String x);
 ''');
-    engine.FunctionTypeAliasElement engineElement =
-        findElementInUnit(testUnit, 'F');
+    var engineElement = findElement.typeAlias('F');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
@@ -397,8 +383,7 @@
     await resolveTestCode('''
 typedef F<T> = int Function(String x);
 ''');
-    engine.FunctionTypeAliasElement engineElement =
-        findElementInUnit(testUnit, 'F');
+    var engineElement = findElement.typeAlias('F');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
@@ -423,8 +408,7 @@
 class A {
   String get myGetter => 42;
 }''');
-    engine.PropertyAccessorElement engineElement =
-        findElementInUnit(testUnit, 'myGetter', engine.ElementKind.GETTER);
+    var engineElement = findElement.getter('myGetter');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.GETTER);
@@ -450,7 +434,7 @@
     break myLabel;
   }
 }''');
-    engine.LabelElement engineElement = findElementInUnit(testUnit, 'myLabel');
+    var engineElement = findElement.label('myLabel');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.LABEL);
@@ -475,8 +459,7 @@
     return null;
   }
 }''');
-    engine.MethodElement engineElement =
-        findElementInUnit(testUnit, 'myMethod');
+    var engineElement = findElement.method('myMethod');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.METHOD);
@@ -499,7 +482,7 @@
 mixin A {}
 ''');
     {
-      engine.ClassElement engineElement = findElementInUnit(testUnit, 'A');
+      var engineElement = findElement.mixin('A');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.MIXIN);
@@ -523,8 +506,7 @@
 class A {
   set mySetter(String x) {}
 }''');
-    engine.PropertyAccessorElement engineElement =
-        findElementInUnit(testUnit, 'mySetter', engine.ElementKind.SETTER);
+    var engineElement = findElement.setter('mySetter');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.SETTER);
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index 4683949..95e8ed2 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/generated/testing/element_search.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show RefactoringProblemSeverity;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -155,7 +154,7 @@
   var v = test();
 }
 ''');
-    ExecutableElement element = findElementsByName(testUnit, 'test').single;
+    var element = findElement.localFunction('test');
     _createRefactoringForElement(element);
     // check conditions
     await _assertInitialConditions_fatal(
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index cf138c1..fe2afbf 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -2,6 +2,8 @@
 * Deprecated `FunctionTypeAliasElement.function`.
   Use `TypeAliasElement.aliasedElement` instead.
 * Widened the dependency on package:crypto to include version 3.0.0.
+* Deprecated `CompilationUnitElement.functionTypeAliases`.
+  Use `CompilationUnitElement.typeAliases` instead.
 
 ## 0.41.1
 * Updated `PackageBuildWorkspace` that supports `package:build` to stop
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index be78683..5f38ebb 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -391,6 +391,7 @@
 
   /// Return a list containing all of the function type aliases contained in
   /// this compilation unit.
+  @Deprecated('Use typeAliases instead')
   List<FunctionTypeAliasElement> get functionTypeAliases;
 
   /// Return `true` if this compilation unit defines a top-level function named
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 4207727..3074d5b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -179,9 +179,9 @@
         unitElement.enums.forEach(addElement);
         unitElement.extensions.forEach(addElement);
         unitElement.functions.forEach(addElement);
-        unitElement.functionTypeAliases.forEach(addElement);
         unitElement.mixins.forEach(addElement);
         unitElement.topLevelVariables.forEach(addElement);
+        unitElement.typeAliases.forEach(addElement);
         unitElement.types.forEach(addElement);
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 7b620f3..8149a3b 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -39,7 +39,7 @@
 
 bool _isConstantTypeName(Identifier name) {
   var element = name.staticElement;
-  if (element is ClassElement || element is FunctionTypeAliasElement) {
+  if (element is ClassElement || element is TypeAliasElement) {
     if (name is PrefixedIdentifier) {
       if (name.isDeferred) {
         return false;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index a76e610..9ac4dc9 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1318,6 +1318,7 @@
     _functions = functions;
   }
 
+  @Deprecated('Use typeAliases instead')
   @override
   List<FunctionTypeAliasElement> get functionTypeAliases {
     return _functionTypeAliases ??=
@@ -1430,10 +1431,9 @@
     return _typeAliases ?? const <TypeAliasElement>[];
   }
 
-  /// Set the function type aliases contained in this compilation unit to the
-  /// given [typeAliases].
-  set typeAliases(List<FunctionTypeAliasElement> typeAliases) {
-    for (FunctionTypeAliasElement typeAlias in typeAliases) {
+  /// Set the type aliases contained in this compilation unit to [typeAliases].
+  set typeAliases(List<TypeAliasElement> typeAliases) {
+    for (TypeAliasElement typeAlias in typeAliases) {
       (typeAlias as ElementImpl).enclosingElement = this;
     }
     _typeAliases = typeAliases;
@@ -1524,8 +1524,8 @@
     safelyVisitChildren(enums, visitor);
     safelyVisitChildren(extensions, visitor);
     safelyVisitChildren(functions, visitor);
-    safelyVisitChildren(functionTypeAliases, visitor);
     safelyVisitChildren(mixins, visitor);
+    safelyVisitChildren(typeAliases, visitor);
     safelyVisitChildren(types, visitor);
     safelyVisitChildren(topLevelVariables, visitor);
   }
@@ -5244,10 +5244,10 @@
       yield* unit.accessors;
       yield* unit.enums;
       yield* unit.extensions;
-      yield* unit.functionTypeAliases;
       yield* unit.functions;
       yield* unit.mixins;
       yield* unit.topLevelVariables;
+      yield* unit.typeAliases;
       yield* unit.types;
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
index 7c19f05..c2380d8 100644
--- a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
@@ -376,7 +376,7 @@
     var element = type.element;
     if (element is ClassElement) {
       parameters = element.typeParameters;
-    } else if (element is FunctionTypeAliasElement) {
+    } else if (element is TypeAliasElement) {
       parameters = element.typeParameters;
     }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index 0eebe01..b9c2384 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -248,11 +248,10 @@
     for (FunctionElement element in compilationUnit.functions) {
       _addIfPublic(definedNames, element);
     }
-    for (FunctionTypeAliasElement element
-        in compilationUnit.functionTypeAliases) {
+    for (ClassElement element in compilationUnit.mixins) {
       _addIfPublic(definedNames, element);
     }
-    for (ClassElement element in compilationUnit.mixins) {
+    for (TypeAliasElement element in compilationUnit.typeAliases) {
       _addIfPublic(definedNames, element);
     }
     for (ClassElement element in compilationUnit.types) {
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 0b5e1f1..073ca29 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -202,15 +202,15 @@
       for (FunctionElement function in element.functions) {
         definedGetters[function.name] = function;
       }
-      for (FunctionTypeAliasElement alias in element.functionTypeAliases) {
-        definedGetters[alias.name] = alias;
-      }
       for (TopLevelVariableElement variable in element.topLevelVariables) {
         definedGetters[variable.name] = variable;
         if (!variable.isFinal && !variable.isConst) {
           definedGetters[variable.name + '='] = variable;
         }
       }
+      for (TypeAliasElement alias in element.typeAliases) {
+        definedGetters[alias.name] = alias;
+      }
       for (ClassElement type in element.types) {
         definedGetters[type.name] = type;
       }
diff --git a/pkg/analyzer/lib/src/generated/testing/element_search.dart b/pkg/analyzer/lib/src/generated/testing/element_search.dart
deleted file mode 100644
index e0bfdbb1..0000000
--- a/pkg/analyzer/lib/src/generated/testing/element_search.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2017, 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/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-
-/// Search the [unit] for the [Element]s with the given [name].
-List<Element> findElementsByName(CompilationUnit unit, String name) {
-  var finder = _ElementsByNameFinder(name);
-  unit.accept(finder);
-  return finder.elements;
-}
-
-class _ElementsByNameFinder extends RecursiveAstVisitor<void> {
-  final String name;
-  final List<Element> elements = [];
-
-  _ElementsByNameFinder(this.name);
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.name == name && node.inDeclarationContext()) {
-      elements.add(node.staticElement);
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/testing/node_search.dart b/pkg/analyzer/lib/src/generated/testing/node_search.dart
deleted file mode 100644
index 9a2b15d..0000000
--- a/pkg/analyzer/lib/src/generated/testing/node_search.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2017, 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/dart/ast/visitor.dart';
-
-/// Search the [unit] for declared [SimpleIdentifier]s with the given [name].
-List<SimpleIdentifier> findDeclaredIdentifiersByName(
-    CompilationUnit unit, String name) {
-  var finder = _DeclaredIdentifiersByNameFinder(name);
-  unit.accept(finder);
-  return finder.identifiers;
-}
-
-class _DeclaredIdentifiersByNameFinder extends RecursiveAstVisitor<void> {
-  final String name;
-  final List<SimpleIdentifier> identifiers = [];
-
-  _DeclaredIdentifiersByNameFinder(this.name);
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.name == name && node.inDeclarationContext()) {
-      identifiers.add(node);
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary2/simply_bounded.dart b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
index 03be657..fb5d0ed 100644
--- a/pkg/analyzer/lib/src/summary2/simply_bounded.dart
+++ b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
@@ -19,7 +19,7 @@
   var nodes = <SimplyBoundedNode>[];
   for (var libraryBuilder in libraryBuilders) {
     for (var unit in libraryBuilder.element.units) {
-      for (var element in unit.functionTypeAliases) {
+      for (var element in unit.typeAliases) {
         var node = walker.getNode(element);
         nodes.add(node);
       }
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 1dc486d..5eb87ce 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -197,7 +197,7 @@
       return;
     }
 
-    var type = node.functionType?.type;
+    var type = node.type?.type;
 
     // Not a function type, recover.
     if (type == null) {
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index ca63fe8..11c4578 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -1141,7 +1141,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 225, 1),
     ]);
 
-    DartType cType = findLocalVariable(unit, 'c').type;
+    DartType cType = findElement.localVar('c').type;
     Element elementC = AstFinder.getClass(unit, "C").declaredElement;
 
     _isInstantiationOf(_hasElement(elementC))([_isDynamic])(cType);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index b10a2b7..0dd6b71 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -6253,7 +6253,7 @@
     var myLibrary = myImport.importedLibrary;
     var myUnit = myLibrary.definingCompilationUnit;
     var myClass = myUnit.types.single;
-    var myFunctionTypeAlias = myUnit.functionTypeAliases.single;
+    var myTypeAlias = myUnit.typeAliases.single;
     var myTopVariable = myUnit.topLevelVariables[0];
     var myTopFunction = myUnit.functions.single;
     var myGetter = myUnit.topLevelVariables[1].getter;
@@ -6280,7 +6280,7 @@
     }
 
     assertPrefixedIdentifier(0, myClass, typeProvider.typeType);
-    assertPrefixedIdentifier(1, myFunctionTypeAlias, typeProvider.typeType);
+    assertPrefixedIdentifier(1, myTypeAlias, typeProvider.typeType);
     assertPrefixedIdentifier(2, myTopVariable.getter, typeProvider.intType);
 
     {
@@ -7597,12 +7597,11 @@
 
     await resolveTestFile();
     CompilationUnit unit = result.unit;
-    CompilationUnitElement unitElement = unit.declaredElement;
 
     FunctionTypeAlias alias = unit.declarations[0];
     TypeAliasElement aliasElement = alias.declaredElement;
     var function = aliasElement.aliasedElement as GenericFunctionTypeElement;
-    expect(aliasElement, same(unitElement.functionTypeAliases[0]));
+    expect(aliasElement, same(findElement.typeAlias('F')));
     expect(function.returnType, typeProvider.intType);
 
     _assertTypeNameSimple(alias.returnType, typeProvider.intType);
diff --git a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
index 4ba18ab..97a88b3 100644
--- a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
@@ -14,7 +14,7 @@
     defineReflectiveTests(IsConstantTypeExpressionTest);
     defineReflectiveTests(IsPotentiallyConstantTypeExpressionTest);
     defineReflectiveTests(PotentiallyConstantTest);
-    defineReflectiveTests(PotentiallyConstantWithNullSafetyTest);
+    defineReflectiveTests(PotentiallyConstantWithNonFunctionTypeAliasesTest);
   });
 }
 
@@ -749,6 +749,12 @@
 ''', () => _xInitializer(), () => [findNode.typeName('T>{0')]);
   }
 
+  test_simpleIdentifier_class() async {
+    await _assertConst(r'''
+var x = int;
+''', () => _xInitializer());
+  }
+
   test_simpleIdentifier_function() async {
     await _assertConst(r'''
 var x = f;
@@ -845,9 +851,10 @@
     );
   }
 
-  test_simpleIdentifier_type_class() async {
+  test_simpleIdentifier_typedef_functionType() async {
     await _assertConst(r'''
-var x = int;
+typedef A = void Function();
+var x = A;
 ''', () => _xInitializer());
   }
 
@@ -918,8 +925,8 @@
 }
 
 @reflectiveTest
-class PotentiallyConstantWithNullSafetyTest extends PotentiallyConstantTest
-    with WithNullSafetyMixin {
+class PotentiallyConstantWithNonFunctionTypeAliasesTest
+    extends PotentiallyConstantTest with WithNonFunctionTypeAliasesMixin {
   @override
   test_asExpression_typeParameter() async {
     await _assertConst(r'''
@@ -965,4 +972,21 @@
 }
 ''', () => _xInitializer());
   }
+
+  test_prefixedIdentifier_typedef_interfaceType() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+typedef A = List<int>;
+''');
+    await _assertConst(r'''
+import 'a.dart' as p;
+var x = p.A;
+''', () => _xInitializer());
+  }
+
+  test_simpleIdentifier_typedef_interfaceType() async {
+    await _assertConst(r'''
+typedef A = List<int>;
+var x = A;
+''', () => _xInitializer());
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
index 1891285..a69ca06 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
@@ -936,7 +936,8 @@
 }
 
 @reflectiveTest
-class DuplicateDefinitionTest extends PubPackageResolutionTest {
+class DuplicateDefinitionTest extends PubPackageResolutionTest
+    with WithNonFunctionTypeAliasesMixin {
   test_catch() async {
     await assertErrorsInCode(r'''
 main() {
@@ -979,16 +980,16 @@
 
   test_locals_block_if() async {
     await assertErrorsInCode(r'''
-main(int p) {
+void f(int p) {
   if (p != 0) {
     var a;
     var a;
   }
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 38, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 49, 1),
-      error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 49, 1),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 40, 1),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 51, 1),
+      error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 51, 1),
     ]);
   }
 
@@ -1214,4 +1215,13 @@
         error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 27, 1),
       ]);
   }
+
+  test_unitMembers_typedef_interfaceType() async {
+    await assertErrorsInCode('''
+typedef A = List<int>;
+typedef A = List<int>;
+''', [
+      error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 31, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 5bca31e..b439e4f 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -1730,50 +1730,6 @@
 ''');
   }
 
-  test_class_type_parameters_variance_contravariant() async {
-    var library = await checkLibrary('class C<in T> {}');
-    checkElementText(
-        library,
-        r'''
-class C<contravariant T> {
-}
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_class_type_parameters_variance_covariant() async {
-    var library = await checkLibrary('class C<out T> {}');
-    checkElementText(
-        library,
-        r'''
-class C<covariant T> {
-}
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_class_type_parameters_variance_invariant() async {
-    var library = await checkLibrary('class C<inout T> {}');
-    checkElementText(
-        library,
-        r'''
-class C<invariant T> {
-}
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_class_type_parameters_variance_multiple() async {
-    var library = await checkLibrary('class C<inout T, in U, out V> {}');
-    checkElementText(
-        library,
-        r'''
-class C<invariant T, contravariant U, covariant V> {
-}
-''',
-        withTypeParameterVariance: true);
-  }
-
   test_class_typeParameters_defaultType_functionTypeAlias_contravariant_legacy() async {
     featureSet = FeatureSets.beforeNullSafe;
     var library = await checkLibrary(r'''
@@ -1807,6 +1763,22 @@
         withTypeParameterVariance: true);
   }
 
+  test_class_typeParameters_defaultType_functionTypeAlias_covariant_nullSafe() async {
+    var library = await checkLibrary(r'''
+typedef F<X> = X Function();
+
+class A<X extends F<X>> {}
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F<covariant X> = X Function();
+notSimplyBounded class A<covariant X extends X Function() = dynamic Function()> {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
   test_class_typeParameters_defaultType_functionTypeAlias_invariant_legacy() async {
     var library = await checkLibrary(r'''
 typedef F<X> = X Function(X);
@@ -1901,6 +1873,84 @@
 ''');
   }
 
+  test_class_typeParameters_defaultType_typeAlias_interface_contravariant() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A<X> = List<void Function(X)>;
+
+class B<X extends A<X>> {}
+''');
+    checkElementText(
+        library,
+        r'''
+typedef A<contravariant X> = List<void Function(X)>;
+notSimplyBounded class B<covariant X extends List<void Function(X)> = List<void Function(Never)>> {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_class_typeParameters_defaultType_typeAlias_interface_covariant() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A<X> = Map<X, int>;
+
+class B<X extends A<X>> {}
+''');
+    checkElementText(
+        library,
+        r'''
+typedef A<covariant X> = Map<X, int>;
+notSimplyBounded class B<covariant X extends Map<X, int> = Map<dynamic, int>> {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_class_typeParameters_variance_contravariant() async {
+    var library = await checkLibrary('class C<in T> {}');
+    checkElementText(
+        library,
+        r'''
+class C<contravariant T> {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_class_typeParameters_variance_covariant() async {
+    var library = await checkLibrary('class C<out T> {}');
+    checkElementText(
+        library,
+        r'''
+class C<covariant T> {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_class_typeParameters_variance_invariant() async {
+    var library = await checkLibrary('class C<inout T> {}');
+    checkElementText(
+        library,
+        r'''
+class C<invariant T> {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_class_typeParameters_variance_multiple() async {
+    var library = await checkLibrary('class C<inout T, in U, out V> {}');
+    checkElementText(
+        library,
+        r'''
+class C<invariant T, contravariant U, covariant V> {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
   test_classes() async {
     var library = await checkLibrary('class C {} class D {}');
     checkElementText(library, r'''
@@ -7314,7 +7364,7 @@
 ''');
     var unit = library.definingCompilationUnit;
 
-    var F = unit.functionTypeAliases[0];
+    var F = unit.typeAliases[0];
     expect(F.name, 'F');
 
     var T = F.typeParameters[0];
@@ -7337,11 +7387,11 @@
     var unit = library.definingCompilationUnit;
     var type = unit.topLevelVariables[0].type as FunctionType;
 
-    expect(type.aliasElement, same(unit.functionTypeAliases[0]));
+    expect(type.aliasElement, same(unit.typeAliases[0]));
     _assertTypeStrings(type.aliasArguments, ['int']);
 
     // TODO(scheglov) https://github.com/dart-lang/sdk/issues/44629
-    expect(type.element.enclosingElement, same(unit.functionTypeAliases[0]));
+    expect(type.element.enclosingElement, same(unit.typeAliases[0]));
     _assertTypeStrings(type.typeArguments, ['int']);
   }
 
@@ -7643,7 +7693,7 @@
 ''');
     var unit = library.definingCompilationUnit;
 
-    var F = unit.functionTypeAliases[0];
+    var F = unit.typeAliases[0];
     expect(F.name, 'F');
 
     var T = F.typeParameters[0];
@@ -7671,151 +7721,6 @@
 ''');
   }
 
-  test_genericTypeAlias_typeParameters_variance_contravariant() async {
-    var library = await checkLibrary(r'''
-typedef F<T> = void Function(T);
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F<contravariant T> = void Function(T );
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_contravariant2() async {
-    var library = await checkLibrary(r'''
-typedef F1<T> = void Function(T);
-typedef F2<T> = F1<T> Function();
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F1<contravariant T> = void Function(T );
-typedef F2<contravariant T> = void Function(T) Function();
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_covariant() async {
-    var library = await checkLibrary(r'''
-typedef F<T> = T Function();
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F<covariant T> = T Function();
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_covariant2() async {
-    var library = await checkLibrary(r'''
-typedef F<T> = List<T> Function();
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F<covariant T> = List<T> Function();
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_covariant3() async {
-    var library = await checkLibrary(r'''
-typedef F1<T> = T Function();
-typedef F2<T> = F1<T> Function();
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F1<covariant T> = T Function();
-typedef F2<covariant T> = T Function() Function();
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_covariant4() async {
-    var library = await checkLibrary(r'''
-typedef F1<T> = void Function(T);
-typedef F2<T> = void Function(F1<T>);
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F1<contravariant T> = void Function(T );
-typedef F2<covariant T> = void Function(void Function(T) );
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_invalid() async {
-    var library = await checkLibrary(r'''
-class A {}
-typedef F<T> = void Function(A<int>);
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F<unrelated T> = void Function(A );
-class A {
-}
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_invalid2() async {
-    var library = await checkLibrary(r'''
-typedef F = void Function();
-typedef G<T> = void Function(F<int>);
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F = void Function();
-typedef G<unrelated T> = void Function(void Function() );
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_invariant() async {
-    var library = await checkLibrary(r'''
-typedef F<T> = T Function(T);
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F<invariant T> = T Function(T );
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_invariant2() async {
-    var library = await checkLibrary(r'''
-typedef F1<T> = T Function();
-typedef F2<T> = F1<T> Function(T);
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F1<covariant T> = T Function();
-typedef F2<invariant T> = T Function() Function(T );
-''',
-        withTypeParameterVariance: true);
-  }
-
-  test_genericTypeAlias_typeParameters_variance_unrelated() async {
-    var library = await checkLibrary(r'''
-typedef F<T> = void Function(int);
-''');
-    checkElementText(
-        library,
-        r'''
-typedef F<unrelated T> = void Function(int );
-''',
-        withTypeParameterVariance: true);
-  }
-
   test_getter_documented() async {
     var library = await checkLibrary('''
 // Extra comment so doc comment offset != 0
@@ -10765,7 +10670,7 @@
 ''');
   }
 
-  test_mixin_type_parameters_variance_contravariant() async {
+  test_mixin_typeParameters_variance_contravariant() async {
     var library = await checkLibrary('mixin M<in T> {}');
     checkElementText(
         library,
@@ -10776,7 +10681,7 @@
         withTypeParameterVariance: true);
   }
 
-  test_mixin_type_parameters_variance_covariant() async {
+  test_mixin_typeParameters_variance_covariant() async {
     var library = await checkLibrary('mixin M<out T> {}');
     checkElementText(
         library,
@@ -10787,7 +10692,7 @@
         withTypeParameterVariance: true);
   }
 
-  test_mixin_type_parameters_variance_invariant() async {
+  test_mixin_typeParameters_variance_invariant() async {
     var library = await checkLibrary('mixin M<inout T> {}');
     checkElementText(
         library,
@@ -10798,7 +10703,7 @@
         withTypeParameterVariance: true);
   }
 
-  test_mixin_type_parameters_variance_multiple() async {
+  test_mixin_typeParameters_variance_multiple() async {
     var library = await checkLibrary('mixin M<inout T, in U, out V> {}');
     checkElementText(
         library,
@@ -10954,7 +10859,7 @@
 ''');
   }
 
-  test_new_typedef_notSimplyBounded_functionType_returnType() async {
+  test_new_typedef_function_notSimplyBounded_functionType_returnType() async {
     var library = await checkLibrary('''
 typedef F = G Function();
 typedef G = F Function();
@@ -10965,7 +10870,7 @@
 ''');
   }
 
-  test_new_typedef_notSimplyBounded_functionType_returnType_viaInterfaceType() async {
+  test_new_typedef_function_notSimplyBounded_functionType_returnType_viaInterfaceType() async {
     var library = await checkLibrary('''
 typedef F = List<F> Function();
 ''');
@@ -10974,7 +10879,7 @@
 ''');
   }
 
-  test_new_typedef_notSimplyBounded_self() async {
+  test_new_typedef_function_notSimplyBounded_self() async {
     var library = await checkLibrary('''
 typedef F<T extends F> = void Function();
 ''');
@@ -10983,7 +10888,7 @@
 ''');
   }
 
-  test_new_typedef_notSimplyBounded_simple_no_bounds() async {
+  test_new_typedef_function_notSimplyBounded_simple_no_bounds() async {
     var library = await checkLibrary('''
 typedef F<T> = void Function();
 ''');
@@ -10992,7 +10897,7 @@
 ''');
   }
 
-  test_new_typedef_notSimplyBounded_simple_non_generic() async {
+  test_new_typedef_function_notSimplyBounded_simple_non_generic() async {
     var library = await checkLibrary('''
 typedef F = void Function();
 ''');
@@ -11001,6 +10906,26 @@
 ''');
   }
 
+  test_new_typedef_nonFunction_notSimplyBounded_self() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary('''
+typedef F<T extends F> = List<int>;
+''');
+    checkElementText(library, r'''
+notSimplyBounded typedef F<T extends dynamic> = List<int>;
+''');
+  }
+
+  test_new_typedef_nonFunction_notSimplyBounded_viaInterfaceType() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary('''
+typedef F = List<F>;
+''');
+    checkElementText(library, r'''
+notSimplyBounded typedef F = List<dynamic>;
+''');
+  }
+
   test_old_typedef_notSimplyBounded_self() async {
     var library = await checkLibrary('''
 typedef void F<T extends F>();
@@ -12209,6 +12134,207 @@
 ''');
   }
 
+  test_typeAlias_typeParameters_variance_function_contravariant() async {
+    var library = await checkLibrary(r'''
+typedef F<T> = void Function(T);
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F<contravariant T> = void Function(T );
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_contravariant2() async {
+    var library = await checkLibrary(r'''
+typedef F1<T> = void Function(T);
+typedef F2<T> = F1<T> Function();
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F1<contravariant T> = void Function(T );
+typedef F2<contravariant T> = void Function(T) Function();
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_covariant() async {
+    var library = await checkLibrary(r'''
+typedef F<T> = T Function();
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F<covariant T> = T Function();
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_covariant2() async {
+    var library = await checkLibrary(r'''
+typedef F<T> = List<T> Function();
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F<covariant T> = List<T> Function();
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_covariant3() async {
+    var library = await checkLibrary(r'''
+typedef F1<T> = T Function();
+typedef F2<T> = F1<T> Function();
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F1<covariant T> = T Function();
+typedef F2<covariant T> = T Function() Function();
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_covariant4() async {
+    var library = await checkLibrary(r'''
+typedef F1<T> = void Function(T);
+typedef F2<T> = void Function(F1<T>);
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F1<contravariant T> = void Function(T );
+typedef F2<covariant T> = void Function(void Function(T) );
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_invalid() async {
+    var library = await checkLibrary(r'''
+class A {}
+typedef F<T> = void Function(A<int>);
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F<unrelated T> = void Function(A );
+class A {
+}
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_invalid2() async {
+    var library = await checkLibrary(r'''
+typedef F = void Function();
+typedef G<T> = void Function(F<int>);
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F = void Function();
+typedef G<unrelated T> = void Function(void Function() );
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_invariant() async {
+    var library = await checkLibrary(r'''
+typedef F<T> = T Function(T);
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F<invariant T> = T Function(T );
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_invariant2() async {
+    var library = await checkLibrary(r'''
+typedef F1<T> = T Function();
+typedef F2<T> = F1<T> Function(T);
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F1<covariant T> = T Function();
+typedef F2<invariant T> = T Function() Function(T );
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_function_unrelated() async {
+    var library = await checkLibrary(r'''
+typedef F<T> = void Function(int);
+''');
+    checkElementText(
+        library,
+        r'''
+typedef F<unrelated T> = void Function(int );
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_interface_contravariant() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A<T> = List<void Function(T)>;
+''');
+    checkElementText(
+        library,
+        r'''
+typedef A<contravariant T> = List<void Function(T)>;
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_interface_contravariant2() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A<T> = void Function(T);
+typedef B<T> = List<A<T>>;
+''');
+    checkElementText(
+        library,
+        r'''
+typedef A<contravariant T> = void Function(T );
+typedef B<contravariant T> = List<void Function(T)>;
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_interface_covariant() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A<T> = List<T>;
+''');
+    checkElementText(
+        library,
+        r'''
+typedef A<covariant T> = List<T>;
+''',
+        withTypeParameterVariance: true);
+  }
+
+  test_typeAlias_typeParameters_variance_interface_covariant2() async {
+    featureSet = FeatureSets.nonFunctionTypeAliases;
+    var library = await checkLibrary(r'''
+typedef A<T> = Map<int, T>;
+typedef B<T> = List<A<T>>;
+''');
+    checkElementText(
+        library,
+        r'''
+typedef A<covariant T> = Map<int, T>;
+typedef B<covariant T> = List<Map<int, T>>;
+''',
+        withTypeParameterVariance: true);
+  }
+
   test_typedef_documented() async {
     var library = await checkLibrary('''
 // Extra comment so doc comment offset != 0
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index b182fa7..7e41586 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../utils.dart';
 import '../../dart/resolution/context_collection_resolution.dart';
 
 void main() {
@@ -20,8 +18,6 @@
 
 @reflectiveTest
 class InferredTypeTest extends PubPackageResolutionTest {
-  CompilationUnit get _resultUnit => result.unit;
-
   CompilationUnitElement get _resultUnitElement {
     return result.unit.declaredElement;
   }
@@ -89,7 +85,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 241, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Future<num> Function()');
   }
 
@@ -112,7 +108,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 192, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Future<num> Function()');
   }
 
@@ -135,7 +131,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 215, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Future<num> Function()');
   }
 
@@ -155,7 +151,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 122, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Stream<num> Function()');
   }
 
@@ -183,7 +179,7 @@
       error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 62, 1),
     ]);
 
-    var g = findLocalVariable(_resultUnit, 'g');
+    var g = findElement.localVar('g');
     _assertTypeStr(g.type, 'String Function()');
   }
 
@@ -210,7 +206,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 105, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Future<Null> Function()');
   }
 
@@ -228,7 +224,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 105, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Stream<Null> Function()');
   }
 
@@ -251,7 +247,7 @@
       error(CompileTimeErrorCode.INVALID_CAST_LITERAL, 126, 7),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Null Function(Object)');
   }
 
@@ -269,7 +265,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 102, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Iterable<Null> Function()');
   }
 
@@ -306,7 +302,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'double Function(int) Function()');
   }
 
@@ -321,7 +317,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 67, 1),
     ]);
 
-    var y = findLocalVariable(_resultUnit, 'y');
+    var y = findElement.localVar('y');
     _assertTypeStr(y.type, 'Iterable<Null>');
   }
 
@@ -340,7 +336,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 110, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Iterable<num> Function()');
   }
 
@@ -473,11 +469,10 @@
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 349, 7),
     ]);
 
-    _assertTypeStr(findLocalVariable(_resultUnit, 'x').type, 'C<int>');
-    _assertTypeStr(findLocalVariable(_resultUnit, 'c_int').type, 'C<int>');
-    _assertTypeStr(findLocalVariable(_resultUnit, 'c_num').type, 'C<num>');
-    _assertTypeStr(
-        findLocalVariable(_resultUnit, 'c_dynamic').type, 'C<dynamic>');
+    _assertTypeStr(findElement.localVar('x').type, 'C<int>');
+    _assertTypeStr(findElement.localVar('c_int').type, 'C<int>');
+    _assertTypeStr(findElement.localVar('c_num').type, 'C<num>');
+    _assertTypeStr(findElement.localVar('c_dynamic').type, 'C<dynamic>');
   }
 
   test_constructors_inferFromArguments_const() async {
@@ -494,7 +489,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 63, 1),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'C<int>');
   }
 
@@ -561,7 +556,7 @@
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 149, 7),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'C<int>');
   }
 
@@ -592,7 +587,7 @@
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 95, 7),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'C<int>');
   }
 
@@ -618,7 +613,7 @@
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 156, 7),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'C<int>');
   }
 
@@ -639,7 +634,7 @@
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 123, 7),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'C<int>');
   }
 
@@ -665,7 +660,7 @@
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 183, 7),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'C<int>');
   }
 
@@ -692,7 +687,7 @@
       error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS, 39, 2),
     ]);
 
-    var a = findLocalVariable(_resultUnit, 'a');
+    var a = findElement.localVar('a');
     _assertTypeStr(a.type, 'A<dynamic>');
   }
 
@@ -2326,7 +2321,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 118, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<int> Function(num)');
   }
 
@@ -2813,7 +2808,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 68, 1),
     ]);
 
-    var y = findLocalVariable(_resultUnit, 'y');
+    var y = findElement.localVar('y');
     _assertTypeStr(y.type, 'double');
   }
 
@@ -2829,7 +2824,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 59, 1),
     ]);
 
-    var y = findLocalVariable(_resultUnit, 'y');
+    var y = findElement.localVar('y');
     _assertTypeStr(y.type, 'double');
   }
 
@@ -2845,7 +2840,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 69, 1),
     ]);
 
-    var y = findLocalVariable(_resultUnit, 'y');
+    var y = findElement.localVar('y');
     _assertTypeStr(y.type, 'double');
   }
 
@@ -2861,7 +2856,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 47, 1),
     ]);
 
-    var y = findLocalVariable(_resultUnit, 'y');
+    var y = findElement.localVar('y');
     _assertTypeStr(y.type, 'int');
   }
 
@@ -2930,27 +2925,25 @@
           contextMessages: [message(testFilePath, 211, 2)]),
     ]);
 
-    _assertTypeStr(findLocalFunction(_resultUnit, 'f0').type, 'int Function()');
-    _assertTypeStr(
-        findLocalFunction(_resultUnit, 'f1').type, 'Future<int> Function()');
+    void assertLocalFunctionType(String name, String expected) {
+      var type = findElement.localFunction(name).type;
+      _assertTypeStr(type, expected);
+    }
 
-    _assertTypeStr(findLocalFunction(_resultUnit, 'f2').type, 'int Function()');
-    _assertTypeStr(
-        findLocalFunction(_resultUnit, 'f3').type, 'Future<int> Function()');
-    _assertTypeStr(
-        findLocalFunction(_resultUnit, 'f4').type, 'Iterable<int> Function()');
-    _assertTypeStr(
-        findLocalFunction(_resultUnit, 'f5').type, 'Stream<int> Function()');
+    assertLocalFunctionType('f0', 'int Function()');
+    assertLocalFunctionType('f1', 'Future<int> Function()');
 
-    _assertTypeStr(findLocalFunction(_resultUnit, 'f6').type, 'num Function()');
+    assertLocalFunctionType('f2', 'int Function()');
+    assertLocalFunctionType('f3', 'Future<int> Function()');
+    assertLocalFunctionType('f4', 'Iterable<int> Function()');
+    assertLocalFunctionType('f5', 'Stream<int> Function()');
+
+    assertLocalFunctionType('f6', 'num Function()');
 
     // Recursive cases: these infer in declaration order.
-    _assertTypeStr(
-        findLocalFunction(_resultUnit, 'f7').type, 'dynamic Function()');
-    _assertTypeStr(
-        findLocalFunction(_resultUnit, 'f8').type, 'dynamic Function()');
-    _assertTypeStr(
-        findLocalFunction(_resultUnit, 'f9').type, 'Stream<int> Function()');
+    assertLocalFunctionType('f7', 'dynamic Function()');
+    assertLocalFunctionType('f8', 'dynamic Function()');
+    assertLocalFunctionType('f9', 'Stream<int> Function()');
   }
 
   test_inferParameterType_setter_fromField() async {
@@ -3032,7 +3025,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var f = findLocalVariable(_resultUnit, 'f');
+    var f = findElement.localVar('f');
     _assertTypeStr(f.type, 'Null Function()');
   }
 
@@ -3089,7 +3082,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 72, 1),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     expect(x.name, 'x');
     _assertTypeStr(x.type, 'bool');
   }
@@ -3108,7 +3101,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 105, 1),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     expect(x.name, 'x');
     _assertTypeStr(x.type, 'bool');
   }
@@ -3912,7 +3905,7 @@
       error(CompileTimeErrorCode.INVALID_CAST_LITERAL, 36, 2),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'List<Null>');
   }
 
@@ -3991,7 +3984,7 @@
       error(CompileTimeErrorCode.INVALID_CAST_LITERAL, 45, 3),
     ]);
 
-    var x = findLocalVariable(_resultUnit, 'x');
+    var x = findElement.localVar('x');
     _assertTypeStr(x.type, 'Map<Null, Null>');
   }
 
@@ -4086,7 +4079,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 36, 1),
     ]);
 
-    var y = findLocalVariable(_resultUnit, 'y');
+    var y = findElement.localVar('y');
     _assertTypeStr(y.type, 'List<num>');
   }
 
@@ -4297,7 +4290,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     expect(v.name, 'v');
     _assertTypeStr(v.type, 'double');
   }
@@ -4341,7 +4334,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 42, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     expect(v.name, 'v');
     _assertTypeStr(v.type, 'C<int>');
   }
@@ -4435,7 +4428,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<int>');
   }
 
@@ -4452,7 +4445,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<int>');
   }
 
@@ -4466,7 +4459,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'double');
   }
 
@@ -4480,7 +4473,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'double');
   }
 
@@ -4493,7 +4486,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<dynamic>');
   }
 
@@ -4507,7 +4500,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 32, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<int Function()>');
   }
 
@@ -4523,7 +4516,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<int Function()>');
   }
 
@@ -4536,7 +4529,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'Map<int, dynamic>');
   }
 
@@ -4550,7 +4543,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 32, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'Map<int, int Function()>');
   }
 
@@ -4566,7 +4559,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 15, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'Map<int, int Function()>');
   }
 
@@ -4582,7 +4575,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 62, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<dynamic>');
   }
 
@@ -4598,7 +4591,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 62, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<int>');
   }
 
@@ -4617,7 +4610,7 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 62, 1),
     ]);
 
-    var v = findLocalVariable(_resultUnit, 'v');
+    var v = findElement.localVar('v');
     _assertTypeStr(v.type, 'List<int>');
   }
 
diff --git a/pkg/analyzer/test/utils.dart b/pkg/analyzer/test/utils.dart
index 2e00258..64b63f6 100644
--- a/pkg/analyzer/test/utils.dart
+++ b/pkg/analyzer/test/utils.dart
@@ -7,28 +7,8 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/testing/element_search.dart';
 import 'package:test/test.dart';
 
-/// Search the [unit] for the [LocalVariableElement] with the given [name].
-/// Fail if there is not exactly one such variable.
-FunctionElement findLocalFunction(CompilationUnit unit, String name) {
-  List<Element> elements = findElementsByName(unit, name);
-  List<Element> functions = elements.whereType<FunctionElement>().toList();
-  expect(functions, hasLength(1));
-  return functions[0];
-}
-
-/// Search the [unit] for the [LocalVariableElement] with the given [name].
-/// Fail if there is not exactly one such variable.
-LocalVariableElement findLocalVariable(CompilationUnit unit, String name) {
-  List<Element> elements = findElementsByName(unit, name);
-  List<Element> localVariables =
-      elements.whereType<LocalVariableElement>().toList();
-  expect(localVariables, hasLength(1));
-  return localVariables[0];
-}
-
 /// The type of an assertion which asserts properties of [T]s.
 typedef Asserter<T> = void Function(T type);
 
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index a634551..b7c0d5a 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -15,7 +14,6 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
-import 'package:analyzer/src/generated/testing/element_search.dart';
 import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
@@ -95,13 +93,6 @@
     return context.driver;
   }
 
-  Element findElementInUnit(CompilationUnit unit, String name,
-      [ElementKind kind]) {
-    return findElementsByName(unit, name)
-        .where((e) => kind == null || e.kind == kind)
-        .single;
-  }
-
   @override
   File newFile(String path, {String content = ''}) {
     if (_analysisContextCollection != null && !path.endsWith('.dart')) {
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index 03082d7..96d22e0 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -9,6 +9,8 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/test_utilities/find_element.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:test/test.dart';
 
 import 'abstract_context.dart';
@@ -21,16 +23,14 @@
   CompilationUnit testUnit;
   CompilationUnitElement testUnitElement;
   LibraryElement testLibraryElement;
+  FindNode findNode;
+  FindElement findElement;
 
   void addTestSource(String code) {
     testCode = code;
     addSource(testFile, code);
   }
 
-  Element findElement(String name, [ElementKind kind]) {
-    return findChildElement(testUnitElement, name, kind);
-  }
-
   int findEnd(String search) {
     return findOffset(search) + search.length;
   }
@@ -93,7 +93,8 @@
   Future<void> resolveTestUnit(String code) async {
     addTestSource(code);
     var result = await resolveFile(testFile);
-    testUnit = (result).unit;
+    testCode = result.content;
+    testUnit = result.unit;
     if (verifyNoTestUnitErrors) {
       expect(result.errors.where((AnalysisError error) {
         return error.errorCode != HintCode.DEAD_CODE &&
@@ -107,6 +108,8 @@
     }
     testUnitElement = testUnit.declaredElement;
     testLibraryElement = testUnitElement.library;
+    findNode = FindNode(testCode, testUnit);
+    findElement = FindElement(testUnit);
   }
 
   @override
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 5d75ed1..49b70c5 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -15,17 +15,16 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../support/abstract_context.dart';
+import '../support/abstract_single_unit.dart';
 
 void main() {
   defineReflectiveTests(AnalyzerConverterTest);
 }
 
 @reflectiveTest
-class AnalyzerConverterTest extends AbstractContextTest {
+class AnalyzerConverterTest extends AbstractSingleUnitTest {
   AnalyzerConverter converter = AnalyzerConverter();
   analyzer.Source source;
-  String testFile;
 
   /// Assert that the given [pluginError] matches the given [analyzerError].
   void assertError(
@@ -200,14 +199,12 @@
   }
 
   Future<void> test_convertElement_class() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 @deprecated
 abstract class _A {}
 class B<K, V> {}''');
-    var unit = (await resolveFile(testFile))?.unit;
     {
-      var engineElement =
-          findElementInUnit(unit, '_A') as analyzer.ClassElement;
+      var engineElement = findElement.class_('_A');
       // create notification Element
       var element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.CLASS);
@@ -229,7 +226,7 @@
               plugin.Element.FLAG_PRIVATE);
     }
     {
-      var engineElement = findElementInUnit(unit, 'B') as analyzer.ClassElement;
+      var engineElement = findElement.class_('B');
       // create notification Element
       var element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.CLASS);
@@ -240,13 +237,11 @@
   }
 
   Future<void> test_convertElement_constructor() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 class A {
   const A.myConstructor(int a, [String b]);
 }''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'myConstructor') as analyzer.ConstructorElement;
+    var engineElement = findElement.constructor('myConstructor');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.CONSTRUCTOR);
@@ -278,14 +273,12 @@
   }
 
   Future<void> test_convertElement_enum() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = (await resolveFile(testFile))?.unit;
     {
-      var engineElement =
-          findElementInUnit(unit, '_E1') as analyzer.ClassElement;
+      var engineElement = findElement.enum_('_E1');
       expect(engineElement.hasDeprecated, isTrue);
       // create notification Element
       var element = converter.convertElement(engineElement);
@@ -307,8 +300,7 @@
               plugin.Element.FLAG_PRIVATE);
     }
     {
-      var engineElement =
-          findElementInUnit(unit, 'E2') as analyzer.ClassElement;
+      var engineElement = findElement.enum_('E2');
       // create notification Element
       var element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.ENUM);
@@ -319,14 +311,12 @@
   }
 
   Future<void> test_convertElement_enumConstant() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = (await resolveFile(testFile))?.unit;
     {
-      var engineElement =
-          findElementInUnit(unit, 'one') as analyzer.FieldElement;
+      var engineElement = findElement.field('one');
       // create notification Element
       var element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.ENUM_CONSTANT);
@@ -350,8 +340,7 @@
           plugin.Element.FLAG_CONST | plugin.Element.FLAG_STATIC);
     }
     {
-      var engineElement =
-          findElementInUnit(unit, 'three') as analyzer.FieldElement;
+      var engineElement = findElement.field('three');
       // create notification Element
       var element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.ENUM_CONSTANT);
@@ -370,7 +359,7 @@
           plugin.Element.FLAG_CONST | plugin.Element.FLAG_STATIC);
     }
     {
-      var engineElement = unit.declaredElement.enums[1].getField('index');
+      var engineElement = findElement.field('index', of: 'E2');
       // create notification Element
       var element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.FIELD);
@@ -388,7 +377,7 @@
       expect(element.flags, plugin.Element.FLAG_FINAL);
     }
     {
-      var engineElement = unit.declaredElement.enums[1].getField('values');
+      var engineElement = findElement.field('values', of: 'E2');
 
       // create notification Element
       var element = converter.convertElement(engineElement);
@@ -410,13 +399,11 @@
   }
 
   Future<void> test_convertElement_field() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 class A {
   static const myField = 42;
 }''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'myField') as analyzer.FieldElement;
+    var engineElement = findElement.field('myField');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.FIELD);
@@ -436,12 +423,10 @@
   }
 
   Future<void> test_convertElement_functionTypeAlias() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 typedef int F<T>(String x);
 ''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
+    var engineElement = findElement.typeAlias('F');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.FUNCTION_TYPE_ALIAS);
@@ -461,12 +446,10 @@
   }
 
   Future<void> test_convertElement_genericTypeAlias_function() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 typedef F<T> = int Function(String x);
 ''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
+    var engineElement = findElement.typeAlias('F');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.FUNCTION_TYPE_ALIAS);
@@ -486,14 +469,11 @@
   }
 
   Future<void> test_convertElement_getter() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 class A {
-  String get myGetter => 42;
+  int get myGetter => 42;
 }''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'myGetter', analyzer.ElementKind.GETTER)
-            as analyzer.PropertyAccessorElement;
+    var engineElement = findElement.getter('myGetter');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.GETTER);
@@ -501,26 +481,24 @@
     {
       var location = element.location;
       expect(location.file, testFile);
-      expect(location.offset, 23);
+      expect(location.offset, 20);
       expect(location.length, 'myGetter'.length);
       expect(location.startLine, 2);
-      expect(location.startColumn, 14);
+      expect(location.startColumn, 11);
     }
     expect(element.parameters, isNull);
-    expect(element.returnType, 'String');
+    expect(element.returnType, 'int');
     expect(element.flags, 0);
   }
 
   Future<void> test_convertElement_method() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 class A {
   static List<String> myMethod(int a, {String b, int c}) {
     return null;
   }
 }''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'myMethod') as analyzer.MethodElement;
+    var engineElement = findElement.method('myMethod');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.METHOD);
@@ -539,14 +517,11 @@
   }
 
   Future<void> test_convertElement_setter() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 class A {
   set mySetter(String x) {}
 }''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'mySetter', analyzer.ElementKind.SETTER)
-            as analyzer.PropertyAccessorElement;
+    var engineElement = findElement.setter('mySetter');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.SETTER);
@@ -615,16 +590,14 @@
   }
 
   Future<void> test_fromElement_LABEL() async {
-    addSource(testFile, '''
+    await resolveTestUnit('''
 main() {
 myLabel:
   while (true) {
     break myLabel;
   }
 }''');
-    var unit = (await resolveFile(testFile))?.unit;
-    var engineElement =
-        findElementInUnit(unit, 'myLabel') as analyzer.LabelElement;
+    var engineElement = findElement.label('myLabel');
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.LABEL);
diff --git a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
index a2ac201..e157ab5 100644
--- a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
@@ -173,7 +173,7 @@
 
   Future<void> test_elementName() async {
     await resolveTestUnit('class ABC {}');
-    var element = findElement('ABC');
+    var element = findElement.class_('ABC');
     expect(range.elementName(element), SourceRange(6, 3));
   }
 
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 49923c1..547be62 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -63,6 +63,8 @@
   @override
   final String name;
 
+  Map<String, ir.Class> _nativeClasses;
+
   Dart2jsTarget(this.name, this.flags);
 
   @override
@@ -124,9 +126,12 @@
       ReferenceFromIndex referenceFromIndex,
       {void logger(String msg),
       ChangedStructureNotifier changedStructureNotifier}) {
+    _nativeClasses ??= JsInteropChecks.getNativeClasses(component);
     for (var library in libraries) {
-      JsInteropChecks(coreTypes,
-              diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>)
+      JsInteropChecks(
+              coreTypes,
+              diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>,
+              _nativeClasses)
           .visitLibrary(library);
     }
     lowering.transformLibraries(
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index c657089..80420e2 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 1.7.1
+- Fixed issue where DartDevelopmentServiceException could have a null message.
+
 # 1.7.0
 - Added `package:dds/vm_service_extensions.dart`, which adds DDS functionality to
   `package:vm_service` when imported.
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
index 8fdc7a8..137cd20 100644
--- a/pkg/dds/lib/src/dds_impl.dart
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -136,10 +136,12 @@
       });
     } on json_rpc.RpcException catch (e) {
       await _server.close(force: true);
+      String message = e.toString();
+      if (e.data != null) {
+        message += ' data: ${e.data}';
+      }
       // _yieldControlToDDS fails if DDS is not the only VM service client.
-      throw DartDevelopmentServiceException.existingDdsInstance(
-        e.data != null ? e.data['details'] : e.toString(),
-      );
+      throw DartDevelopmentServiceException.existingDdsInstance(message);
     }
 
     _uri = tmpUri;
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index 27bf432..a7fff90 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
   A library used to spawn the Dart Developer Service, used to communicate with
   a Dart VM Service instance.
 
-version: 1.7.0
+version: 1.7.1
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
 
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index 87ddd49..363ff0b 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -481,7 +481,8 @@
 
   /// Emits imports and extension methods into [items].
   @protected
-  void emitImportsAndExtensionSymbols(List<js_ast.ModuleItem> items) {
+  void emitImportsAndExtensionSymbols(List<js_ast.ModuleItem> items,
+      {bool forceExtensionSymbols = false}) {
     var modules = <String, List<Library>>{};
 
     for (var import in _imports.keys) {
@@ -525,6 +526,9 @@
           js_ast.PropertyAccess(extensionSymbolsModule, propertyName(name));
       if (isBuildingSdk) {
         value = js.call('# = Symbol(#)', [value, js.string('dartx.$name')]);
+      } else if (forceExtensionSymbols) {
+        value = js.call(
+            '# || (# = Symbol(#))', [value, value, js.string('dartx.$name')]);
       }
       if (!_symbolContainer.canEmit(id)) {
         // Extension symbols marked with noEmit are managed manually.
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 0098e51..9a1b17c 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -35,6 +35,7 @@
 import 'native_types.dart';
 import 'nullable_inference.dart';
 import 'property_model.dart';
+import 'target.dart' show allowedNativeTest;
 import 'type_table.dart';
 
 class ProgramCompiler extends ComputeOnceConstantVisitor<js_ast.Expression>
@@ -251,7 +252,7 @@
     coreTypes ??= CoreTypes(component);
     var types = TypeEnvironment(coreTypes, hierarchy);
     var constants = DevCompilerConstants();
-    var nativeTypes = NativeTypeSet(coreTypes, constants);
+    var nativeTypes = NativeTypeSet(coreTypes, constants, component);
     var jsTypeRep = JSTypeRep(types, hierarchy);
     var staticTypeContext = StatefulStaticTypeContext.stacked(types);
     return ProgramCompiler._(
@@ -411,7 +412,9 @@
     libraries.forEach(_emitExports);
 
     // Declare imports and extension symbols
-    emitImportsAndExtensionSymbols(items);
+    emitImportsAndExtensionSymbols(items,
+        forceExtensionSymbols:
+            libraries.any((l) => allowedNativeTest(l.importUri)));
 
     // Insert a check that runs when loading this module to verify that the null
     // safety mode it was compiled in matches the mode used when compiling the
@@ -2456,7 +2459,12 @@
 
   js_ast.PropertyAccess _emitTopLevelNameNoInterop(NamedNode n,
       {String suffix = ''}) {
-    return js_ast.PropertyAccess(emitLibraryName(getLibrary(n)),
+    // Some native tests use top-level native methods.
+    var isTopLevelNative = n is Member && isNative(n);
+    return js_ast.PropertyAccess(
+        isTopLevelNative
+            ? runtimeCall('global.self')
+            : emitLibraryName(getLibrary(n)),
         _emitTopLevelMemberName(n, suffix: suffix));
   }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/js_interop.dart b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
index ae20b09..13b1f25 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
@@ -45,7 +45,9 @@
 bool isJsMember(Member member) {
   // TODO(vsm): If we ever use external outside the SDK for non-JS interop,
   // we're need to fix this.
-  return !_isLibrary(member.enclosingLibrary, ['dart:*']) && member.isExternal;
+  return !_isLibrary(member.enclosingLibrary, ['dart:*']) &&
+      member.isExternal &&
+      !isNative(member);
 }
 
 bool _annotationIsFromJSLibrary(String expectedName, Expression value) {
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index fbc740a..64eb246 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -353,3 +353,28 @@
       t is TypedefType ||
       t is VoidType;
 }
+
+/// Whether [member] is declared native, as in:
+///
+///    void foo() native;
+///
+/// This syntax is only allowed in sdk libraries and native tests.
+bool isNative(Member member) =>
+    // The CFE represents `native` members with the `external` bit and with an
+    // internal @ExternalName annotation as a marker.
+    member.isExternal && member.annotations.any(_isNativeMarkerAnnotation);
+
+bool _isNativeMarkerAnnotation(Expression annotation) {
+  if (annotation is ConstantExpression) {
+    var constant = annotation.constant;
+    if (constant is InstanceConstant &&
+        constant.classNode.name == 'ExternalName' &&
+        _isDartInternal(constant.classNode.enclosingLibrary.importUri)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+bool _isDartInternal(Uri uri) =>
+    uri.scheme == 'dart' && uri.path == '_internal';
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index 2aa3164..dd7bdc8 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/kernel.dart';
 import 'constants.dart';
 import 'kernel_helpers.dart';
+import 'target.dart' show allowedNativeTest;
 
 /// Contains information about native JS types (those types provided by the
 /// implementation) that are also provided by the Dart SDK.
@@ -39,7 +40,7 @@
   final _nativeTypes = HashSet<Class>.identity();
   final _pendingLibraries = HashSet<Library>.identity();
 
-  NativeTypeSet(this.coreTypes, this.constants) {
+  NativeTypeSet(this.coreTypes, this.constants, Component component) {
     // First, core types:
     // TODO(vsm): If we're analyzing against the main SDK, those
     // types are not explicitly annotated.
@@ -69,6 +70,14 @@
     _addPendingExtensionTypes(sdk.getLibrary('dart:web_audio'));
     _addPendingExtensionTypes(sdk.getLibrary('dart:web_gl'));
     _addPendingExtensionTypes(sdk.getLibrary('dart:web_sql'));
+
+    // For testing purposes only, we add extension types outside the Dart SDK.
+    // These are only allowed for native tests (see allowedNativeTest).
+    for (var library in component.libraries) {
+      if (allowedNativeTest(library.importUri)) {
+        _addExtensionTypes(library);
+      }
+    }
   }
 
   void _addExtensionType(Class c, [bool mustBeNative = false]) {
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index ca82d2e..ecec776 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -30,6 +30,8 @@
 
   WidgetCreatorTracker _widgetTracker;
 
+  Map<String, Class> _nativeClasses;
+
   @override
   bool get enableSuperMixins => true;
 
@@ -116,9 +118,7 @@
   bool _allowedTestLibrary(Uri uri) {
     // Multi-root scheme used by modular test framework.
     if (uri.scheme == 'dev-dart-app') return true;
-
-    var scriptName = uri.path;
-    return scriptName.contains('tests/dartdevc');
+    return allowedNativeTest(uri);
   }
 
   bool _allowedDartLibrary(Uri uri) => uri.scheme == 'dart';
@@ -152,10 +152,13 @@
       ReferenceFromIndex referenceFromIndex,
       {void Function(String msg) logger,
       ChangedStructureNotifier changedStructureNotifier}) {
+    _nativeClasses ??= JsInteropChecks.getNativeClasses(component);
     for (var library in libraries) {
       _CovarianceTransformer(library).transform();
-      JsInteropChecks(coreTypes,
-              diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>)
+      JsInteropChecks(
+              coreTypes,
+              diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>,
+              _nativeClasses)
           .visitLibrary(library);
     }
   }
@@ -444,3 +447,16 @@
     super.visitEqualsCall(node);
   }
 }
+
+List<Pattern> _allowedNativeTestPatterns = [
+  'tests/dartdevc',
+  'tests/dart2js/native',
+  'tests/dart2js_2/native',
+  'tests/dart2js/internal',
+  'tests/dart2js_2/internal',
+];
+
+bool allowedNativeTest(Uri uri) {
+  var path = uri.path;
+  return _allowedNativeTestPatterns.any((pattern) => path.contains(pattern));
+}
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index c275e1e..afaa87e 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -488,6 +488,8 @@
 JsInteropJSClassExtendsDartClass/example: Fail # Web compiler specific
 JsInteropNamedParameters/analyzerCode: Fail # Web compiler specific
 JsInteropNamedParameters/example: Fail # Web compiler specific
+JsInteropNativeClassInAnnotation/analyzerCode: Fail # Web compiler specific
+JsInteropNativeClassInAnnotation/example: Fail # Web compiler specific
 JsInteropNonExternalConstructor/analyzerCode: Fail # Web compiler specific
 JsInteropNonExternalConstructor/example: Fail # Web compiler specific
 JsInteropNonExternalMember/analyzerCode: Fail # Web compiler specific
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 1f25446..390424e 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4671,6 +4671,9 @@
   template: "Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class."
   tip: "Try replacing them with normal or optional parameters."
 
+JsInteropNativeClassInAnnotation:
+  template: "JS interop class '#name' conflicts with natively supported class '#name2' in '#string3'."
+
 JsInteropNonExternalConstructor:
   template: "JS interop classes do not support non-external constructors."
   tip: "Try annotating with `external`."
@@ -4932,4 +4935,4 @@
   exampleAllowMoreCodes: true
   analyzerCode: UNEXPECTED_TOKEN
   script:
-    - "late int x;"
\ No newline at end of file
+    - "late int x;"
diff --git a/pkg/front_end/test/spell_checking_list_messages.txt b/pkg/front_end/test/spell_checking_list_messages.txt
index b0f4e5e..d754653 100644
--- a/pkg/front_end/test/spell_checking_list_messages.txt
+++ b/pkg/front_end/test/spell_checking_list_messages.txt
@@ -41,6 +41,7 @@
 name.stack
 nameokempty
 native('native
+natively
 nativetype
 nnbd
 nosuchmethod
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 763bfee..5b8a4eb 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -56,9 +56,6 @@
   ..addFlag('tree-shake-write-only-fields',
       help: 'Enable tree shaking of fields which are only written in AOT mode.',
       defaultsTo: true)
-  ..addFlag('protobuf-tree-shaker',
-      help: 'Enable protobuf tree shaker transformation in AOT mode.',
-      defaultsTo: false)
   ..addFlag('protobuf-tree-shaker-v2',
       help: 'Enable protobuf tree shaker v2 in AOT mode.', defaultsTo: false)
   ..addFlag('minimal-kernel',
@@ -529,7 +526,6 @@
           useGlobalTypeFlowAnalysis: options['tfa'],
           environmentDefines: environmentDefines,
           enableAsserts: options['enable-asserts'],
-          useProtobufTreeShaker: options['protobuf-tree-shaker'],
           useProtobufTreeShakerV2: options['protobuf-tree-shaker-v2'],
           minimalKernel: options['minimal-kernel'],
           treeShakeWriteOnlyFields: options['tree-shake-write-only-fields'],
diff --git a/pkg/vm/bin/protobuf_aware_treeshaker.dart b/pkg/vm/bin/protobuf_aware_treeshaker.dart
index d1fa2d1..69aa466 100644
--- a/pkg/vm/bin/protobuf_aware_treeshaker.dart
+++ b/pkg/vm/bin/protobuf_aware_treeshaker.dart
@@ -30,13 +30,14 @@
 import 'package:args/args.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:vm/kernel_front_end.dart'
     show runGlobalTransformations, ErrorDetector;
 import 'package:kernel/target/targets.dart' show TargetFlags, getTarget;
 import 'package:meta/meta.dart';
 import 'package:vm/target/install.dart' show installAdditionalTargets;
-import 'package:vm/transformations/protobuf_aware_treeshaker/transformer.dart'
-    as treeshaker;
+import 'package:vm/transformations/type_flow/transformer.dart' as globalTypeFlow
+    show transformComponent;
 
 ArgResults parseArgs(List<String> args) {
   ArgParser argParser = ArgParser()
@@ -99,11 +100,6 @@
   final input = argResults.rest[0];
   final output = argResults.rest[1];
 
-  final Map<String, String> environment = Map.fromIterable(
-      argResults['define'].map((x) => x.split('=')),
-      key: (x) => x[0],
-      value: (x) => x[1]);
-
   var bytes = File(input).readAsBytesSync();
   final platformFile = argResults['platform'];
   if (platformFile != null) {
@@ -119,31 +115,19 @@
   if (argResults['aot']) {
     const bool useGlobalTypeFlowAnalysis = true;
     const bool enableAsserts = false;
-    const bool useProtobufAwareTreeShaker = true;
-    const bool useProtobufAwareTreeShakerV2 = false;
+    const bool useProtobufAwareTreeShakerV2 = true;
     final nopErrorDetector = ErrorDetector();
     runGlobalTransformations(
       target,
       component,
       useGlobalTypeFlowAnalysis,
       enableAsserts,
-      useProtobufAwareTreeShaker,
       useProtobufAwareTreeShakerV2,
       nopErrorDetector,
     );
   } else {
-    treeshaker.TransformationInfo info = treeshaker.transformComponent(
-        component, environment, target,
-        collectInfo: argResults['verbose']);
-
-    if (argResults['verbose']) {
-      for (String fieldName in info.removedMessageFields) {
-        print('Removed $fieldName');
-      }
-      for (Class removedClass in info.removedMessageClasses) {
-        print('Removed $removedClass');
-      }
-    }
+    globalTypeFlow.transformComponent(target, CoreTypes(component), component,
+        treeShakeProtobufs: true, treeShakeSignatures: false);
   }
 
   if (argResults['aot']) {
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index eb8f045..bd60735 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -55,8 +55,6 @@
     show transformComponent;
 import 'transformations/no_dynamic_invocations_annotator.dart'
     as no_dynamic_invocations_annotator show transformComponent;
-import 'transformations/protobuf_aware_treeshaker/transformer.dart'
-    as protobuf_tree_shaker;
 import 'transformations/type_flow/transformer.dart' as globalTypeFlow
     show transformComponent;
 import 'transformations/obfuscation_prohibitions_annotator.dart'
@@ -104,9 +102,6 @@
   args.addFlag('tree-shake-write-only-fields',
       help: 'Enable tree shaking of fields which are only written in AOT mode.',
       defaultsTo: true);
-  args.addFlag('protobuf-tree-shaker',
-      help: 'Enable protobuf tree shaker transformation in AOT mode.',
-      defaultsTo: false);
   args.addFlag('protobuf-tree-shaker-v2',
       help: 'Enable protobuf tree shaker v2 in AOT mode.', defaultsTo: false);
   args.addMultiOption('define',
@@ -174,7 +169,6 @@
   final bool embedSources = options['embed-sources'];
   final bool enableAsserts = options['enable-asserts'];
   final bool nullSafety = options['sound-null-safety'];
-  final bool useProtobufTreeShaker = options['protobuf-tree-shaker'];
   final bool useProtobufTreeShakerV2 = options['protobuf-tree-shaker-v2'];
   final bool splitOutputByPackages = options['split-output-by-packages'];
   final String manifestFilename = options['manifest'];
@@ -255,7 +249,6 @@
       useGlobalTypeFlowAnalysis: tfa,
       environmentDefines: environmentDefines,
       enableAsserts: enableAsserts,
-      useProtobufTreeShaker: useProtobufTreeShaker,
       useProtobufTreeShakerV2: useProtobufTreeShakerV2,
       minimalKernel: minimalKernel,
       treeShakeWriteOnlyFields: treeShakeWriteOnlyFields,
@@ -322,7 +315,6 @@
     bool useGlobalTypeFlowAnalysis: false,
     Map<String, String> environmentDefines,
     bool enableAsserts: true,
-    bool useProtobufTreeShaker: false,
     bool useProtobufTreeShakerV2: false,
     bool minimalKernel: false,
     bool treeShakeWriteOnlyFields: false,
@@ -356,7 +348,6 @@
         component,
         useGlobalTypeFlowAnalysis,
         enableAsserts,
-        useProtobufTreeShaker,
         useProtobufTreeShakerV2,
         errorDetector,
         minimalKernel: minimalKernel,
@@ -414,7 +405,6 @@
     Component component,
     bool useGlobalTypeFlowAnalysis,
     bool enableAsserts,
-    bool useProtobufTreeShaker,
     bool useProtobufTreeShakerV2,
     ErrorDetector errorDetector,
     {bool minimalKernel: false,
@@ -435,10 +425,6 @@
   // before type flow analysis so TFA won't take unreachable code into account.
   unreachable_code_elimination.transformComponent(component, enableAsserts);
 
-  if (useProtobufTreeShaker && useProtobufTreeShakerV2) {
-    throw 'Cannot use both versions of protobuf tree shaker';
-  }
-
   if (useGlobalTypeFlowAnalysis) {
     globalTypeFlow.transformComponent(target, coreTypes, component,
         treeShakeSignatures: !minimalKernel,
@@ -449,19 +435,6 @@
     no_dynamic_invocations_annotator.transformComponent(component);
   }
 
-  if (useProtobufTreeShaker) {
-    if (!useGlobalTypeFlowAnalysis) {
-      throw 'Protobuf tree shaker requires type flow analysis (--tfa)';
-    }
-
-    protobuf_tree_shaker.removeUnusedProtoReferences(
-        component, coreTypes, null);
-
-    globalTypeFlow.transformComponent(target, coreTypes, component,
-        treeShakeSignatures: !minimalKernel,
-        treeShakeWriteOnlyFields: treeShakeWriteOnlyFields);
-  }
-
   // TODO(35069): avoid recomputing CSA by reading it from the platform files.
   void ignoreAmbiguousSupertypes(cls, a, b) {}
   final hierarchy = new ClassHierarchy(component, coreTypes,
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
deleted file mode 100644
index e216685..0000000
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ /dev/null
@@ -1,341 +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.
-
-import 'package:kernel/kernel.dart';
-import 'package:kernel/target/targets.dart';
-import 'package:kernel/core_types.dart';
-import 'package:meta/meta.dart';
-import 'package:vm/transformations/type_flow/transformer.dart' as globalTypeFlow
-    show transformComponent;
-import 'package:vm/transformations/no_dynamic_invocations_annotator.dart'
-    show Selector;
-
-class TransformationInfo {
-  final List<String> removedMessageFields = <String>[];
-  final List<Class> removedMessageClasses = <Class>[];
-}
-
-TransformationInfo transformComponent(
-    Component component, Map<String, String> environment, Target target,
-    {@required bool collectInfo}) {
-  final coreTypes = new CoreTypes(component);
-
-  TransformationInfo info = collectInfo ? TransformationInfo() : null;
-
-  _treeshakeProtos(target, component, coreTypes, info);
-  return info;
-}
-
-void _treeshakeProtos(Target target, Component component, CoreTypes coreTypes,
-    TransformationInfo info) {
-  globalTypeFlow.transformComponent(target, coreTypes, component,
-      treeShakeSignatures: false);
-
-  final collector = removeUnusedProtoReferences(component, coreTypes, info);
-  if (collector != null) {
-    globalTypeFlow.transformComponent(target, coreTypes, component,
-        treeShakeSignatures: false);
-    if (info != null) {
-      for (Class gmSubclass in collector.gmSubclasses) {
-        if (!gmSubclass.enclosingLibrary.classes.contains(gmSubclass)) {
-          info.removedMessageClasses.add(gmSubclass);
-        }
-      }
-    }
-  }
-
-  // Remove metadata added by the typeflow analysis (even if the code doesn't
-  // use any protos).
-  component.metadata.clear();
-}
-
-/// Called by the signature shaker to exclude the positional parameters of
-/// certain members whose first few parameters are depended upon by the
-/// protobuf-aware tree shaker.
-bool excludePositionalParametersFromSignatureShaking(Member member) {
-  return member.enclosingClass?.name == 'BuilderInfo' &&
-      member.enclosingLibrary.importUri ==
-          Uri.parse('package:protobuf/protobuf.dart') &&
-      _UnusedFieldMetadataPruner.fieldAddingMethods.contains(member.name.name);
-}
-
-InfoCollector removeUnusedProtoReferences(
-    Component component, CoreTypes coreTypes, TransformationInfo info) {
-  final protobufUri = Uri.parse('package:protobuf/protobuf.dart');
-  final protobufLibs =
-      component.libraries.where((lib) => lib.importUri == protobufUri);
-  if (protobufLibs.isEmpty) {
-    return null;
-  }
-  final protobufLib = protobufLibs.single;
-
-  final gmClass = protobufLib.classes
-      .where((klass) => klass.name == 'GeneratedMessage')
-      .single;
-  final tagNumberClass =
-      protobufLib.classes.where((klass) => klass.name == 'TagNumber').single;
-
-  final collector = InfoCollector(gmClass);
-
-  final biClass =
-      protobufLib.classes.where((klass) => klass.name == 'BuilderInfo').single;
-  final addMethod =
-      biClass.members.singleWhere((Member member) => member.name.text == 'add');
-
-  component.accept(collector);
-
-  _UnusedFieldMetadataPruner(tagNumberClass, biClass, addMethod,
-          collector.dynamicSelectors, coreTypes, info)
-      .removeMetadataForUnusedFields(
-    collector.gmSubclasses,
-    collector.gmSubclassesInvokedMethods,
-    coreTypes,
-    info,
-  );
-
-  return collector;
-}
-
-/// For protobuf fields which are not accessed, prune away its metadata.
-class _UnusedFieldMetadataPruner extends TreeVisitor<void> {
-  final Class tagNumberClass;
-  final Reference tagNumberField;
-  // All of those methods have the dart field name as second positional
-  // parameter.
-  // Method names are defined in:
-  // https://github.com/dart-lang/protobuf/blob/master/protobuf/lib/src/protobuf/builder_info.dart
-  // The code is generated by:
-  // https://github.com/dart-lang/protobuf/blob/master/protoc_plugin/lib/protobuf_field.dart.
-  static final fieldAddingMethods = Set<String>.from(const <String>[
-    'a',
-    'aOM',
-    'aOS',
-    'aQM',
-    'pPS',
-    'aQS',
-    'aInt64',
-    'aOB',
-    'e',
-    'p',
-    'pc',
-    'm',
-  ]);
-
-  final Class builderInfoClass;
-  Class visitedClass;
-  final names = Set<String>();
-  final usedTagNumbers = Set<int>();
-
-  final dynamicNames = Set<String>();
-  final CoreTypes coreTypes;
-  final TransformationInfo info;
-  final Member addMethod;
-
-  _UnusedFieldMetadataPruner(this.tagNumberClass, this.builderInfoClass,
-      this.addMethod, Set<Selector> dynamicSelectors, this.coreTypes, this.info)
-      : tagNumberField = tagNumberClass.fields
-            .firstWhere((f) => f.name.text == 'tagNumber')
-            .getterReference {
-    dynamicNames.addAll(dynamicSelectors.map((sel) => sel.target.text));
-  }
-
-  /// If a proto message field is never accessed (neither read nor written to),
-  /// remove its corresponding metadata in the construction of the Message._i
-  /// field (i.e. the BuilderInfo metadata).
-  void removeMetadataForUnusedFields(
-      Set<Class> gmSubclasses,
-      Map<Class, Set<Selector>> invokedMethods,
-      CoreTypes coreTypes,
-      TransformationInfo info) {
-    for (final klass in gmSubclasses) {
-      final selectors = invokedMethods[klass] ?? Set<Selector>();
-      final builderInfoFields = klass.fields.where((f) => f.name.text == '_i');
-      if (builderInfoFields.isEmpty) {
-        continue;
-      }
-      final builderInfoField = builderInfoFields.single;
-      _pruneBuilderInfoField(builderInfoField, selectors, klass);
-    }
-  }
-
-  void _pruneBuilderInfoField(
-      Field field, Set<Selector> selectors, Class gmSubclass) {
-    names.clear();
-    names.addAll(selectors.map((sel) => sel.target.text));
-    visitedClass = gmSubclass;
-    _computeUsedTagNumbers(gmSubclass);
-    field.initializer.accept(this);
-  }
-
-  void _computeUsedTagNumbers(Class gmSubclass) {
-    usedTagNumbers.clear();
-    for (final procedure in gmSubclass.procedures) {
-      for (final annotation in procedure.annotations) {
-        if (annotation is ConstantExpression) {
-          final constant = annotation.constant;
-          if (constant is InstanceConstant &&
-              constant.classReference == tagNumberClass.reference) {
-            final name = procedure.name.text;
-            if (dynamicNames.contains(name) || names.contains(name)) {
-              usedTagNumbers.add(
-                  (constant.fieldValues[tagNumberField] as IntConstant).value);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  @override
-  visitBlockExpression(BlockExpression node) {
-    // The BuilderInfo field `_i` is set up with a row of cascaded calls.
-    // ```
-    // static final BuilderInfo _i = BuilderInfo('MessageName')
-    //     ..a(1, 'foo', PbFieldType.OM)
-    //     ..a(2, 'bar', PbFieldType.OM)
-    // ```
-    // Each cascaded call will be represented in kernel as an entry in a
-    // BlockExpression (but starts out in a Let), where each statement in block
-    // is an ExpressionStatement, and where each statement will be a call to a
-    // method of `builderInfo`.
-    // For example:
-    // ```
-    // {protobuf::BuilderInfo::a}<dart.core::int*>(1, "foo", #C10)
-    // ```
-    // The methods enumerated in `fieldAddingMethods` are the ones that set up
-    // fields (other methods do other things).
-    //
-    // First argument is the tag-number of the added field.
-    // Second argument is the field-name.
-    // Further arguments are specific to the method.
-    for (Statement statement in node.body.statements) {
-      if (statement is ExpressionStatement) {
-        _changeCascadeEntry(statement.expression);
-      }
-    }
-    node.body.accept(this);
-  }
-
-  @override
-  visitLet(Let node) {
-    // See comment in visitBlockExpression.
-    node.body.accept(this);
-  }
-
-  String _extractFieldName(Expression expression) {
-    if (expression is StringLiteral) {
-      return expression.value;
-    }
-    if (expression is ConditionalExpression) {
-      return _extractFieldName(expression.otherwise);
-    }
-    throw ArgumentError.value(
-        expression, 'expression', 'Unsupported  expression');
-  }
-
-  void _changeCascadeEntry(Expression initializer) {
-    if (initializer is MethodInvocation &&
-        initializer.interfaceTarget?.enclosingClass == builderInfoClass &&
-        fieldAddingMethods.contains(initializer.name.text)) {
-      final tagNumber =
-          (initializer.arguments.positional[0] as IntLiteral).value;
-      if (!usedTagNumbers.contains(tagNumber)) {
-        if (info != null) {
-          final fieldName =
-              _extractFieldName(initializer.arguments.positional[1]);
-          info.removedMessageFields.add("${visitedClass.name}.$fieldName");
-        }
-
-        // Replace the field metadata method with a dummy call to
-        // `BuilderInfo.add`. This is to preserve the index calculations when
-        // removing a field.
-        // Change the tag-number to 0. Otherwise the decoder will get confused.
-        initializer.interfaceTarget = addMethod;
-        initializer.name = addMethod.name;
-        initializer.arguments.replaceWith(
-          Arguments(
-            <Expression>[
-              IntLiteral(0), // tagNumber
-              NullLiteral(), // name
-              NullLiteral(), // fieldType
-              NullLiteral(), // defaultOrMaker
-              NullLiteral(), // subBuilder
-              NullLiteral(), // valueOf
-              NullLiteral(), // enumValues
-            ],
-            types: <DartType>[const NullType()],
-          ),
-        );
-      }
-    }
-  }
-}
-
-/// Finds all subclasses of [GeneratedMessage] and all methods invoked on them
-/// (potentially in a dynamic call).
-class InfoCollector extends RecursiveVisitor<void> {
-  final dynamicSelectors = Set<Selector>();
-  final Class generatedMessageClass;
-  final gmSubclasses = Set<Class>();
-  final gmSubclassesInvokedMethods = Map<Class, Set<Selector>>();
-
-  InfoCollector(this.generatedMessageClass);
-
-  @override
-  visitClass(Class klass) {
-    if (isGeneratedMethodSubclass(klass)) {
-      gmSubclasses.add(klass);
-    }
-    return super.visitClass(klass);
-  }
-
-  @override
-  visitMethodInvocation(MethodInvocation node) {
-    if (node.interfaceTarget == null) {
-      dynamicSelectors.add(Selector.doInvoke(node.name));
-    }
-
-    final targetClass = node.interfaceTarget?.enclosingClass;
-    if (isGeneratedMethodSubclass(targetClass)) {
-      addInvokedMethod(targetClass, Selector.doInvoke(node.name));
-    }
-    super.visitMethodInvocation(node);
-  }
-
-  @override
-  visitPropertyGet(PropertyGet node) {
-    if (node.interfaceTarget == null) {
-      dynamicSelectors.add(Selector.doGet(node.name));
-    }
-
-    final targetClass = node.interfaceTarget?.enclosingClass;
-    if (isGeneratedMethodSubclass(targetClass)) {
-      addInvokedMethod(targetClass, Selector.doGet(node.name));
-    }
-    super.visitPropertyGet(node);
-  }
-
-  @override
-  visitPropertySet(PropertySet node) {
-    if (node.interfaceTarget == null) {
-      dynamicSelectors.add(Selector.doSet(node.name));
-    }
-
-    final targetClass = node.interfaceTarget?.enclosingClass;
-    if (isGeneratedMethodSubclass(targetClass)) {
-      addInvokedMethod(targetClass, Selector.doSet(node.name));
-    }
-    super.visitPropertySet(node);
-  }
-
-  bool isGeneratedMethodSubclass(Class klass) {
-    return klass?.superclass == generatedMessageClass;
-  }
-
-  void addInvokedMethod(Class klass, Selector selector) {
-    final selectors =
-        gmSubclassesInvokedMethods.putIfAbsent(klass, () => Set<Selector>());
-    selectors.add(selector);
-  }
-}
diff --git a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
index 8be7d86..4adf6c6 100644
--- a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
+++ b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
@@ -10,8 +10,6 @@
 import 'table_selector_assigner.dart';
 import 'types.dart';
 import 'utils.dart';
-import '../protobuf_aware_treeshaker/transformer.dart'
-    show excludePositionalParametersFromSignatureShaking;
 import '../../metadata/procedure_attributes.dart';
 
 /// Transform parameters from optional to required when they are always passed,
@@ -125,11 +123,6 @@
   int callCount = 0;
   bool eligible = true;
 
-  /// Whether positional parameters can be eliminated from this member. Some
-  /// protobuf methods require these parameters to be preserved for the
-  /// protobuf-aware tree shaker to function.
-  bool canEliminatePositional = true;
-
   _ParameterInfo ensurePositional(int i) {
     if (positional.length <= i) {
       assert(positional.length == i);
@@ -178,8 +171,7 @@
   bool get isNeverPassed => passCount == 0;
 
   bool get canBeEliminated =>
-      (!isUsed || (isNeverPassed || isConstant && !isChecked) && !isWritten) &&
-      (isNamed || info.canEliminatePositional);
+      (!isUsed || (isNeverPassed || isConstant && !isChecked) && !isWritten);
 
   void observeParameter(
       Member member, VariableDeclaration param, SignatureShaker shaker) {
@@ -244,10 +236,6 @@
         getExternalName(member) != null) {
       info.eligible = false;
     }
-
-    if (excludePositionalParametersFromSignatureShaking(member)) {
-      info.canEliminatePositional = false;
-    }
   }
 
   @override
diff --git a/pkg/vm/test/modular_kernel_plus_aot_test.dart b/pkg/vm/test/modular_kernel_plus_aot_test.dart
index ee17639..ed8c0d2 100644
--- a/pkg/vm/test/modular_kernel_plus_aot_test.dart
+++ b/pkg/vm/test/modular_kernel_plus_aot_test.dart
@@ -56,14 +56,12 @@
 
     const useGlobalTypeFlowAnalysis = true;
     const enableAsserts = false;
-    const useProtobufTreeShaker = false;
     const useProtobufTreeShakerV2 = false;
     await runGlobalTransformations(
         vmTarget,
         component,
         useGlobalTypeFlowAnalysis,
         enableAsserts,
-        useProtobufTreeShaker,
         useProtobufTreeShakerV2,
         ErrorDetector());
 
diff --git a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
index 4a29089..023c93e 100644
--- a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
+++ b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
@@ -8,14 +8,15 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/src/printer.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'package:vm/kernel_front_end.dart'
     show runGlobalTransformations, ErrorDetector;
-import 'package:vm/transformations/protobuf_aware_treeshaker/transformer.dart'
-    as treeshaker;
+import 'package:vm/transformations/type_flow/transformer.dart' as globalTypeFlow
+    show transformComponent;
 
 import '../../common_test_utils.dart';
 
@@ -39,8 +40,9 @@
       )
       .toList();
 
-  treeshaker.transformComponent(component, {}, TestingVmTarget(TargetFlags()),
-      collectInfo: true);
+  globalTypeFlow.transformComponent(
+      TestingVmTarget(TargetFlags()), CoreTypes(component), component,
+      treeShakeProtobufs: true, treeShakeSignatures: false);
 
   for (Class messageClass in messageClasses) {
     expect(messageClass.enclosingLibrary.classes.contains(messageClass),
@@ -54,6 +56,7 @@
     final sink = file.openWrite();
     final printer = BinaryPrinter(sink, includeSources: false);
 
+    component.metadata.clear();
     printer.writeComponentFile(component);
     await sink.close();
 
@@ -77,15 +80,13 @@
   // Copied verbatim from pkg/vm/bin/protobuf_aware_treeshaker.dart.
   const bool useGlobalTypeFlowAnalysis = true;
   const bool enableAsserts = false;
-  const bool useProtobufAwareTreeShaker = true;
-  const bool useProtobufAwareTreeShakerV2 = false;
+  const bool useProtobufAwareTreeShakerV2 = true;
   final nopErrorDetector = ErrorDetector();
   runGlobalTransformations(
     target,
     component,
     useGlobalTypeFlowAnalysis,
     enableAsserts,
-    useProtobufAwareTreeShaker,
     useProtobufAwareTreeShakerV2,
     nopErrorDetector,
   );
@@ -96,7 +97,9 @@
     pkgVmDir,
     'testcases',
     'transformations',
-    'protobuf_aware_treeshaker',
+    'type_flow',
+    'transformer',
+    'protobuf_handler',
     'lib',
   )).listSync().where((f) => f.path.endsWith('_test.dart'));
   for (final entry in testCases) {
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/compile_protos.sh b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/compile_protos.sh
deleted file mode 100755
index 8031891..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/compile_protos.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-
-# Running this script requires having protoc_plugin installed in your path.
-
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-
-rm -rf $DIR/lib/generated
-mkdir $DIR/lib/generated
-
-# Directory of the script
-GENERATED_DIR=$DIR/lib/generated
-
-protoc --dart_out=$GENERATED_DIR -I$DIR/protos $DIR/protos/*.proto
-rm $GENERATED_DIR/*.pbenum.dart $GENERATED_DIR/*.pbjson.dart $GENERATED_DIR/*.pbserver.dart
-
-dartfmt -w $DIR/lib/generated
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/create_test.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/create_test.dart
deleted file mode 100644
index 1912459..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/create_test.dart
+++ /dev/null
@@ -1,21 +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.
-
-import 'package:test/test.dart';
-
-import 'generated/foo.pb.dart';
-
-main() {
-  FooKeep foo = FooKeep()
-    ..barKeep = (BarKeep()..aKeep = 5)
-    ..mapKeep['foo'] = (BarKeep()..aKeep = 2)
-    ..aKeep = 43;
-  test('retrieving values', () {
-    expect(foo.barKeep.aKeep, 5);
-    expect(foo.mapKeep['foo'].aKeep, 2);
-    expect(foo.hasHasKeep(), false);
-    expect(foo.aKeep, 43);
-    foo.clearClearKeep();
-  });
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/decode_test.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/decode_test.dart
deleted file mode 100644
index d33289f..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/decode_test.dart
+++ /dev/null
@@ -1,28 +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.
-
-import 'package:test/test.dart';
-
-import 'generated/foo.pb.dart';
-
-List<int> buffer = <int>[
-  10, 4, 8, 5, 16, //
-  4, 26, 9, 10, 3,
-  102, 111, 111, 18, 2,
-  8, 42, 34, 9, 10,
-  3, 122, 111, 112, 18,
-  2, 8, 3, 40, 43,
-  50, 0, 58, 0,
-];
-
-main() {
-  FooKeep foo = FooKeep.fromBuffer(buffer);
-  test('Kept values are restored correctly', () {
-    expect(foo.mapKeep['foo'].aKeep, 42);
-    expect(foo.barKeep.aKeep, 5);
-    expect(foo.aKeep, 43);
-    expect(foo.hasHasKeep(), true);
-    foo.clearClearKeep();
-  });
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/encode_all_fields.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/encode_all_fields.dart
deleted file mode 100644
index de756cc..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/encode_all_fields.dart
+++ /dev/null
@@ -1,26 +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.
-
-import 'dart:math';
-
-import 'generated/foo.pb.dart';
-
-main() {
-  FooKeep foo = FooKeep()
-    ..barKeep = (BarKeep()
-      ..aKeep = 5
-      ..bDrop = 4)
-    ..mapKeep['foo'] = (BarKeep()..aKeep = 42)
-    ..mapDrop['zop'] = (ZopDrop()..aDrop = 3)
-    ..aKeep = 43
-    ..hasKeep = HasKeep()
-    ..clearKeep = ClearKeep();
-  final buffer = foo.writeToBuffer();
-  print('List<int> buffer = <int>[');
-  for (int i = 0; i < buffer.length; i += 5) {
-    final numbers = buffer.sublist(i, min(buffer.length, i + 5)).join(', ');
-    print('  $numbers,${i == 0 ? ' //' : ''}');
-  }
-  print('];');
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/freeze_test.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/freeze_test.dart
deleted file mode 100644
index 0529e4a..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/freeze_test.dart
+++ /dev/null
@@ -1,23 +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.
-
-import 'package:test/test.dart';
-
-import 'generated/foo.pb.dart';
-
-main() {
-  FooKeep foo = FooKeep()
-    ..barKeep = (BarKeep()..aKeep = 5)
-    ..mapKeep['foo'] = (BarKeep()..aKeep = 2)
-    ..aKeep = 43;
-  test('Freezing a message works', () {
-    foo.freeze();
-    expect(foo.barKeep.aKeep, 5);
-    expect(foo.mapKeep['foo'].aKeep, 2);
-    expect(foo.hasHasKeep(), false);
-    expect(foo.aKeep, 43);
-    expect(() => foo.clearClearKeep(),
-        throwsA(const TypeMatcher<UnsupportedError>()));
-  });
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/generated/foo.pb.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/generated/foo.pb.dart
deleted file mode 100644
index 19c9bac5..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/generated/foo.pb.dart
+++ /dev/null
@@ -1,440 +0,0 @@
-///
-//  Generated code. Do not modify.
-//  source: foo.proto
-//
-// @dart = 2.12
-// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
-
-import 'dart:core' as $core;
-
-import 'package:protobuf/protobuf.dart' as $pb;
-
-class FooKeep extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FooKeep',
-      createEmptyInstance: create)
-    ..aOM<BarKeep>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'barKeep',
-        protoName: 'barKeep', subBuilder: BarKeep.create)
-    ..aOM<BarKeep>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'barDrop',
-        protoName: 'barDrop', subBuilder: BarKeep.create)
-    ..m<$core.String, BarKeep>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mapKeep',
-        protoName: 'mapKeep',
-        entryClassName: 'FooKeep.MapKeepEntry',
-        keyFieldType: $pb.PbFieldType.OS,
-        valueFieldType: $pb.PbFieldType.OM,
-        valueCreator: BarKeep.create)
-    ..m<$core.String, ZopDrop>(
-        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mapDrop',
-        protoName: 'mapDrop',
-        entryClassName: 'FooKeep.MapDropEntry',
-        keyFieldType: $pb.PbFieldType.OS,
-        valueFieldType: $pb.PbFieldType.OM,
-        valueCreator: ZopDrop.create)
-    ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'aKeep', $pb.PbFieldType.O3,
-        protoName: 'aKeep')
-    ..aOM<HasKeep>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hasKeep',
-        protoName: 'hasKeep', subBuilder: HasKeep.create)
-    ..aOM<ClearKeep>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'clearKeep',
-        protoName: 'clearKeep', subBuilder: ClearKeep.create)
-    ..hasRequiredFields = false;
-
-  FooKeep._() : super();
-  factory FooKeep() => create();
-  factory FooKeep.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory FooKeep.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  FooKeep clone() => FooKeep()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  FooKeep copyWith(void Function(FooKeep) updates) =>
-      super.copyWith((message) => updates(message as FooKeep))
-          as FooKeep; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static FooKeep create() => FooKeep._();
-  FooKeep createEmptyInstance() => create();
-  static $pb.PbList<FooKeep> createRepeated() => $pb.PbList<FooKeep>();
-  @$core.pragma('dart2js:noInline')
-  static FooKeep getDefault() =>
-      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FooKeep>(create);
-  static FooKeep? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  BarKeep get barKeep => $_getN(0);
-  @$pb.TagNumber(1)
-  set barKeep(BarKeep v) {
-    setField(1, v);
-  }
-
-  @$pb.TagNumber(1)
-  $core.bool hasBarKeep() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearBarKeep() => clearField(1);
-  @$pb.TagNumber(1)
-  BarKeep ensureBarKeep() => $_ensure(0);
-
-  @$pb.TagNumber(2)
-  BarKeep get barDrop => $_getN(1);
-  @$pb.TagNumber(2)
-  set barDrop(BarKeep v) {
-    setField(2, v);
-  }
-
-  @$pb.TagNumber(2)
-  $core.bool hasBarDrop() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearBarDrop() => clearField(2);
-  @$pb.TagNumber(2)
-  BarKeep ensureBarDrop() => $_ensure(1);
-
-  @$pb.TagNumber(3)
-  $core.Map<$core.String, BarKeep> get mapKeep => $_getMap(2);
-
-  @$pb.TagNumber(4)
-  $core.Map<$core.String, ZopDrop> get mapDrop => $_getMap(3);
-
-  @$pb.TagNumber(5)
-  $core.int get aKeep => $_getIZ(4);
-  @$pb.TagNumber(5)
-  set aKeep($core.int v) {
-    $_setSignedInt32(4, v);
-  }
-
-  @$pb.TagNumber(5)
-  $core.bool hasAKeep() => $_has(4);
-  @$pb.TagNumber(5)
-  void clearAKeep() => clearField(5);
-
-  @$pb.TagNumber(6)
-  HasKeep get hasKeep => $_getN(5);
-  @$pb.TagNumber(6)
-  set hasKeep(HasKeep v) {
-    setField(6, v);
-  }
-
-  @$pb.TagNumber(6)
-  $core.bool hasHasKeep() => $_has(5);
-  @$pb.TagNumber(6)
-  void clearHasKeep() => clearField(6);
-  @$pb.TagNumber(6)
-  HasKeep ensureHasKeep() => $_ensure(5);
-
-  @$pb.TagNumber(7)
-  ClearKeep get clearKeep => $_getN(6);
-  @$pb.TagNumber(7)
-  set clearKeep(ClearKeep v) {
-    setField(7, v);
-  }
-
-  @$pb.TagNumber(7)
-  $core.bool hasClearKeep() => $_has(6);
-  @$pb.TagNumber(7)
-  void clearClearKeep() => clearField(7);
-  @$pb.TagNumber(7)
-  ClearKeep ensureClearKeep() => $_ensure(6);
-}
-
-class BarKeep extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'BarKeep',
-      createEmptyInstance: create)
-    ..a<$core.int>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'aKeep',
-        $pb.PbFieldType.O3,
-        protoName: 'aKeep')
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'bDrop',
-        $pb.PbFieldType.O3,
-        protoName: 'bDrop')
-    ..hasRequiredFields = false;
-
-  BarKeep._() : super();
-  factory BarKeep() => create();
-  factory BarKeep.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory BarKeep.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  BarKeep clone() => BarKeep()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  BarKeep copyWith(void Function(BarKeep) updates) =>
-      super.copyWith((message) => updates(message as BarKeep))
-          as BarKeep; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static BarKeep create() => BarKeep._();
-  BarKeep createEmptyInstance() => create();
-  static $pb.PbList<BarKeep> createRepeated() => $pb.PbList<BarKeep>();
-  @$core.pragma('dart2js:noInline')
-  static BarKeep getDefault() =>
-      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BarKeep>(create);
-  static BarKeep? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.int get aKeep => $_getIZ(0);
-  @$pb.TagNumber(1)
-  set aKeep($core.int v) {
-    $_setSignedInt32(0, v);
-  }
-
-  @$pb.TagNumber(1)
-  $core.bool hasAKeep() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearAKeep() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.int get bDrop => $_getIZ(1);
-  @$pb.TagNumber(2)
-  set bDrop($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
-  @$pb.TagNumber(2)
-  $core.bool hasBDrop() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearBDrop() => clearField(2);
-}
-
-class HasKeep extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'HasKeep',
-      createEmptyInstance: create)
-    ..a<$core.int>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'aDrop',
-        $pb.PbFieldType.O3,
-        protoName: 'aDrop')
-    ..hasRequiredFields = false;
-
-  HasKeep._() : super();
-  factory HasKeep() => create();
-  factory HasKeep.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory HasKeep.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  HasKeep clone() => HasKeep()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  HasKeep copyWith(void Function(HasKeep) updates) =>
-      super.copyWith((message) => updates(message as HasKeep))
-          as HasKeep; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static HasKeep create() => HasKeep._();
-  HasKeep createEmptyInstance() => create();
-  static $pb.PbList<HasKeep> createRepeated() => $pb.PbList<HasKeep>();
-  @$core.pragma('dart2js:noInline')
-  static HasKeep getDefault() =>
-      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<HasKeep>(create);
-  static HasKeep? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.int get aDrop => $_getIZ(0);
-  @$pb.TagNumber(1)
-  set aDrop($core.int v) {
-    $_setSignedInt32(0, v);
-  }
-
-  @$pb.TagNumber(1)
-  $core.bool hasADrop() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearADrop() => clearField(1);
-}
-
-class ClearKeep extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'ClearKeep',
-      createEmptyInstance: create)
-    ..a<$core.int>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'aDrop',
-        $pb.PbFieldType.O3,
-        protoName: 'aDrop')
-    ..hasRequiredFields = false;
-
-  ClearKeep._() : super();
-  factory ClearKeep() => create();
-  factory ClearKeep.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory ClearKeep.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  ClearKeep clone() => ClearKeep()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  ClearKeep copyWith(void Function(ClearKeep) updates) =>
-      super.copyWith((message) => updates(message as ClearKeep))
-          as ClearKeep; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static ClearKeep create() => ClearKeep._();
-  ClearKeep createEmptyInstance() => create();
-  static $pb.PbList<ClearKeep> createRepeated() => $pb.PbList<ClearKeep>();
-  @$core.pragma('dart2js:noInline')
-  static ClearKeep getDefault() =>
-      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ClearKeep>(create);
-  static ClearKeep? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.int get aDrop => $_getIZ(0);
-  @$pb.TagNumber(1)
-  set aDrop($core.int v) {
-    $_setSignedInt32(0, v);
-  }
-
-  @$pb.TagNumber(1)
-  $core.bool hasADrop() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearADrop() => clearField(1);
-}
-
-class ZopDrop extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'ZopDrop',
-      createEmptyInstance: create)
-    ..a<$core.int>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'aDrop',
-        $pb.PbFieldType.O3,
-        protoName: 'aDrop')
-    ..hasRequiredFields = false;
-
-  ZopDrop._() : super();
-  factory ZopDrop() => create();
-  factory ZopDrop.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory ZopDrop.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  ZopDrop clone() => ZopDrop()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  ZopDrop copyWith(void Function(ZopDrop) updates) =>
-      super.copyWith((message) => updates(message as ZopDrop))
-          as ZopDrop; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static ZopDrop create() => ZopDrop._();
-  ZopDrop createEmptyInstance() => create();
-  static $pb.PbList<ZopDrop> createRepeated() => $pb.PbList<ZopDrop>();
-  @$core.pragma('dart2js:noInline')
-  static ZopDrop getDefault() =>
-      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ZopDrop>(create);
-  static ZopDrop? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.int get aDrop => $_getIZ(0);
-  @$pb.TagNumber(1)
-  set aDrop($core.int v) {
-    $_setSignedInt32(0, v);
-  }
-
-  @$pb.TagNumber(1)
-  $core.bool hasADrop() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearADrop() => clearField(1);
-}
-
-class MobDrop extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'MobDrop',
-      createEmptyInstance: create)
-    ..a<$core.int>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'aDrop',
-        $pb.PbFieldType.O3,
-        protoName: 'aDrop')
-    ..hasRequiredFields = false;
-
-  MobDrop._() : super();
-  factory MobDrop() => create();
-  factory MobDrop.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory MobDrop.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  MobDrop clone() => MobDrop()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  MobDrop copyWith(void Function(MobDrop) updates) =>
-      super.copyWith((message) => updates(message as MobDrop))
-          as MobDrop; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static MobDrop create() => MobDrop._();
-  MobDrop createEmptyInstance() => create();
-  static $pb.PbList<MobDrop> createRepeated() => $pb.PbList<MobDrop>();
-  @$core.pragma('dart2js:noInline')
-  static MobDrop getDefault() =>
-      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MobDrop>(create);
-  static MobDrop? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.int get aDrop => $_getIZ(0);
-  @$pb.TagNumber(1)
-  set aDrop($core.int v) {
-    $_setSignedInt32(0, v);
-  }
-
-  @$pb.TagNumber(1)
-  $core.bool hasADrop() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearADrop() => clearField(1);
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/generated/name_mangling.pb.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/generated/name_mangling.pb.dart
deleted file mode 100644
index c42141a..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/generated/name_mangling.pb.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-///
-//  Generated code. Do not modify.
-//  source: name_mangling.proto
-//
-// @dart = 2.12
-// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
-
-import 'dart:core' as $core;
-
-import 'package:protobuf/protobuf.dart' as $pb;
-
-class AKeep extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'AKeep',
-      createEmptyInstance: create)
-    ..hasRequiredFields = false;
-
-  AKeep._() : super();
-  factory AKeep() => create();
-  factory AKeep.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory AKeep.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  AKeep clone() => AKeep()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  AKeep copyWith(void Function(AKeep) updates) =>
-      super.copyWith((message) => updates(message as AKeep))
-          as AKeep; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static AKeep create() => AKeep._();
-  AKeep createEmptyInstance() => create();
-  static $pb.PbList<AKeep> createRepeated() => $pb.PbList<AKeep>();
-  @$core.pragma('dart2js:noInline')
-  static AKeep getDefault() =>
-      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AKeep>(create);
-  static AKeep? _defaultInstance;
-}
-
-class NameManglingKeep extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'NameManglingKeep',
-      createEmptyInstance: create)
-    ..aOM<AKeep>(
-        10,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'clone',
-        subBuilder: AKeep.create)
-    ..hasRequiredFields = false;
-
-  NameManglingKeep._() : super();
-  factory NameManglingKeep() => create();
-  factory NameManglingKeep.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory NameManglingKeep.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  NameManglingKeep clone() => NameManglingKeep()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  NameManglingKeep copyWith(void Function(NameManglingKeep) updates) =>
-      super.copyWith((message) => updates(message as NameManglingKeep))
-          as NameManglingKeep; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static NameManglingKeep create() => NameManglingKeep._();
-  NameManglingKeep createEmptyInstance() => create();
-  static $pb.PbList<NameManglingKeep> createRepeated() =>
-      $pb.PbList<NameManglingKeep>();
-  @$core.pragma('dart2js:noInline')
-  static NameManglingKeep getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<NameManglingKeep>(create);
-  static NameManglingKeep? _defaultInstance;
-
-  @$pb.TagNumber(10)
-  AKeep get clone_10 => $_getN(0);
-  @$pb.TagNumber(10)
-  set clone_10(AKeep v) {
-    setField(10, v);
-  }
-
-  @$pb.TagNumber(10)
-  $core.bool hasClone_10() => $_has(0);
-  @$pb.TagNumber(10)
-  void clearClone_10() => clearField(10);
-  @$pb.TagNumber(10)
-  AKeep ensureClone_10() => $_ensure(0);
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/name_mangling_test.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/name_mangling_test.dart
deleted file mode 100644
index b52c5dc..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/name_mangling_test.dart
+++ /dev/null
@@ -1,14 +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.
-
-import 'package:test/test.dart';
-
-import 'generated/name_mangling.pb.dart';
-
-main() {
-  NameManglingKeep n = NameManglingKeep.fromBuffer([]);
-  if (n.hasClone_10()) {
-    print("Has clone field");
-  }
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/nop_test.dart b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/nop_test.dart
deleted file mode 100644
index 60997dc..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/lib/nop_test.dart
+++ /dev/null
@@ -1,9 +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.
-
-main() {
-  // Ensures the protobuf-aware tree shaker can also transform non-protobuf
-  // using code.
-  print("hello world");
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/protos/foo.proto b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/protos/foo.proto
deleted file mode 100644
index 1f10872..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/protos/foo.proto
+++ /dev/null
@@ -1,36 +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.
-
-syntax = "proto3";
-
-message FooKeep {
-  BarKeep barKeep = 1;
-  BarKeep barDrop = 2;
-  map<string, BarKeep> mapKeep = 3;
-  map<string, ZopDrop> mapDrop = 4;
-  int32 aKeep = 5;
-  HasKeep hasKeep = 6;
-  ClearKeep clearKeep = 7;
-}
-
-message BarKeep {
-  int32 aKeep = 1;
-  int32 bDrop = 2;
-}
-
-message HasKeep {
-  int32 aDrop = 1;
-}
-
-message ClearKeep {
-  int32 aDrop = 1;
-}
-
-message ZopDrop {
-  int32 aDrop = 1;
-}
-
-message MobDrop {
-  int32 aDrop = 1;
-}
diff --git a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/protos/name_mangling.proto b/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/protos/name_mangling.proto
deleted file mode 100644
index f25b2f4..0000000
--- a/pkg/vm/testcases/transformations/protobuf_aware_treeshaker/protos/name_mangling.proto
+++ /dev/null
@@ -1,10 +0,0 @@
-syntax = "proto3";
-
-message AKeep {}
-
-message NameManglingKeep {
-  // the name `clone` is mangled by the protoc_plugin to not conflict with
-  // `GeneratedMessage.clone`.
-  // Still we should be able to detect usages of this field.
-  AKeep clone = 10;
-}
\ No newline at end of file
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
index a697cdd..ec70e94 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
@@ -38,11 +38,11 @@
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t1 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "FooKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep>(1, (#C1) ?{core::String} "" : "barKeep", "barKeep", #C2);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::BarKeep>(3, (#C1) ?{core::String} "" : "mapKeep", #C2);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::BarKeep>((#C1) ?{core::String} "" : "mapKeep", #C2);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep", #C3);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C4);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C5);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep");
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C4);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep
@@ -52,36 +52,36 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::FooKeep
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C9
   get barKeep() → self::BarKeep
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getN] [@vm.inferred-type.metadata=foo.pb.dart::BarKeep? (skip check)] this.{pro::GeneratedMessage::$_getN}<self::BarKeep>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C9
   set barKeep([@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C11
   get mapKeep() → core::Map<core::String, self::BarKeep>
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String, self::BarKeep>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C14
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C13
   get aKeep() → core::int
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(4);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C14
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C13
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(4, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C16
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C15
   method hasHasKeep() → core::bool
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_has] [@vm.inferred-type.metadata=dart.core::bool (skip check)] this.{pro::GeneratedMessage::$_has}();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C18
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C17
   method clearClearKeep() → void
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.clearField] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] this.{pro::GeneratedMessage::clearField}();
 }
 class BarKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t2 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "BarKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep", #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep");
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
@@ -92,13 +92,13 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::BarKeep
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C9
   get aKeep() → core::int
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(0);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C9
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
@@ -113,7 +113,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::HasKeep
     return new self::HasKeep::_();
 }
@@ -127,7 +127,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::ClearKeep
     return new self::ClearKeep::_();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
index 14a4689..71dc247 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
@@ -31,11 +31,11 @@
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t1 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "FooKeep", createEmptyInstance: #C2) in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep>(1, (#C1) ?{core::String} "" : "barKeep", "barKeep", #C3);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::BarKeep>(3, (#C1) ?{core::String} "" : "mapKeep", #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::BarKeep>((#C1) ?{core::String} "" : "mapKeep", #C3);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep", #C4);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C5);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C6);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep");
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C5);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep
@@ -47,28 +47,28 @@
     } =>#t2;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::FooKeep
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2]  @#C11
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2]  @#C10
   get barKeep() → self::BarKeep
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getN] [@vm.inferred-type.metadata=foo.pb.dart::BarKeep? (skip check)] this.{pro::GeneratedMessage::$_getN}<self::BarKeep>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  @#C13
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  @#C12
   get mapKeep() → core::Map<core::String, self::BarKeep>
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String, self::BarKeep>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  @#C15
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  @#C14
   get aKeep() → core::int
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(4);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  @#C17
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  @#C16
   method hasHasKeep() → core::bool
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_has] [@vm.inferred-type.metadata=dart.core::bool (skip check)] this.{pro::GeneratedMessage::$_has}();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C19
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C18
   method clearClearKeep() → void
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.clearField] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] this.{pro::GeneratedMessage::clearField}();
 }
 class BarKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t3 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "BarKeep", createEmptyInstance: #C3) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep");
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t3;
@@ -77,15 +77,15 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::BarKeep
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9] [@vm.unboxing-info.metadata=()->i]  @#C11
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9] [@vm.unboxing-info.metadata=()->i]  @#C10
   get aKeep() → core::int
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(0);
 }
 class HasKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t4 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "HasKeep", createEmptyInstance: #C5) in block {
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t4 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "HasKeep", createEmptyInstance: #C4) in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
@@ -94,12 +94,12 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::HasKeep
     return new self::HasKeep::_();
 }
 class ClearKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t5 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "ClearKeep", createEmptyInstance: #C6) in block {
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t5 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "ClearKeep", createEmptyInstance: #C5) in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t5;
@@ -108,7 +108,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::ClearKeep
     return new self::ClearKeep::_();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
index 4980123..e99a0c0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
@@ -47,9 +47,9 @@
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::BarKeep>(3, (#C1) ?{core::String} "" : "mapKeep", "FooKeep.MapKeepEntry", "mapKeep", #C2);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::ZopDrop>(4, (#C1) ?{core::String} "" : "mapDrop", "FooKeep.MapDropEntry", "mapDrop", #C3);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep", #C4, "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C5);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C6);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep", "aKeep");
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C5);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep
@@ -59,36 +59,36 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::FooKeep
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2]  @#C11
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2]  @#C10
   set barKeep([@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(1, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  @#C13
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  @#C12
   get mapKeep() → core::Map<core::String, self::BarKeep>
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String, self::BarKeep>(2);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C15
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C14
   get mapDrop() → core::Map<core::String, self::ZopDrop>
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String, self::ZopDrop>(3);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5] [@vm.unboxing-info.metadata=(i)->b]  @#C17
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5] [@vm.unboxing-info.metadata=(i)->b]  @#C16
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(4, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6]  @#C19
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6]  @#C18
   set hasKeep([@vm.inferred-type.metadata=foo.pb.dart::HasKeep] self::HasKeep v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(6, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7]  @#C21
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7]  @#C20
   set clearKeep([@vm.inferred-type.metadata=foo.pb.dart::ClearKeep] self::ClearKeep v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(7, v);
   }
 }
 class BarKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t2 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "BarKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep", #C4, "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(2, (#C1) ?{core::String} "" : "bDrop", #C4, "bDrop");
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep", "aKeep");
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(2, (#C1) ?{core::String} "" : "bDrop", "bDrop");
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
   constructor _() → self::BarKeep
@@ -98,14 +98,14 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::BarKeep
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8] [@vm.unboxing-info.metadata=(i)->b]  @#C11
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8] [@vm.unboxing-info.metadata=(i)->b]  @#C10
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9] [@vm.unboxing-info.metadata=(i)->b]  @#C23
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9] [@vm.unboxing-info.metadata=(i)->b]  @#C22
   set bDrop([@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(1, v);
   }
@@ -122,7 +122,7 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::HasKeep] self::HasKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::HasKeep
     return new self::HasKeep::_();
 }
@@ -138,13 +138,13 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::ClearKeep] self::ClearKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C9
+  @#C8
   static method create() → self::ClearKeep
     return new self::ClearKeep::_();
 }
 class ZopDrop extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t5 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "ZopDrop") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aDrop", #C4, "aDrop");
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aDrop", "aDrop");
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t5;
   constructor _() → self::ZopDrop
@@ -154,10 +154,10 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::ZopDrop] self::ZopDrop::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ZopDrop::_i;
-  @#C9
+  @#C8
   static method create() → self::ZopDrop
     return new self::ZopDrop::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:10] [@vm.unboxing-info.metadata=(i)->b]  @#C11
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:10] [@vm.unboxing-info.metadata=(i)->b]  @#C10
   set aDrop([@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
index 15a7ebf..b750159 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
@@ -41,11 +41,11 @@
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t1 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "FooKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep>(1, (#C1) ?{core::String} "" : "barKeep", "barKeep", #C2);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::BarKeep>(3, (#C1) ?{core::String} "" : "mapKeep", #C2);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String, self::BarKeep>((#C1) ?{core::String} "" : "mapKeep", #C2);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep", #C3);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C4);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C5);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int>(5, (#C1) ?{core::String} "" : "aKeep");
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep>(6, (#C1) ?{core::String} "" : "hasKeep", "hasKeep", #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep>(7, (#C1) ?{core::String} "" : "clearKeep", "clearKeep", #C4);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep
@@ -55,36 +55,36 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::FooKeep
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C9
   get barKeep() → self::BarKeep
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getN] [@vm.inferred-type.metadata=foo.pb.dart::BarKeep? (skip check)] this.{pro::GeneratedMessage::$_getN}<self::BarKeep>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C9
   set barKeep([@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C11
   get mapKeep() → core::Map<core::String, self::BarKeep>
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String, self::BarKeep>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C14
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C13
   get aKeep() → core::int
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(4);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C14
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C13
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(4, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C16
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C15
   method hasHasKeep() → core::bool
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_has] [@vm.inferred-type.metadata=dart.core::bool (skip check)] this.{pro::GeneratedMessage::$_has}();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C18
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C17
   method clearClearKeep() → void
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.clearField] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] this.{pro::GeneratedMessage::clearField}();
 }
 class BarKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t2 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "BarKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep", #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int>(1, (#C1) ?{core::String} "" : "aKeep");
     [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
@@ -95,13 +95,13 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::BarKeep
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C9
   get aKeep() → core::int
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(0);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C10
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C9
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi] core::int v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
@@ -116,7 +116,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::HasKeep
     return new self::HasKeep::_();
 }
@@ -130,7 +130,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C8
+  @#C7
   static method create() → self::ClearKeep
     return new self::ClearKeep::_();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
index 2afead4..f3b8f42 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
@@ -35,7 +35,7 @@
 }
 class NameManglingKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo _i = let final pro::BuilderInfo #t2 = new pro::BuilderInfo::•((#C1) ?{core::String} "" : "NameManglingKeep", #C6) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::aOM}<self::AKeep>(10, (#C1) ?{core::String} "" : "clone", #C2);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::aOM}<self::AKeep>((#C1) ?{core::String} "" : "clone", #C2);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
   constructor _() → self::NameManglingKeep
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index 6010ee8..192cac3 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -34,7 +34,6 @@
     ;;
     --tfa | \
     --no-tfa | \
-    --protobuf-tree-shaker | \
     --protobuf-tree-shaker-v2 | \
     --minimal-kernel | \
     --no-embed-sources | \
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 7aad2ee..6d0771d 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -1651,12 +1651,31 @@
         : table_(Array::Handle(zone)),
           kind_and_offset_(Smi::Handle(zone)),
           target_function_(Function::Handle(zone)),
-          target_code_(Code::Handle(zone)) {}
+          target_code_(Code::Handle(zone)),
+          pool_(ObjectPool::Handle(zone)) {}
 
     void VisitCode(const Code& code) {
       if (!code.IsFunctionCode()) return;
       table_ = code.static_calls_target_table();
       StaticCallsTable static_calls(table_);
+
+      // With bare instructions, there is a global pool and per-Code local
+      // pools. Instructions are generated to use offsets into the global pool,
+      // but we still use the local pool to track which Code are using which
+      // pool values for the purposes of analyzing snapshot size
+      // (--write_v8_snapshot_profile_to and --print_instructions_sizes_to) and
+      // deferred loading deciding which snapshots to place pool values in.
+      // We don't keep track of which offsets in the local pools correspond to
+      // which entries in the static call table, so we don't properly replace
+      // the old references to the CallStaticFunction stub, but it is sufficient
+      // for the local pool to include the actual call target.
+      compiler::ObjectPoolBuilder builder;
+      bool append_to_pool = FLAG_use_bare_instructions;
+      if (append_to_pool) {
+        pool_ = code.object_pool();
+        pool_.CopyInto(&builder);
+      }
+
       for (auto& view : static_calls) {
         kind_and_offset_ = view.Get<Code::kSCallTableKindAndOffset>();
         auto const kind = Code::KindField::decode(kind_and_offset_.Value());
@@ -1678,6 +1697,9 @@
               Code::OffsetField::decode(kind_and_offset_.Value());
           const uword pc = pc_offset + code.PayloadStart();
           CodePatcher::PatchStaticCallAt(pc, code, target_code_);
+          if (append_to_pool) {
+            builder.AddObject(Object::ZoneHandle(target_code_.raw()));
+          }
         }
         if (FLAG_trace_precompiler) {
           THR_Print("Updated static call entry to %s in \"%s\"\n",
@@ -1685,6 +1707,10 @@
                     code.ToCString());
         }
       }
+
+      if (append_to_pool) {
+        code.set_object_pool(ObjectPool::NewFromBuilder(builder));
+      }
     }
 
    private:
@@ -1692,6 +1718,7 @@
     Smi& kind_and_offset_;
     Function& target_function_;
     Code& target_code_;
+    ObjectPool& pool_;
   };
 
   HANDLESCOPE(T);
diff --git a/runtime/vm/compiler/assembler/assembler_base.cc b/runtime/vm/compiler/assembler/assembler_base.cc
index 96d98a1..7034652 100644
--- a/runtime/vm/compiler/assembler/assembler_base.cc
+++ b/runtime/vm/compiler/assembler/assembler_base.cc
@@ -327,6 +327,7 @@
     if (parent_ != nullptr) {
       const intptr_t idx = parent_->object_pool_index_table_.LookupValue(entry);
       if (idx != ObjIndexPair::kNoIndex) {
+        used_from_parent_.Add(idx);
         return idx;
       }
     }
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index d38a349..16bb992 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -11,6 +11,7 @@
 #include "vm/constants.h"
 #include "vm/cpu.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 #include "vm/reverse_pc_lookup_cache.h"
 
 namespace dart {
@@ -220,12 +221,14 @@
   Register dst;
   if (IsLoadWithOffset(instr, PP, &offset, &dst)) {
     intptr_t index = ObjectPool::IndexFromOffset(offset);
-    const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-    if (!pool.IsNull()) {
-      if (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject) {
-        *obj = pool.ObjectAt(index);
-        return true;
-      }
+    const ObjectPool& pool = ObjectPool::Handle(
+        FLAG_use_bare_instructions
+            ? IsolateGroup::Current()->object_store()->global_object_pool()
+            : code.object_pool());
+    if (!pool.IsNull() && (index < pool.Length()) &&
+        (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
+      *obj = pool.ObjectAt(index);
+      return true;
     }
   } else if (IsLoadWithOffset(instr, THR, &offset, &dst)) {
     return Thread::ObjectAtOffset(offset, obj);
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 1ebd214..210fca3 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -11,6 +11,7 @@
 #include "vm/constants.h"
 #include "vm/cpu.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 #include "vm/reverse_pc_lookup_cache.h"
 
 namespace dart {
@@ -330,17 +331,15 @@
     if (instr->RnField() == PP) {
       // PP is untagged on ARM64.
       ASSERT(Utils::IsAligned(offset, 8));
-      // A code object may have an object pool attached in bare instructions
-      // mode if the v8 snapshot profile writer is active, but this pool cannot
-      // be used for object loading.
-      if (FLAG_use_bare_instructions) return false;
       intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
-      const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-      if (!pool.IsNull()) {
-        if (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject) {
-          *obj = pool.ObjectAt(index);
-          return true;
-        }
+      const ObjectPool& pool = ObjectPool::Handle(
+          FLAG_use_bare_instructions
+              ? IsolateGroup::Current()->object_store()->global_object_pool()
+              : code.object_pool());
+      if (!pool.IsNull() && (index < pool.Length()) &&
+          (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
+        *obj = pool.ObjectAt(index);
+        return true;
       }
     } else if (instr->RnField() == THR) {
       return Thread::ObjectAtOffset(offset, obj);
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index 256faa9..7495066f 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -14,6 +14,7 @@
 #include "vm/constants.h"
 #include "vm/cpu.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 
 namespace dart {
 
@@ -63,22 +64,26 @@
     if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) {  // movq, cmpq
       if ((bytes[2] & 0xc7) == (0x80 | (PP & 7))) {  // [r15+disp32]
         intptr_t index = IndexFromPPLoadDisp32(pc + 3);
-        const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-        if (!pool.IsNull()) {
-          if (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject) {
-            *obj = pool.ObjectAt(index);
-            return true;
-          }
+        const ObjectPool& pool = ObjectPool::Handle(
+            FLAG_use_bare_instructions
+                ? IsolateGroup::Current()->object_store()->global_object_pool()
+                : code.object_pool());
+        if (!pool.IsNull() && (index < pool.Length()) &&
+            (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
+          *obj = pool.ObjectAt(index);
+          return true;
         }
       }
       if ((bytes[2] & 0xc7) == (0x40 | (PP & 7))) {  // [r15+disp8]
         intptr_t index = IndexFromPPLoadDisp8(pc + 3);
-        const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-        if (!pool.IsNull()) {
-          if (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject) {
-            *obj = pool.ObjectAt(index);
-            return true;
-          }
+        const ObjectPool& pool = ObjectPool::Handle(
+            FLAG_use_bare_instructions
+                ? IsolateGroup::Current()->object_store()->global_object_pool()
+                : code.object_pool());
+        if (!pool.IsNull() && (index < pool.Length()) &&
+            (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
+          *obj = pool.ObjectAt(index);
+          return true;
         }
       }
     }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index cea08ae..ffad3f4 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3798,7 +3798,7 @@
 }
 
 ArrayPtr Class::invocation_dispatcher_cache() const {
-  return raw_ptr()->invocation_dispatcher_cache();
+  return raw_ptr()->invocation_dispatcher_cache<std::memory_order_acquire>();
 }
 
 void Class::Finalize() const {
@@ -5022,7 +5022,7 @@
   // The exception is DeclarationType of Null which is kNullable.
   ASSERT(value.type_class_id() != kNullCid || value.IsNullable());
   ASSERT(value.type_class_id() == kNullCid || value.IsNonNullable());
-  raw_ptr()->set_declaration_type(value.raw());
+  raw_ptr()->set_declaration_type<std::memory_order_release>(value.raw());
 }
 
 TypePtr Class::DeclarationType() const {
@@ -9957,7 +9957,7 @@
 void ClosureData::set_implicit_static_closure(const Instance& closure) const {
   ASSERT(!closure.IsNull());
   ASSERT(raw_ptr()->closure() == Instance::null());
-  raw_ptr()->set_closure(closure.raw());
+  raw_ptr()->set_closure<std::memory_order_release>(closure.raw());
 }
 
 void ClosureData::set_parent_function(const Function& value) const {
@@ -16466,9 +16466,7 @@
     }
   } else {
 #if defined(DART_PRECOMPILER)
-    const bool needs_pool = (FLAG_write_v8_snapshot_profile_to != nullptr) ||
-                            (FLAG_trace_precompiler_to != nullptr);
-    if (needs_pool && assembler->HasObjectPoolBuilder() &&
+    if (assembler->HasObjectPoolBuilder() &&
         assembler->object_pool_builder().HasParent()) {
       // We are not going to write this pool into snapshot, but we will use
       // it to emit references from this code object to other objects in the
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ec29673..594bc24 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1588,7 +1588,9 @@
   }
 
  private:
-  TypePtr declaration_type() const { return raw_ptr()->declaration_type(); }
+  TypePtr declaration_type() const {
+    return raw_ptr()->declaration_type<std::memory_order_acquire>();
+  }
 
   // Caches the declaration type of this class.
   void set_declaration_type(const Type& type) const;
@@ -3767,7 +3769,9 @@
   FunctionPtr parent_function() const { return raw_ptr()->parent_function_; }
   void set_parent_function(const Function& value) const;
 
-  InstancePtr implicit_static_closure() const { return raw_ptr()->closure_; }
+  InstancePtr implicit_static_closure() const {
+    return raw_ptr()->closure<std::memory_order_acquire>();
+  }
   void set_implicit_static_closure(const Instance& closure) const;
 
   TypeArgumentsPtr default_type_arguments() const {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index d862534..d9af93e 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -504,6 +504,26 @@
   _applyExtension(jsType, dartExtType);
 }
 
+/// Apply a previously registered extension for testing purposes.
+///
+/// This method's only purpose is to aid in testing native classes. Most native
+/// tests define JavaScript classes in user code (e.g. in an eval string). The
+/// dartdevc compiler properly calls `registerExtension` when processing the
+/// native class declarations in Dart, but at that point in time the JavaScript
+/// counterpart is not defined.
+///
+/// This method is used to lookup those registrations and reapply the extension
+/// after the JavaScript declarations are added.
+///
+/// An alternative to this would be to invest in a better test infrastructure
+/// that would let us define the JavaScript code prior to loading the compiled
+/// module.
+applyExtensionForTesting(name) {
+  var dartExtType = JS('', '#.get(#)', _extensionMap, name);
+  var jsType = JS('', '#[#]', global_, name);
+  _applyExtension(jsType, dartExtType);
+}
+
 ///
 /// Mark a concrete type as implementing extension methods.
 /// For example: `class MyIter implements Iterable`.
diff --git a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
index 72fff96..71c559c 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
@@ -239,3 +239,8 @@
 findConstructorForNativeSubclassType(Type? type, String name) {}
 getNativeInterceptor(object) {}
 setDispatchProperty(object, value) {}
+
+// Added to allow dart2js and dartdevc to share tests
+// TODO(sigmund): revisit whether this method is still needed after reoganizing
+// all web tests.
+findInterceptorForType(Type? type) {}
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index 51eb666..08a1e1e 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -798,6 +798,11 @@
   dart.applyExtension(name, nativeObject);
 }
 
+/// Hook to apply extensions on native JS classes defined in a native unit test.
+void applyTestExtensions(List<String> names) {
+  names.forEach(dart.applyExtensionForTesting);
+}
+
 /// Used internally by DDC to map ES6 symbols to Dart.
 class PrivateSymbol implements Symbol {
   // TODO(jmesserly): could also get this off the native symbol instead of
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index c30d332..1bef6a1 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -2999,10 +2999,14 @@
 // This is currently a no-op in dart2js.
 void registerGlobalObject(object) {}
 
-// Hook to register new browser classes.
+// Hook to register new browser classes in dartdevc.
 // This is currently a no-op in dart2js.
 void applyExtension(name, nativeObject) {}
 
+// Hook to upgrade user native-type classes in dartdevc.
+// This is currently a no-op in dart2js, but used for native tests.
+void applyTestExtensions(List<String> names) {}
+
 // See tests/dart2js_2/platform_environment_variable1_test.dart
 const String testPlatformEnvironmentVariableValue = String.fromEnvironment(
     'dart2js.test.platform.environment.variable',
diff --git a/tests/dart2js/native/abstract_class_test.dart b/tests/dart2js/native/abstract_class_test.dart
index 6773385..7bcba7e 100644
--- a/tests/dart2js/native/abstract_class_test.dart
+++ b/tests/dart2js/native/abstract_class_test.dart
@@ -27,12 +27,12 @@
   function A(){}
   function B(){}
   B.prototype.foo = function() { return 'B.foo'; };
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
   self.nativeConstructor(A);
   self.nativeConstructor(B);
-})()
-""");
+})()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/bound_closure_test.dart b/tests/dart2js/native/bound_closure_test.dart
index 3509722..1702a84 100644
--- a/tests/dart2js/native/bound_closure_test.dart
+++ b/tests/dart2js/native/bound_closure_test.dart
@@ -40,13 +40,14 @@
     return 'CC.foo(' + u + ', ' + v + ')';
   };
 
-  makeBB = function(){return new BB()};
-  makeCC = function(){return new CC()};
-  inscrutable = function(a){return a;};
+  self.makeBB = function(){return new BB()};
+  self.makeCC = function(){return new CC()};
+  self.inscrutable = function(a){return a;};
 
   self.nativeConstructor(BB);
   self.nativeConstructor(CC);
 })()""");
+  applyTestExtensions(['BB', 'CC']);
 }
 
 main() {
diff --git a/tests/dart2js/native/browser_compat_1_prepatched_test.dart b/tests/dart2js/native/browser_compat_1_prepatched_test.dart
index bfd62f5..e49b134 100644
--- a/tests/dart2js/native/browser_compat_1_prepatched_test.dart
+++ b/tests/dart2js/native/browser_compat_1_prepatched_test.dart
@@ -37,9 +37,9 @@
   window.T1A = T1A;
   window.T1CrazyB = T1CrazyB;
 
-  makeT1A = function(){return new T1A()};
-  makeT1B = function(){return new T1CrazyB()};
-  makeT1C = function(){return new T1fakeA()};
+  self.makeT1A = function(){return new T1A()};
+  self.makeT1B = function(){return new T1CrazyB()};
+  self.makeT1C = function(){return new T1fakeA()};
 
   self.nativeConstructor(T1A);
   self.nativeConstructor(T1CrazyB);
@@ -71,6 +71,7 @@
 
   dartNativeDispatchHooksTransformer = [transformer1];
 })()''');
+  applyTestExtensions(['T1A', 'T1CrazyB', 'T1fakeA']);
 }
 
 main() {
diff --git a/tests/dart2js/native/browser_compat_1_unpatched_test.dart b/tests/dart2js/native/browser_compat_1_unpatched_test.dart
index 779b72a..82a1fba 100644
--- a/tests/dart2js/native/browser_compat_1_unpatched_test.dart
+++ b/tests/dart2js/native/browser_compat_1_unpatched_test.dart
@@ -38,9 +38,9 @@
   window.T1A = T1A;
   window.T1CrazyB = T1CrazyB;
 
-  makeT1A = function(){return new T1A()};
-  makeT1B = function(){return new T1CrazyB()};
-  makeT1C = function(){return new T1fakeA()};
+  self.makeT1A = function(){return new T1A()};
+  self.makeT1B = function(){return new T1CrazyB()};
+  self.makeT1C = function(){return new T1fakeA()};
 
   self.nativeConstructor(T1A);
   self.nativeConstructor(T1CrazyB);
@@ -74,6 +74,7 @@
 
   dartNativeDispatchHooksTransformer = [transformer1];
 })()""");
+  applyTestExtensions(['T1A', 'T1CrazyB', 'T1fakeA']);
 }
 
 main() {
diff --git a/tests/dart2js/native/browser_compat_2_test.dart b/tests/dart2js/native/browser_compat_2_test.dart
index aa8f131..50a88b4 100644
--- a/tests/dart2js/native/browser_compat_2_test.dart
+++ b/tests/dart2js/native/browser_compat_2_test.dart
@@ -59,10 +59,10 @@
 T1C.prototype.name = function() { return "C"; };
 T1D.prototype.name = function() { return "D"; };
 
-makeT1A = function(){return new T1A()};
-makeT1B = function(){return new T1B()};
-makeT1C = function(){return new T1C()};
-makeT1D = function(){return new T1D()};
+self.makeT1A = function(){return new T1A()};
+self.makeT1B = function(){return new T1B()};
+self.makeT1C = function(){return new T1C()};
+self.makeT1D = function(){return new T1D()};
 
 self.nativeConstructor(T1A);
 self.nativeConstructor(T1B);
@@ -70,8 +70,8 @@
 self.nativeConstructor(T1D);
 
 var getTagCount = 0;
-getTagCallCount = function() { return getTagCount; };
-clearTagCallCount = function() { getTagCount = 0; };
+self.getTagCallCount = function() { return getTagCount; };
+self.clearTagCallCount = function() { getTagCount = 0; };
 
 function transformer1(hooks) {
   var getTag = hooks.getTag;
@@ -102,8 +102,9 @@
   hooks.getTag = getTagNew;
 }
 
-dartNativeDispatchHooksTransformer = [transformer1, transformer2];
+self.dartNativeDispatchHooksTransformer = [transformer1, transformer2];
 })()''');
+  applyTestExtensions(['T1A', 'T1B', 'T1C', 'T1D']);
 }
 
 main() {
diff --git a/tests/dart2js/native/core_type_check_native_test.dart b/tests/dart2js/native/core_type_check_native_test.dart
index 6356192..572c136 100644
--- a/tests/dart2js/native/core_type_check_native_test.dart
+++ b/tests/dart2js/native/core_type_check_native_test.dart
@@ -31,20 +31,20 @@
   JS('', r"""
 (function(){
   function A() {};
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   function B() {};
-  makeB = function() { return new B(); };
+  self.makeB = function() { return new B(); };
   function C() {};
-  makeC = function() { return new C(); };
+  self.makeC = function() { return new C(); };
   function D() {};
-  makeD = function() { return new D(); };
+  self.makeD = function() { return new D(); };
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
   self.nativeConstructor(D);
-})()
-""");
+})()""");
+  applyTestExtensions(['A', 'B', 'C', 'D']);
 }
 
 checkTest(value, expectComparable, expectPattern) {
diff --git a/tests/dart2js/native/dispatch_property_initialization_test.dart b/tests/dart2js/native/dispatch_property_initialization_test.dart
index 4e4ed95..21a6e9f 100644
--- a/tests/dart2js/native/dispatch_property_initialization_test.dart
+++ b/tests/dart2js/native/dispatch_property_initialization_test.dart
@@ -23,6 +23,7 @@
 
   self.nativeConstructor(Foo);
 })()""");
+  applyTestExtensions(['Foo']);
 }
 
 main() {
diff --git a/tests/dart2js/native/downcast_test.dart b/tests/dart2js/native/downcast_test.dart
index ab74f5f..9355948 100644
--- a/tests/dart2js/native/downcast_test.dart
+++ b/tests/dart2js/native/downcast_test.dart
@@ -46,12 +46,13 @@
 inherits(B, A);
 A.prototype.read = function() { return this._x; };
 A.prototype.write = function(x) { this._x = x; };
-makeA = function(){return new A()};
-makeB = function(){return new B()};
+self.makeA = function(){return new A()};
+self.makeB = function(){return new B()};
 
 self.nativeConstructor(A);
 self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 class C {}
diff --git a/tests/dart2js/native/error_safeToString_test.dart b/tests/dart2js/native/error_safeToString_test.dart
index 022b53a..ecb3544 100644
--- a/tests/dart2js/native/error_safeToString_test.dart
+++ b/tests/dart2js/native/error_safeToString_test.dart
@@ -36,45 +36,46 @@
 void setup() {
   JS('', r"""
 (function(){
-  makeA = function(){return {hello: 123};};
+  self.makeA = function(){return {hello: 123};};
 
   function BB(){}
-  makeB = function(){return new BB();};
+  self.makeB = function(){return new BB();};
 
   function CC(){}
-  makeC = function(){
+  self.makeC = function(){
     var x = new CC();
     x.constructor = null;  // Foils constructor lookup.
     return x;
   };
 
   function DD(){}
-  makeD = function(){
+  self.makeD = function(){
     var x = new DD();
     x.constructor = {name: 'DDxxx'};  // Foils constructor lookup.
     return x;
   };
 
   function EE(){}
-  makeE = function(){
+  self.makeE = function(){
     var x = new EE();
     x.constructor = function Liar(){};  // Looks like a legitimate constructor.
     return x;
   };
 
   function PPPP(){}
-  makeP = function(){return new PPPP();};
+  self.makeP = function(){return new PPPP();};
 
   function QQQQ(){}
-  makeQ = function(){return new QQQQ();};
+  self.makeQ = function(){return new QQQQ();};
 
   function RRRR(){}
-  makeR = function(){return new RRRR();};
+  self.makeR = function(){return new RRRR();};
 
   self.nativeConstructor(PPPP);
   self.nativeConstructor(QQQQ);
   self.nativeConstructor(RRRR);
 })()""");
+  applyTestExtensions(['PPPP', 'QQQQ', 'RRRR']);
 }
 
 expectTypeName(expectedName, s) {
diff --git a/tests/dart2js/native/event_loop_test.dart b/tests/dart2js/native/event_loop_test.dart
index e69d542..2706bb7 100644
--- a/tests/dart2js/native/event_loop_test.dart
+++ b/tests/dart2js/native/event_loop_test.dart
@@ -20,9 +20,10 @@
 (function(){
 function A() {}
 A.prototype.foo = function(f) { return f(); };
-makeA = function() { return new A(); };
+self.makeA = function() { return new A(); };
 self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/fake_thing_2_test.dart b/tests/dart2js/native/fake_thing_2_test.dart
index f630746..8ca0394 100644
--- a/tests/dart2js/native/fake_thing_2_test.dart
+++ b/tests/dart2js/native/fake_thing_2_test.dart
@@ -23,14 +23,15 @@
 (function(){
   function A() {}
   A.prototype.$isThing = true;
-  make1 = function(){return new A()};
-  make2 = function(){return {$isThing: true}};
+  self.make1 = function(){return new A()};
+  self.make2 = function(){return {$isThing: true}};
   function NT() {}
   NT.prototype.$isThing = true;
-  make3 = function(){return new NT()};
+  self.make3 = function(){return new NT()};
 
   self.nativeConstructor(NT);
 })()""");
+  applyTestExtensions(['NT']);
 }
 
 main() {
diff --git a/tests/dart2js/native/fake_thing_test.dart b/tests/dart2js/native/fake_thing_test.dart
index 542a5ca..4a699c4 100644
--- a/tests/dart2js/native/fake_thing_test.dart
+++ b/tests/dart2js/native/fake_thing_test.dart
@@ -21,8 +21,8 @@
 (function(){
   function A() {}
   A.prototype.$isThing = true;
-  make1 = function(){return new A();};
-  make2 = function(){return {$isThing: true}};
+  self.make1 = function(){return new A();};
+  self.make2 = function(){return {$isThing: true}};
 })()""");
 }
 
diff --git a/tests/dart2js/native/field_type2_test.dart b/tests/dart2js/native/field_type2_test.dart
index fdf77bb..edece7a 100644
--- a/tests/dart2js/native/field_type2_test.dart
+++ b/tests/dart2js/native/field_type2_test.dart
@@ -19,10 +19,11 @@
 (function(){
 // This code is all inside 'setup' and so not accessible from the global scope.
 function Node(parent){ this.parentNode = parent; }
-makeNode = function(p){return new Node(p);};
+self.makeNode = function(p){return new Node(p);};
 
 self.nativeConstructor(Node);
 })()""");
+  applyTestExtensions(['Node']);
 }
 
 main() {
diff --git a/tests/dart2js/native/field_type_test.dart b/tests/dart2js/native/field_type_test.dart
index 8135cd5..5cc73d0 100644
--- a/tests/dart2js/native/field_type_test.dart
+++ b/tests/dart2js/native/field_type_test.dart
@@ -48,9 +48,10 @@
 (function(){
   // This code is inside 'setup' and so not accessible from the global scope.
   function Node(parent){ this.parentNode = parent; }
-  makeNode = function(p){return new Node(p);};
+  self.makeNode = function(p){return new Node(p);};
   self.nativeConstructor(Node);
 })()""");
+  applyTestExtensions(['Node']);
 }
 
 main() {
diff --git a/tests/dart2js/native/fixup_get_tag_test.dart b/tests/dart2js/native/fixup_get_tag_test.dart
index e4e1ab8..a904982 100644
--- a/tests/dart2js/native/fixup_get_tag_test.dart
+++ b/tests/dart2js/native/fixup_get_tag_test.dart
@@ -33,11 +33,12 @@
   function B(){ }
   B.prototype.token = function () { return 'isB'; };
 
-  makeA = function() { return new A(); };
-  makeB = function() { return new B(); };
+  self.makeA = function() { return new A(); };
+  self.makeB = function() { return new B(); };
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 makeA() native;
diff --git a/tests/dart2js/native/foreign_test.dart b/tests/dart2js/native/foreign_test.dart
index 31ab23b..d69efdd 100644
--- a/tests/dart2js/native/foreign_test.dart
+++ b/tests/dart2js/native/foreign_test.dart
@@ -33,7 +33,7 @@
   // Ensure there will be isNaN and NaN variable names.
   var isNaN = called ? 42 : 44;
   var NaN = called ? 52 : 54;
-  Expect.isFalse(JS('bool', 'isNaN(#)', isNaN));
-  Expect.isFalse(JS('bool', 'isNaN(#)', NaN));
-  Expect.isTrue(JS('bool', 'isNaN(#)', double.nan));
+  Expect.isFalse(JS('bool', 'self.isNaN(#)', isNaN));
+  Expect.isFalse(JS('bool', 'self.isNaN(#)', NaN));
+  Expect.isTrue(JS('bool', 'self.isNaN(#)', double.nan));
 }
diff --git a/tests/dart2js/native/hash_code_test.dart b/tests/dart2js/native/hash_code_test.dart
index 137be8f..0b1f391 100644
--- a/tests/dart2js/native/hash_code_test.dart
+++ b/tests/dart2js/native/hash_code_test.dart
@@ -20,12 +20,13 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/issue9182_test.dart b/tests/dart2js/native/issue9182_test.dart
index 62a0a60..0e22af0 100644
--- a/tests/dart2js/native/issue9182_test.dart
+++ b/tests/dart2js/native/issue9182_test.dart
@@ -28,9 +28,10 @@
   JS('', r"""
 (function(){
   function A(){}
-  makeA = function() { return new A() };
+  self.makeA = function() { return new A() };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 makeA() native;
diff --git a/tests/dart2js/native/jsobject_test.dart b/tests/dart2js/native/jsobject_test.dart
index dd0ec8e..0b769d0 100644
--- a/tests/dart2js/native/jsobject_test.dart
+++ b/tests/dart2js/native/jsobject_test.dart
@@ -27,16 +27,17 @@
 void setup() {
   JS('', r"""
 (function(){
-makeA = function(){return {hello: 123};};
+self.makeA = function(){return {hello: 123};};
 
 function BB(){}
-makeB = function(){return new BB();};
+self.makeB = function(){return new BB();};
 
 function QQ(){}
-makeQ = function(){return new QQ();};
+self.makeQ = function(){return new QQ();};
 
 self.nativeConstructor(QQ);
 })()""");
+  applyTestExtensions(['QQ']);
 }
 
 class Is<T> {
diff --git a/tests/dart2js/native/name_conflict_test.dart b/tests/dart2js/native/name_conflict_test.dart
index 555c78e..3294895 100644
--- a/tests/dart2js/native/name_conflict_test.dart
+++ b/tests/dart2js/native/name_conflict_test.dart
@@ -35,9 +35,10 @@
   function I(){}
   I.prototype.read = function() { return this._x; };
   I.prototype.write = function(x) { this._x = x; };
-  makeI = function(){return new I()};
+  self.makeI = function(){return new I()};
   self.nativeConstructor(I);
 })()""");
+  applyTestExtensions(['I']);
 }
 
 // A pure Dart implementation of I.
diff --git a/tests/dart2js/native/native_call_arity1_frog_test.dart b/tests/dart2js/native/native_call_arity1_frog_test.dart
index f590001..e308b69 100644
--- a/tests/dart2js/native/native_call_arity1_frog_test.dart
+++ b/tests/dart2js/native/native_call_arity1_frog_test.dart
@@ -37,12 +37,13 @@
   function B() {}
   B.prototype.foo = function () { return arguments.length; };
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js/native/native_call_arity2_frog_test.dart b/tests/dart2js/native/native_call_arity2_frog_test.dart
index 1646809..32a1b63 100644
--- a/tests/dart2js/native/native_call_arity2_frog_test.dart
+++ b/tests/dart2js/native/native_call_arity2_frog_test.dart
@@ -40,12 +40,13 @@
   B.prototype.foo = function () { return arguments.length; };
   inherits(B, A);
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js/native/native_call_arity3_frog_test.dart b/tests/dart2js/native/native_call_arity3_frog_test.dart
index 3be4585..c33bc38 100644
--- a/tests/dart2js/native/native_call_arity3_frog_test.dart
+++ b/tests/dart2js/native/native_call_arity3_frog_test.dart
@@ -33,12 +33,13 @@
   function B() {}
   B.prototype.foo = function () { return arguments.length; };
 
-  makeA = function(){return new A();};
-  makeB = function(){return new B();};
+  self.makeA = function(){return new A();};
+  self.makeB = function(){return new B();};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js/native/native_checked_arguments1_frog_test.dart b/tests/dart2js/native/native_checked_arguments1_frog_test.dart
index ddce60e..0ae9012 100644
--- a/tests/dart2js/native/native_checked_arguments1_frog_test.dart
+++ b/tests/dart2js/native/native_checked_arguments1_frog_test.dart
@@ -24,6 +24,7 @@
 void setup() {
   JS('', r"""
 (function(){
+  "use strict";
   function A() {}
   A.prototype.foo = function (x) { return x + 1; };
   A.prototype.cmp = function (x) { return 0; };
@@ -32,12 +33,13 @@
   B.prototype.foo = function (x) { return x + 'ha!'; };
   B.prototype.cmp = function (x) { return 1; };
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 expectThrows(action()) {
diff --git a/tests/dart2js/native/native_checked_fields_frog_test.dart b/tests/dart2js/native/native_checked_fields_frog_test.dart
index 76d8902..e87c801 100644
--- a/tests/dart2js/native/native_checked_fields_frog_test.dart
+++ b/tests/dart2js/native/native_checked_fields_frog_test.dart
@@ -28,12 +28,13 @@
 
   function B() {}
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 expectThrows(action()) {
diff --git a/tests/dart2js/native/native_class_avoids_hidden_name_frog_test.dart b/tests/dart2js/native/native_class_avoids_hidden_name_frog_test.dart
index 6e4a95c..dfe9dda 100644
--- a/tests/dart2js/native/native_class_avoids_hidden_name_frog_test.dart
+++ b/tests/dart2js/native/native_class_avoids_hidden_name_frog_test.dart
@@ -32,8 +32,8 @@
 (function(){
   // Poison hidden native names 'BB' and 'CC' to prove the compiler didn't place
   // anything on the hidden native class.
-  BB = null;
-  CC = null;
+  self.BB = null;
+  self.CC = null;
 })()""");
 }
 
@@ -43,11 +43,12 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function BB(){}
   function CC(){}
-  makeA = function(){return new BB()};  // AA is native "BB"
-  makeB = function(){return new CC()};  // BB is native "CC"
+  self.makeA = function(){return new BB()};  // AA is native "BB"
+  self.makeB = function(){return new CC()};  // BB is native "CC"
   self.nativeConstructor(BB);
   self.nativeConstructor(CC);
 })()""");
+  applyTestExtensions(['BB', 'CC']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_class_fields_2_test.dart b/tests/dart2js/native/native_class_fields_2_test.dart
index 6529946..6575857 100644
--- a/tests/dart2js/native/native_class_fields_2_test.dart
+++ b/tests/dart2js/native/native_class_fields_2_test.dart
@@ -37,9 +37,10 @@
     return a;
   }
 
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 A makeA() native;
diff --git a/tests/dart2js/native/native_class_fields_3_test.dart b/tests/dart2js/native/native_class_fields_3_test.dart
index dd2824d..8a53e50 100644
--- a/tests/dart2js/native/native_class_fields_3_test.dart
+++ b/tests/dart2js/native/native_class_fields_3_test.dart
@@ -67,9 +67,10 @@
     return a;
   }
 
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 A makeA() native;
diff --git a/tests/dart2js/native/native_class_fields_test.dart b/tests/dart2js/native/native_class_fields_test.dart
index 64122ac..e0f5300 100644
--- a/tests/dart2js/native/native_class_fields_test.dart
+++ b/tests/dart2js/native/native_class_fields_test.dart
@@ -42,6 +42,7 @@
 makeA = function(){return new A()};
 self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 A makeA() native;
diff --git a/tests/dart2js/native/native_class_inheritance1_frog_test.dart b/tests/dart2js/native/native_class_inheritance1_frog_test.dart
index 322dcba..44c5cb2 100644
--- a/tests/dart2js/native/native_class_inheritance1_frog_test.dart
+++ b/tests/dart2js/native/native_class_inheritance1_frog_test.dart
@@ -57,8 +57,8 @@
   A1.prototype.foo = function(){return 100;};
   B1.prototype.foo = function(){return 200;};
 
-  makeA1 = function(){return new A1()};
-  makeB1 = function(){return new B1()};
+  self.makeA1 = function(){return new A1()};
+  self.makeB1 = function(){return new B1()};
 
   function A2(){}
   function B2(){}
@@ -66,14 +66,15 @@
   A2.prototype.foo = function(a){return a + 10000;};
   B2.prototype.foo = function(z){return z + 20000;};
 
-  makeA2 = function(){return new A2()};
-  makeB2 = function(){return new B2()};
+  self.makeA2 = function(){return new A2()};
+  self.makeB2 = function(){return new B2()};
 
   self.nativeConstructor(A1);
   self.nativeConstructor(A2);
   self.nativeConstructor(B1);
   self.nativeConstructor(B2);
 })()""");
+  applyTestExtensions(['A1', 'A2', 'B1', 'B2']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_class_inheritance2_frog_test.dart b/tests/dart2js/native/native_class_inheritance2_frog_test.dart
index 8fa4b67..66fb625 100644
--- a/tests/dart2js/native/native_class_inheritance2_frog_test.dart
+++ b/tests/dart2js/native/native_class_inheritance2_frog_test.dart
@@ -56,16 +56,17 @@
   A.prototype.foo = function(a){return 'A.foo(' + a + ')'};
   C.prototype.foo = function(z){return 'C.foo(' + z + ')'};
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
-  makeC = function(){return new C()};
-  makeD = function(){return new D()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
+  self.makeC = function(){return new C()};
+  self.makeD = function(){return new D()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
   self.nativeConstructor(D);
 })()""");
+  applyTestExtensions(['A', 'B', 'C', 'D']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_class_inheritance3_frog_test.dart b/tests/dart2js/native/native_class_inheritance3_frog_test.dart
index af5a8e3..d123928 100644
--- a/tests/dart2js/native/native_class_inheritance3_frog_test.dart
+++ b/tests/dart2js/native/native_class_inheritance3_frog_test.dart
@@ -48,24 +48,25 @@
   function B1(){}
   inherits(B1, A1);
 
-  makeA1 = function(){return new A1()};
-  makeB1 = function(){return new B1()};
+  self.makeA1 = function(){return new A1()};
+  self.makeB1 = function(){return new B1()};
 
   function A2(){}
   function B2(){}
   inherits(B2, A2);
   A2.prototype.foo = function(a){return 'A2.foo(' + a  + ')';};
 
-  makeA2 = function(){return new A2()};
-  makeB2 = function(){return new B2()};
+  self.makeA2 = function(){return new A2()};
+  self.makeB2 = function(){return new B2()};
 
-  makeObject = function(){return new Object()};
+  self.makeObject = function(){return new Object()};
 
   self.nativeConstructor(A1);
   self.nativeConstructor(A2);
   self.nativeConstructor(B1);
   self.nativeConstructor(B2);
 })()""");
+  applyTestExtensions(['A1', 'A2', 'B1', 'B2']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_class_inheritance4_frog_test.dart b/tests/dart2js/native/native_class_inheritance4_frog_test.dart
index 25f8fcd..4d65752 100644
--- a/tests/dart2js/native/native_class_inheritance4_frog_test.dart
+++ b/tests/dart2js/native/native_class_inheritance4_frog_test.dart
@@ -52,12 +52,13 @@
   function A(){}
   function B(){}
   inherits(B, A);
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testBasicA_dynamic() {
diff --git a/tests/dart2js/native/native_class_is_check1_frog_test.dart b/tests/dart2js/native/native_class_is_check1_frog_test.dart
index 6b8bb37..266db0e 100644
--- a/tests/dart2js/native/native_class_is_check1_frog_test.dart
+++ b/tests/dart2js/native/native_class_is_check1_frog_test.dart
@@ -29,9 +29,10 @@
   function A(){}
   A.prototype.read = function() { return this._x; };
   A.prototype.write = function(x) { this._x = x; };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 class B {}
diff --git a/tests/dart2js/native/native_class_is_check3_frog_test.dart b/tests/dart2js/native/native_class_is_check3_frog_test.dart
index 98cbf91..1e6f36e 100644
--- a/tests/dart2js/native/native_class_is_check3_frog_test.dart
+++ b/tests/dart2js/native/native_class_is_check3_frog_test.dart
@@ -47,11 +47,12 @@
   inherits(B, A);
   A.prototype.read = function() { return this._x; };
   A.prototype.write = function(x) { this._x = x; };
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 class C {}
diff --git a/tests/dart2js/native/native_class_with_dart_methods_frog_test.dart b/tests/dart2js/native/native_class_with_dart_methods_frog_test.dart
index 574e684..d3cdb09 100644
--- a/tests/dart2js/native/native_class_with_dart_methods_frog_test.dart
+++ b/tests/dart2js/native/native_class_with_dart_methods_frog_test.dart
@@ -24,9 +24,10 @@
   JS('', r"""
 (function(){
   function A() {}
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_closure_identity_frog_test.dart b/tests/dart2js/native/native_closure_identity_frog_test.dart
index c5f5084..9c23278 100644
--- a/tests/dart2js/native/native_closure_identity_frog_test.dart
+++ b/tests/dart2js/native/native_closure_identity_frog_test.dart
@@ -22,10 +22,11 @@
   A.prototype.setClosure = function(f) { this.f = f; };
   A.prototype.check = function(f) { return this.f === f; };
   A.prototype.invoke = function() { return this.f(); };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 var staticClosure;
diff --git a/tests/dart2js/native/native_constructor_name_test.dart b/tests/dart2js/native/native_constructor_name_test.dart
index 9d60a40..e1c7191 100644
--- a/tests/dart2js/native/native_constructor_name_test.dart
+++ b/tests/dart2js/native/native_constructor_name_test.dart
@@ -23,9 +23,10 @@
   JS('', r"""
 (function(){
   function A(){}
-  makeZ = function(){return new A()};
+  self.makeZ = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_equals_frog_test.dart b/tests/dart2js/native/native_equals_frog_test.dart
index 0b460b9..de5844c 100644
--- a/tests/dart2js/native/native_equals_frog_test.dart
+++ b/tests/dart2js/native/native_equals_frog_test.dart
@@ -27,11 +27,12 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_exception2_test.dart b/tests/dart2js/native/native_exception2_test.dart
index 59cf5b0..9ab9ffc 100644
--- a/tests/dart2js/native/native_exception2_test.dart
+++ b/tests/dart2js/native/native_exception2_test.dart
@@ -21,9 +21,10 @@
   JS('', r"""
 (function(){
   function NativeClass() {}
-  makeNativeClass = function() { return new NativeClass(); };
+  self.makeNativeClass = function() { return new NativeClass(); };
   self.nativeConstructor(NativeClass);
 })()""");
+  applyTestExtensions(['NativeClass']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_exceptions1_frog_test.dart b/tests/dart2js/native/native_exceptions1_frog_test.dart
index b9957e8..7585a39 100644
--- a/tests/dart2js/native/native_exceptions1_frog_test.dart
+++ b/tests/dart2js/native/native_exceptions1_frog_test.dart
@@ -47,6 +47,7 @@
   A = null;
   E = null;
 })()""");
+  applyTestExtensions(['E', 'A']);
 }
 
 void setup2() {
@@ -60,7 +61,7 @@
   if (x & 1) throw new E(100);
   return  x / 2;
 };
-makeA = function(){return new A()};
+self.makeA = function(){return new A()};
 
 self.nativeConstructor(E);
 self.nativeConstructor(A);
diff --git a/tests/dart2js/native/native_field_invocation2_test.dart b/tests/dart2js/native/native_field_invocation2_test.dart
index 9c150687..c15ec25 100644
--- a/tests/dart2js/native/native_field_invocation2_test.dart
+++ b/tests/dart2js/native/native_field_invocation2_test.dart
@@ -36,7 +36,7 @@
 void setup() {
   JS('', r"""
 (function(){
-nativeId = function(x) { return x; }
+self.nativeId = function(x) { return x; }
 })()""");
 }
 
diff --git a/tests/dart2js/native/native_field_invocation3_test.dart b/tests/dart2js/native/native_field_invocation3_test.dart
index 9ed3d9c..613f610 100644
--- a/tests/dart2js/native/native_field_invocation3_test.dart
+++ b/tests/dart2js/native/native_field_invocation3_test.dart
@@ -10,9 +10,10 @@
   JS('', r"""
 (function(){
   function CC() {}
-  makeCC = function() { return new CC() };
+  self.makeCC = function() { return new CC() };
   self.nativeConstructor(CC);
 })()""");
+  applyTestExtensions(['CC']);
 }
 
 @Native("CC")
diff --git a/tests/dart2js/native/native_field_invocation4_test.dart b/tests/dart2js/native/native_field_invocation4_test.dart
index afce3c09..0855c72 100644
--- a/tests/dart2js/native/native_field_invocation4_test.dart
+++ b/tests/dart2js/native/native_field_invocation4_test.dart
@@ -18,7 +18,7 @@
 void setup() {
   JS('', r"""
 (function(){
-nativeId = function(x) { return x; }
+self.nativeId = function(x) { return x; }
 })()""");
 }
 
diff --git a/tests/dart2js/native/native_field_invocation5_test.dart b/tests/dart2js/native/native_field_invocation5_test.dart
index abd0169..f2ef30c 100644
--- a/tests/dart2js/native/native_field_invocation5_test.dart
+++ b/tests/dart2js/native/native_field_invocation5_test.dart
@@ -11,10 +11,11 @@
   JS('', r"""
 (function(){
   function CC() {}
-  makeCC = function() { return new CC() };
-  nativeFirst = function(x, y) { return x; };
+  self.makeCC = function() { return new CC() };
+  self.nativeFirst = function(x, y) { return x; };
   self.nativeConstructor(CC);
 })()""");
+  applyTestExtensions(['CC']);
 }
 
 class C {
diff --git a/tests/dart2js/native/native_field_invocation6_test.dart b/tests/dart2js/native/native_field_invocation6_test.dart
index 17ed660..a226bbc 100644
--- a/tests/dart2js/native/native_field_invocation6_test.dart
+++ b/tests/dart2js/native/native_field_invocation6_test.dart
@@ -10,12 +10,13 @@
 void setup() {
   JS('', r"""
 (function(){
-  nativeFirst = function(x, y) { return x; };
+  self.nativeFirst = function(x, y) { return x; };
 
   function A() {}
-  makeA = function() { return new A() };
+  self.makeA = function() { return new A() };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 @Native("A")
diff --git a/tests/dart2js/native/native_field_invocation_test.dart b/tests/dart2js/native/native_field_invocation_test.dart
index e6f13b6..bdda86f 100644
--- a/tests/dart2js/native/native_field_invocation_test.dart
+++ b/tests/dart2js/native/native_field_invocation_test.dart
@@ -18,7 +18,7 @@
 void setup() {
   JS('', r"""
 (function(){
-  nativeId = function(x) { return x; }
+  self.nativeId = function(x) { return x; }
 })()""");
 }
 
diff --git a/tests/dart2js/native/native_field_name_test.dart b/tests/dart2js/native/native_field_name_test.dart
index 89f401f..1b991ca 100644
--- a/tests/dart2js/native/native_field_name_test.dart
+++ b/tests/dart2js/native/native_field_name_test.dart
@@ -43,10 +43,11 @@
     return a;
   }
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 /*A*/ makeA() native;
diff --git a/tests/dart2js/native/native_field_optimization_test.dart b/tests/dart2js/native/native_field_optimization_test.dart
index 5b7e061..7ce2740 100644
--- a/tests/dart2js/native/native_field_optimization_test.dart
+++ b/tests/dart2js/native/native_field_optimization_test.dart
@@ -42,10 +42,11 @@
     }
   });
 
-  makeFoo = function() { return new Foo() };
+  self.makeFoo = function() { return new Foo() };
 
   self.nativeConstructor(Foo);
 })()""");
+  applyTestExtensions(['Foo']);
 }
 
 test1() {
diff --git a/tests/dart2js/native/native_field_rename_1_frog_test.dart b/tests/dart2js/native/native_field_rename_1_frog_test.dart
index 27b4710..7c3202e 100644
--- a/tests/dart2js/native/native_field_rename_1_frog_test.dart
+++ b/tests/dart2js/native/native_field_rename_1_frog_test.dart
@@ -45,12 +45,13 @@
   function X(){}
   X.prototype.key = function(){return 666;};
 
-  makeA = function(){return new A()};
-  makeX = function(){return new X()};
+  self.makeA = function(){return new A()};
+  self.makeX = function(){return new X()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(X);
 })()""");
+  applyTestExtensions(['A', 'X']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js/native/native_field_rename_2_frog_test.dart b/tests/dart2js/native/native_field_rename_2_frog_test.dart
index 93fce23..022c5ce 100644
--- a/tests/dart2js/native/native_field_rename_2_frog_test.dart
+++ b/tests/dart2js/native/native_field_rename_2_frog_test.dart
@@ -48,12 +48,13 @@
   function X(){}
   X.prototype.key = function(){return 666;};
 
-  makeA = function(){return new A()};
-  makeX = function(){return new X()};
+  self.makeA = function(){return new A()};
+  self.makeX = function(){return new X()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(X);
 })()""");
+  applyTestExtensions(['A', 'X']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js/native/native_method_inlining_test.dart b/tests/dart2js/native/native_method_inlining_test.dart
index ba0ee3b..3cdb5e8 100644
--- a/tests/dart2js/native/native_method_inlining_test.dart
+++ b/tests/dart2js/native/native_method_inlining_test.dart
@@ -64,7 +64,7 @@
   A.prototype.foo = function () { return arguments.length; };
   A.prototype.callFun = function (fn) { return fn ? fn(123) : 1; };
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   findMethodTextContaining = function (instance, string) {
     var proto = Object.getPrototypeOf(instance);
@@ -79,6 +79,7 @@
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 void match(String s, String pattern1) {
diff --git a/tests/dart2js/native/native_method_rename1_frog_test.dart b/tests/dart2js/native/native_method_rename1_frog_test.dart
index 5d05694..52ba44f 100644
--- a/tests/dart2js/native/native_method_rename1_frog_test.dart
+++ b/tests/dart2js/native/native_method_rename1_frog_test.dart
@@ -35,10 +35,11 @@
   A.prototype.barA = function(){return 200;};
   A.prototype.bazA = function(){return 300;};
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js/native/native_method_rename2_frog_test.dart b/tests/dart2js/native/native_method_rename2_frog_test.dart
index 35713a2..8db0eca 100644
--- a/tests/dart2js/native/native_method_rename2_frog_test.dart
+++ b/tests/dart2js/native/native_method_rename2_frog_test.dart
@@ -41,12 +41,13 @@
   inherits(B, A);
   B.prototype.fooB = function(){return 200;};
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js/native/native_method_rename3_frog_test.dart b/tests/dart2js/native/native_method_rename3_frog_test.dart
index c5759b2..2100427 100644
--- a/tests/dart2js/native/native_method_rename3_frog_test.dart
+++ b/tests/dart2js/native/native_method_rename3_frog_test.dart
@@ -48,12 +48,13 @@
   inherits(B, A);
   B.prototype.fooB = function(){return 200;};
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js/native/native_method_with_keyword_name_test.dart b/tests/dart2js/native/native_method_with_keyword_name_test.dart
index c535d90..2198634 100644
--- a/tests/dart2js/native/native_method_with_keyword_name_test.dart
+++ b/tests/dart2js/native/native_method_with_keyword_name_test.dart
@@ -19,9 +19,10 @@
 function A() {}
 A.prototype.delete = function() { return 87; };
 
-makeA = function(){return new A()};
+self.makeA = function(){return new A()};
 self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_missing_method1_frog_test.dart b/tests/dart2js/native/native_missing_method1_frog_test.dart
index d0595f6..13e8277 100644
--- a/tests/dart2js/native/native_missing_method1_frog_test.dart
+++ b/tests/dart2js/native/native_missing_method1_frog_test.dart
@@ -14,9 +14,10 @@
 (function(){
   function A() {};
   A.prototype.foo = function() { return  99; };
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 class B {
diff --git a/tests/dart2js/native/native_missing_method2_frog_test.dart b/tests/dart2js/native/native_missing_method2_frog_test.dart
index ae5799f..6e1f694 100644
--- a/tests/dart2js/native/native_missing_method2_frog_test.dart
+++ b/tests/dart2js/native/native_missing_method2_frog_test.dart
@@ -14,9 +14,10 @@
 (function(){
   function A() {};
   A.prototype.foo = function() { return  42; };
-  makeA = function() { return new A() };
+  self.makeA = function() { return new A() };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 class B {
diff --git a/tests/dart2js/native/native_mixin_field2_test.dart b/tests/dart2js/native/native_mixin_field2_test.dart
index 4612391..80370ce 100644
--- a/tests/dart2js/native/native_mixin_field2_test.dart
+++ b/tests/dart2js/native/native_mixin_field2_test.dart
@@ -44,12 +44,13 @@
 (function(){
   function A() {this.foo='A-foo';}
   function B() {A.call(this);this.bar='B-bar';this.baz='M1-baz';}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 @pragma('dart2js:assumeDynamic')
diff --git a/tests/dart2js/native/native_mixin_field_test.dart b/tests/dart2js/native/native_mixin_field_test.dart
index 7f1aebb..e9c80e9 100644
--- a/tests/dart2js/native/native_mixin_field_test.dart
+++ b/tests/dart2js/native/native_mixin_field_test.dart
@@ -34,12 +34,13 @@
 (function(){
   function A() {this.foo='A-foo';}
   function B() {A.call(this);this.bar='B-bar';this.baz='M1-baz';}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_mixin_multiple2_test.dart b/tests/dart2js/native/native_mixin_multiple2_test.dart
index 0747e6b..04f5b71 100644
--- a/tests/dart2js/native/native_mixin_multiple2_test.dart
+++ b/tests/dart2js/native/native_mixin_multiple2_test.dart
@@ -30,10 +30,11 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_mixin_multiple3_test.dart b/tests/dart2js/native/native_mixin_multiple3_test.dart
index 1963186..ac3442d 100644
--- a/tests/dart2js/native/native_mixin_multiple3_test.dart
+++ b/tests/dart2js/native/native_mixin_multiple3_test.dart
@@ -44,14 +44,15 @@
   function A() {}
   function B() {}
   function C() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
-  makeC = function(){return new C()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
+  self.makeC = function(){return new C()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
 })()""");
+  applyTestExtensions(['A', 'B', 'C']);
 }
 
 var g;
diff --git a/tests/dart2js/native/native_mixin_multiple_test.dart b/tests/dart2js/native/native_mixin_multiple_test.dart
index 310d75b..68e6714 100644
--- a/tests/dart2js/native/native_mixin_multiple_test.dart
+++ b/tests/dart2js/native/native_mixin_multiple_test.dart
@@ -34,12 +34,13 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_mixin_test.dart b/tests/dart2js/native/native_mixin_test.dart
index 64bd3e4..2ba3523 100644
--- a/tests/dart2js/native/native_mixin_test.dart
+++ b/tests/dart2js/native/native_mixin_test.dart
@@ -30,12 +30,13 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_mixin_with_plain_test.dart b/tests/dart2js/native/native_mixin_with_plain_test.dart
index 5130caa..e31b904 100644
--- a/tests/dart2js/native/native_mixin_with_plain_test.dart
+++ b/tests/dart2js/native/native_mixin_with_plain_test.dart
@@ -45,12 +45,13 @@
 (function(){
   function A() {this.aa = 'aa'}
   function B() {this.aa = 'bb'}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_named_constructors2_frog_test.dart b/tests/dart2js/native/native_named_constructors2_frog_test.dart
index b200628..8e25687 100644
--- a/tests/dart2js/native/native_named_constructors2_frog_test.dart
+++ b/tests/dart2js/native/native_named_constructors2_frog_test.dart
@@ -31,9 +31,10 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function A(arg) { this._x = arg; }
   A.prototype.foo = function() { return this._x; };
-  makeA = function(arg) { return new A(arg); };
+  self.makeA = function(arg) { return new A(arg); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_named_constructors3_frog_test.dart b/tests/dart2js/native/native_named_constructors3_frog_test.dart
index 949a405..809bca4 100644
--- a/tests/dart2js/native/native_named_constructors3_frog_test.dart
+++ b/tests/dart2js/native/native_named_constructors3_frog_test.dart
@@ -30,9 +30,10 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function A(arg) { this._x = arg; }
   A.prototype.foo = function(){ return this._x; };
-  makeA = function(arg) { return new A(arg); };
+  self.makeA = function(arg) { return new A(arg); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_no_such_method_exception2_frog_test.dart b/tests/dart2js/native/native_no_such_method_exception2_frog_test.dart
index 5df3c12..ccc4787 100644
--- a/tests/dart2js/native/native_no_such_method_exception2_frog_test.dart
+++ b/tests/dart2js/native/native_no_such_method_exception2_frog_test.dart
@@ -31,13 +31,14 @@
     function A() {}
     function B() {}
     inherits(B, A);
-    makeA = function() { return new A() };
-    makeB = function() { return new B() };
+    self.makeA = function() { return new A() };
+    self.makeB = function() { return new B() };
     B.prototype.foo = function() { return 42; };
 
     self.nativeConstructor(A);
     self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_no_such_method_exception_frog_test.dart b/tests/dart2js/native/native_no_such_method_exception_frog_test.dart
index c4a7951..1c8aa01f 100644
--- a/tests/dart2js/native/native_no_such_method_exception_frog_test.dart
+++ b/tests/dart2js/native/native_no_such_method_exception_frog_test.dart
@@ -20,9 +20,10 @@
   JS('', r"""
 (function(){
   function A() {}
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_novel_html_test.dart b/tests/dart2js/native/native_novel_html_test.dart
index 3738ff0..cafd607 100644
--- a/tests/dart2js/native/native_novel_html_test.dart
+++ b/tests/dart2js/native/native_novel_html_test.dart
@@ -23,17 +23,18 @@
   HTMLGoofyElement.prototype.nativeMethod = function(a) {
     return 'Goofy.nativeMethod(' + a  + ')';
   };
-  makeE = function(){return new HTMLGoofyElement()};
+  self.makeE = function(){return new HTMLGoofyElement()};
 
   // A non-HTML element with a misleading name.
   function HTMLFakeyElement(){}
   HTMLFakeyElement.prototype.nativeMethod = function(a) {
     return 'Fakey.nativeMethod(' + a  + ')';
   };
-  makeF = function(){return new HTMLFakeyElement()};
+  self.makeF = function(){return new HTMLFakeyElement()};
 
   self.nativeConstructor(HTMLGoofyElement);
 })()""");
+  applyTestExtensions(['HTMLElement']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart b/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart
index 049cd36..85a5540 100644
--- a/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart
+++ b/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart
@@ -41,10 +41,10 @@
   AAA.prototype.method2 = function(){return this._m2};
   AAA.prototype.optMethod = function(){return this._m2};
 
-  makeA = function() {
+  self.makeA = function() {
     return new AAA(100, 'Albert', 200, 'amazing!');
   };
-  makeAX = function() {
+  self.makeAX = function() {
     return new AAA(void 0, void 0, void 0, void 0);
   };
 
@@ -55,15 +55,16 @@
     this.optName = n;
   }
 
-  makeC = function() {
+  self.makeC = function() {
     return new CCC('Carol');
   };
-  makeCX = function() {
+  self.makeCX = function() {
     return new CCC(void 0);
   };
 
   self.nativeConstructor(CCC);
 })()""");
+  applyTestExtensions(['AAA', 'CCC']);
 }
 
 // The 'NativeInterface' version of the code is passed both native and Dart
diff --git a/tests/dart2js/native/native_null_closure_frog_test.dart b/tests/dart2js/native/native_null_closure_frog_test.dart
index f5fd85e..7e18b4e 100644
--- a/tests/dart2js/native/native_null_closure_frog_test.dart
+++ b/tests/dart2js/native/native_null_closure_frog_test.dart
@@ -24,10 +24,11 @@
   A.prototype.setClosure = function(f) { this.f = f; };
   A.prototype.check = function(f) { return this.f === f; };
   A.prototype.invoke = function() { return this.f(); };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_null_frog_test.dart b/tests/dart2js/native/native_null_frog_test.dart
index 0abdd35..359562b 100644
--- a/tests/dart2js/native/native_null_frog_test.dart
+++ b/tests/dart2js/native/native_null_frog_test.dart
@@ -24,9 +24,10 @@
   A.prototype.returnUndefined = function() { return void 0; };
   A.prototype.returnEmptyString = function() { return ""; };
   A.prototype.returnZero = function() { return 0; };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 @pragma('dart2js:noInline')
diff --git a/tests/dart2js/native/native_property_frog_test.dart b/tests/dart2js/native/native_property_frog_test.dart
index 0c4d3ef..1fd10b8 100644
--- a/tests/dart2js/native/native_property_frog_test.dart
+++ b/tests/dart2js/native/native_property_frog_test.dart
@@ -38,10 +38,11 @@
     set: function (v) { this._x = v; }
   });
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_testing.dart b/tests/dart2js/native/native_testing.dart
index 5dcaa24..bc214b5 100644
--- a/tests/dart2js/native/native_testing.dart
+++ b/tests/dart2js/native/native_testing.dart
@@ -10,7 +10,8 @@
 import 'dart:_foreign_helper' show JS;
 
 export "package:expect/expect.dart";
-export 'dart:_js_helper' show Creates, Native, JSName, Returns;
+export 'dart:_js_helper'
+    show Creates, Native, JSName, Returns, applyTestExtensions;
 export 'dart:_foreign_helper' show JS;
 
 void nativeTesting() {
@@ -35,9 +36,14 @@
   //     self.nativeConstructor(Foo);
   //
   // to the JavaScript code.
+  //
+  // Internally this exports the name on the top scope (needed for dartdevc) and
+  // overrides the toString show the name of the constructor like browsers do
+  // for native types (needed for dart2js).
   self.nativeConstructor = function(constructor, opt_name) {
     var toStringResult = "[object " + (opt_name || constructor.name) + "]";
     constructor[toStringResultProperty] = toStringResult;
+    self[constructor.name] = constructor;
   };
 })())
 ''');
diff --git a/tests/dart2js/native/native_to_string_frog_test.dart b/tests/dart2js/native/native_to_string_frog_test.dart
index 6fdca6f..eadce8f 100644
--- a/tests/dart2js/native/native_to_string_frog_test.dart
+++ b/tests/dart2js/native/native_to_string_frog_test.dart
@@ -15,9 +15,10 @@
   JS('', r"""
 (function(){
   function A() {}
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_use_native_name_in_table_frog_test.dart b/tests/dart2js/native/native_use_native_name_in_table_frog_test.dart
index 0bd930a..44dc4cf 100644
--- a/tests/dart2js/native/native_use_native_name_in_table_frog_test.dart
+++ b/tests/dart2js/native/native_use_native_name_in_table_frog_test.dart
@@ -36,12 +36,13 @@
   inherits(NativeB, NativeA);
   NativeA.prototype.foo = function() { return 42; };
 
-  makeA = function(){return new NativeA()};
-  makeB = function(){return new NativeB()};
+  self.makeA = function(){return new NativeA()};
+  self.makeB = function(){return new NativeB()};
 
   self.nativeConstructor(NativeA);
   self.nativeConstructor(NativeB);
 })()""");
+  applyTestExtensions(['NativeA', 'NativeB']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_wrapping_function3_frog_test.dart b/tests/dart2js/native/native_wrapping_function3_frog_test.dart
index 111e2f5..cfe6fee 100644
--- a/tests/dart2js/native/native_wrapping_function3_frog_test.dart
+++ b/tests/dart2js/native/native_wrapping_function3_frog_test.dart
@@ -24,9 +24,10 @@
   A.prototype.foo2 = function(closure, arg1, arg2) {
     return closure(arg1, arg2);
   };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/native_wrapping_function_frog_test.dart b/tests/dart2js/native/native_wrapping_function_frog_test.dart
index 53473b8..8a9984f 100644
--- a/tests/dart2js/native/native_wrapping_function_frog_test.dart
+++ b/tests/dart2js/native/native_wrapping_function_frog_test.dart
@@ -26,9 +26,10 @@
   A.prototype.foo2 = function(closure, arg1, arg2) {
     return closure(arg1, arg2);
   };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js/native/oddly_named_fields_test.dart b/tests/dart2js/native/oddly_named_fields_test.dart
index 7a93c95..4eda90a 100644
--- a/tests/dart2js/native/oddly_named_fields_test.dart
+++ b/tests/dart2js/native/oddly_named_fields_test.dart
@@ -1385,9 +1385,10 @@
   JS('', r"""
 (function(){
   function NativeClassWithOddNames() {}
-  makeNativeClassWithOddNames = function() {return new NativeClassWithOddNames()};
+  self.makeNativeClassWithOddNames = function() {return new NativeClassWithOddNames()};
   self.nativeConstructor(NativeClassWithOddNames);
 })()""");
+  applyTestExtensions(['NativeClassWithOddNames']);
 }
 
 main() {
diff --git a/tests/dart2js/native/runtimetype_test.dart b/tests/dart2js/native/runtimetype_test.dart
index 558f7ee..4581e3b 100644
--- a/tests/dart2js/native/runtimetype_test.dart
+++ b/tests/dart2js/native/runtimetype_test.dart
@@ -31,12 +31,13 @@
   function TAGY(){}
   inherits(TAGY, TAGX);
 
-  makeA = function(){return new TAGX()};
-  makeB = function(){return new TAGY()};
+  self.makeA = function(){return new TAGX()};
+  self.makeB = function(){return new TAGY()};
 
   self.nativeConstructor(TAGX);
   self.nativeConstructor(TAGY);
 })()""");
+  applyTestExtensions(['TAGX', 'TAGY']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js/native/subclassing_1_test.dart b/tests/dart2js/native/subclassing_1_test.dart
index 77a636f..c34f307 100644
--- a/tests/dart2js/native/subclassing_1_test.dart
+++ b/tests/dart2js/native/subclassing_1_test.dart
@@ -35,13 +35,13 @@
   function A() {}
   function B() {}
   function C() {}
-  makeA = function(){return new A()};
-  makeB1 = function(){return new B()};
-  makeB2 = function(){return new B()};
-  makeC = function(){return new C()};
+  self.makeA = function(){return new A()};
+  self.makeB1 = function(){return new B()};
+  self.makeB2 = function(){return new B()};
+  self.makeC = function(){return new C()};
 
-  getBPrototype = function(){return B.prototype;};
-  getCPrototype = function(){return C.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
+  self.getCPrototype = function(){return C.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_2_test.dart b/tests/dart2js/native/subclassing_2_test.dart
index 66c8d68..7fcef99 100644
--- a/tests/dart2js/native/subclassing_2_test.dart
+++ b/tests/dart2js/native/subclassing_2_test.dart
@@ -32,10 +32,10 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_3_test.dart b/tests/dart2js/native/subclassing_3_test.dart
index 5a2c3d9..b7f89d3 100644
--- a/tests/dart2js/native/subclassing_3_test.dart
+++ b/tests/dart2js/native/subclassing_3_test.dart
@@ -38,9 +38,9 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B();};
+  self.makeB = function(){return new B();};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_4_test.dart b/tests/dart2js/native/subclassing_4_test.dart
index 07a2d4c..7dd5e72 100644
--- a/tests/dart2js/native/subclassing_4_test.dart
+++ b/tests/dart2js/native/subclassing_4_test.dart
@@ -36,8 +36,8 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
-  getBPrototype = function(){return B.prototype;};
+  self.makeB = function(){return new B()};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_5_test.dart b/tests/dart2js/native/subclassing_5_test.dart
index 220563b..553b1f8 100644
--- a/tests/dart2js/native/subclassing_5_test.dart
+++ b/tests/dart2js/native/subclassing_5_test.dart
@@ -43,8 +43,8 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
-  getBPrototype = function(){return B.prototype;};
+  self.makeB = function(){return new B()};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_constructor_1_test.dart b/tests/dart2js/native/subclassing_constructor_1_test.dart
index 45934f8..8570020 100644
--- a/tests/dart2js/native/subclassing_constructor_1_test.dart
+++ b/tests/dart2js/native/subclassing_constructor_1_test.dart
@@ -65,9 +65,9 @@
 (function(){
   function B() { this.a2 = 102; }
 
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_super_call_test.dart b/tests/dart2js/native/subclassing_super_call_test.dart
index b157933..124f463 100644
--- a/tests/dart2js/native/subclassing_super_call_test.dart
+++ b/tests/dart2js/native/subclassing_super_call_test.dart
@@ -50,9 +50,9 @@
   N2.prototype.foo = function() { return "foo:" + this.text; };
   function BB() {}
   BB.prototype.__proto__ = N2.prototype;
-  makeBB = function(){return new BB()};
+  self.makeBB = function(){return new BB()};
 
-  getBBPrototype = function(){return BB.prototype;};
+  self.getBBPrototype = function(){return BB.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_super_field_1_test.dart b/tests/dart2js/native/subclassing_super_field_1_test.dart
index 827cb358..68bd8d3 100644
--- a/tests/dart2js/native/subclassing_super_field_1_test.dart
+++ b/tests/dart2js/native/subclassing_super_field_1_test.dart
@@ -36,9 +36,9 @@
   JS('', r"""
 (function(){
 function B() { }
-makeB = function(){return new B()};
+self.makeB = function(){return new B()};
 
-getBPrototype = function(){return B.prototype;};
+self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_super_field_2_test.dart b/tests/dart2js/native/subclassing_super_field_2_test.dart
index 837568a..79c7016 100644
--- a/tests/dart2js/native/subclassing_super_field_2_test.dart
+++ b/tests/dart2js/native/subclassing_super_field_2_test.dart
@@ -40,9 +40,9 @@
   JS('', r"""
 (function(){
   function B() { this.foo = 111; }  // N.foo
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/subclassing_type_test.dart b/tests/dart2js/native/subclassing_type_test.dart
index ce52e5b..e5cc2be 100644
--- a/tests/dart2js/native/subclassing_type_test.dart
+++ b/tests/dart2js/native/subclassing_type_test.dart
@@ -33,9 +33,9 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js/native/super_call_test.dart b/tests/dart2js/native/super_call_test.dart
index 5238bb5..ebae644 100644
--- a/tests/dart2js/native/super_call_test.dart
+++ b/tests/dart2js/native/super_call_test.dart
@@ -59,16 +59,17 @@
   function D(){}
   inherits(D, C);
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
-  makeC = function(){return new C()};
-  makeD = function(){return new D()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
+  self.makeC = function(){return new C()};
+  self.makeD = function(){return new D()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
   self.nativeConstructor(D);
 })()""");
+  applyTestExtensions(['A', 'B', 'C', 'D']);
 }
 
 main() {
diff --git a/tests/dart2js/native/super_property_test.dart b/tests/dart2js/native/super_property_test.dart
index 68e815a..9482cb7 100644
--- a/tests/dart2js/native/super_property_test.dart
+++ b/tests/dart2js/native/super_property_test.dart
@@ -46,11 +46,12 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function A(){}
   function B(){}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testThing(a) {
diff --git a/tests/dart2js_2/native/abstract_class_test.dart b/tests/dart2js_2/native/abstract_class_test.dart
index 988157c..2657b25 100644
--- a/tests/dart2js_2/native/abstract_class_test.dart
+++ b/tests/dart2js_2/native/abstract_class_test.dart
@@ -29,12 +29,12 @@
   function A(){}
   function B(){}
   B.prototype.foo = function() { return 'B.foo'; };
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
   self.nativeConstructor(A);
   self.nativeConstructor(B);
-})()
-""");
+})()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/bound_closure_test.dart b/tests/dart2js_2/native/bound_closure_test.dart
index 09bc341..8b6f309 100644
--- a/tests/dart2js_2/native/bound_closure_test.dart
+++ b/tests/dart2js_2/native/bound_closure_test.dart
@@ -42,13 +42,14 @@
     return 'CC.foo(' + u + ', ' + v + ')';
   };
 
-  makeBB = function(){return new BB()};
-  makeCC = function(){return new CC()};
-  inscrutable = function(a){return a;};
+  self.makeBB = function(){return new BB()};
+  self.makeCC = function(){return new CC()};
+  self.inscrutable = function(a){return a;};
 
   self.nativeConstructor(BB);
   self.nativeConstructor(CC);
 })()""");
+  applyTestExtensions(['BB', 'CC']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/browser_compat_1_prepatched_test.dart b/tests/dart2js_2/native/browser_compat_1_prepatched_test.dart
index 01fb0fe..895029e 100644
--- a/tests/dart2js_2/native/browser_compat_1_prepatched_test.dart
+++ b/tests/dart2js_2/native/browser_compat_1_prepatched_test.dart
@@ -39,9 +39,9 @@
   window.T1A = T1A;
   window.T1CrazyB = T1CrazyB;
 
-  makeT1A = function(){return new T1A()};
-  makeT1B = function(){return new T1CrazyB()};
-  makeT1C = function(){return new T1fakeA()};
+  self.makeT1A = function(){return new T1A()};
+  self.makeT1B = function(){return new T1CrazyB()};
+  self.makeT1C = function(){return new T1fakeA()};
 
   self.nativeConstructor(T1A);
   self.nativeConstructor(T1CrazyB);
@@ -73,6 +73,7 @@
 
   dartNativeDispatchHooksTransformer = [transformer1];
 })()''');
+  applyTestExtensions(['T1A', 'T1CrazyB', 'T1fakeA']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/browser_compat_1_unpatched_test.dart b/tests/dart2js_2/native/browser_compat_1_unpatched_test.dart
index 1f1e0fc..c08dd57 100644
--- a/tests/dart2js_2/native/browser_compat_1_unpatched_test.dart
+++ b/tests/dart2js_2/native/browser_compat_1_unpatched_test.dart
@@ -40,9 +40,9 @@
   window.T1A = T1A;
   window.T1CrazyB = T1CrazyB;
 
-  makeT1A = function(){return new T1A()};
-  makeT1B = function(){return new T1CrazyB()};
-  makeT1C = function(){return new T1fakeA()};
+  self.makeT1A = function(){return new T1A()};
+  self.makeT1B = function(){return new T1CrazyB()};
+  self.makeT1C = function(){return new T1fakeA()};
 
   self.nativeConstructor(T1A);
   self.nativeConstructor(T1CrazyB);
@@ -76,6 +76,7 @@
 
   dartNativeDispatchHooksTransformer = [transformer1];
 })()""");
+  applyTestExtensions(['T1A', 'T1CrazyB', 'T1fakeA']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/browser_compat_2_test.dart b/tests/dart2js_2/native/browser_compat_2_test.dart
index 349c9a7..1a404f5 100644
--- a/tests/dart2js_2/native/browser_compat_2_test.dart
+++ b/tests/dart2js_2/native/browser_compat_2_test.dart
@@ -106,6 +106,7 @@
 
 dartNativeDispatchHooksTransformer = [transformer1, transformer2];
 })()''');
+  applyTestExtensions(['T1A', 'T1B', 'T1C', 'T1D']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/core_type_check_native_test.dart b/tests/dart2js_2/native/core_type_check_native_test.dart
index a7b6d8b..8bdeee9 100644
--- a/tests/dart2js_2/native/core_type_check_native_test.dart
+++ b/tests/dart2js_2/native/core_type_check_native_test.dart
@@ -33,20 +33,20 @@
   JS('', r"""
 (function(){
   function A() {};
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   function B() {};
-  makeB = function() { return new B(); };
+  self.makeB = function() { return new B(); };
   function C() {};
-  makeC = function() { return new C(); };
+  self.makeC = function() { return new C(); };
   function D() {};
-  makeD = function() { return new D(); };
+  self.makeD = function() { return new D(); };
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
   self.nativeConstructor(D);
-})()
-""");
+})()""");
+  applyTestExtensions(['A', 'B', 'C', 'D']);
 }
 
 checkTest(value, expectComparable, expectPattern) {
diff --git a/tests/dart2js_2/native/dispatch_property_initialization_test.dart b/tests/dart2js_2/native/dispatch_property_initialization_test.dart
index d5c90b7..de6a9a9 100644
--- a/tests/dart2js_2/native/dispatch_property_initialization_test.dart
+++ b/tests/dart2js_2/native/dispatch_property_initialization_test.dart
@@ -25,6 +25,7 @@
 
   self.nativeConstructor(Foo);
 })()""");
+  applyTestExtensions(['Foo']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/downcast_test.dart b/tests/dart2js_2/native/downcast_test.dart
index f479b77..90e744b 100644
--- a/tests/dart2js_2/native/downcast_test.dart
+++ b/tests/dart2js_2/native/downcast_test.dart
@@ -48,12 +48,13 @@
 inherits(B, A);
 A.prototype.read = function() { return this._x; };
 A.prototype.write = function(x) { this._x = x; };
-makeA = function(){return new A()};
-makeB = function(){return new B()};
+self.makeA = function(){return new A()};
+self.makeB = function(){return new B()};
 
 self.nativeConstructor(A);
 self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 class C {}
diff --git a/tests/dart2js_2/native/error_safeToString_test.dart b/tests/dart2js_2/native/error_safeToString_test.dart
index 8b9acce0..cc9acbc 100644
--- a/tests/dart2js_2/native/error_safeToString_test.dart
+++ b/tests/dart2js_2/native/error_safeToString_test.dart
@@ -38,45 +38,46 @@
 void setup() {
   JS('', r"""
 (function(){
-  makeA = function(){return {hello: 123};};
+  self.makeA = function(){return {hello: 123};};
 
   function BB(){}
-  makeB = function(){return new BB();};
+  self.makeB = function(){return new BB();};
 
   function CC(){}
-  makeC = function(){
+  self.makeC = function(){
     var x = new CC();
     x.constructor = null;  // Foils constructor lookup.
     return x;
   };
 
   function DD(){}
-  makeD = function(){
+  self.makeD = function(){
     var x = new DD();
     x.constructor = {name: 'DDxxx'};  // Foils constructor lookup.
     return x;
   };
 
   function EE(){}
-  makeE = function(){
+  self.makeE = function(){
     var x = new EE();
     x.constructor = function Liar(){};  // Looks like a legitimate constructor.
     return x;
   };
 
   function PPPP(){}
-  makeP = function(){return new PPPP();};
+  self.makeP = function(){return new PPPP();};
 
   function QQQQ(){}
-  makeQ = function(){return new QQQQ();};
+  self.makeQ = function(){return new QQQQ();};
 
   function RRRR(){}
-  makeR = function(){return new RRRR();};
+  self.makeR = function(){return new RRRR();};
 
   self.nativeConstructor(PPPP);
   self.nativeConstructor(QQQQ);
   self.nativeConstructor(RRRR);
 })()""");
+  applyTestExtensions(['PPPP', 'QQQQ', 'RRRR']);
 }
 
 expectTypeName(expectedName, s) {
diff --git a/tests/dart2js_2/native/event_loop_test.dart b/tests/dart2js_2/native/event_loop_test.dart
index 1fc7b1d..45f57ec 100644
--- a/tests/dart2js_2/native/event_loop_test.dart
+++ b/tests/dart2js_2/native/event_loop_test.dart
@@ -22,9 +22,10 @@
 (function(){
 function A() {}
 A.prototype.foo = function(f) { return f(); };
-makeA = function() { return new A(); };
+self.makeA = function() { return new A(); };
 self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/fake_thing_2_test.dart b/tests/dart2js_2/native/fake_thing_2_test.dart
index 7209073..e1634c4 100644
--- a/tests/dart2js_2/native/fake_thing_2_test.dart
+++ b/tests/dart2js_2/native/fake_thing_2_test.dart
@@ -25,14 +25,15 @@
 (function(){
   function A() {}
   A.prototype.$isThing = true;
-  make1 = function(){return new A()};
-  make2 = function(){return {$isThing: true}};
+  self.make1 = function(){return new A()};
+  self.make2 = function(){return {$isThing: true}};
   function NT() {}
   NT.prototype.$isThing = true;
-  make3 = function(){return new NT()};
+  self.make3 = function(){return new NT()};
 
   self.nativeConstructor(NT);
 })()""");
+  applyTestExtensions(['NT']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/fake_thing_test.dart b/tests/dart2js_2/native/fake_thing_test.dart
index 63fda12..5d83f94 100644
--- a/tests/dart2js_2/native/fake_thing_test.dart
+++ b/tests/dart2js_2/native/fake_thing_test.dart
@@ -23,8 +23,8 @@
 (function(){
   function A() {}
   A.prototype.$isThing = true;
-  make1 = function(){return new A();};
-  make2 = function(){return {$isThing: true}};
+  self.make1 = function(){return new A();};
+  self.make2 = function(){return {$isThing: true}};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/field_type2_test.dart b/tests/dart2js_2/native/field_type2_test.dart
index 2a9ff0c..113987f 100644
--- a/tests/dart2js_2/native/field_type2_test.dart
+++ b/tests/dart2js_2/native/field_type2_test.dart
@@ -21,10 +21,11 @@
 (function(){
 // This code is all inside 'setup' and so not accessible from the global scope.
 function Node(parent){ this.parentNode = parent; }
-makeNode = function(p){return new Node(p);};
+self.makeNode = function(p){return new Node(p);};
 
 self.nativeConstructor(Node);
 })()""");
+  applyTestExtensions(['Node']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/field_type_test.dart b/tests/dart2js_2/native/field_type_test.dart
index 7ce0db3..c5b3be2 100644
--- a/tests/dart2js_2/native/field_type_test.dart
+++ b/tests/dart2js_2/native/field_type_test.dart
@@ -50,9 +50,10 @@
 (function(){
   // This code is inside 'setup' and so not accessible from the global scope.
   function Node(parent){ this.parentNode = parent; }
-  makeNode = function(p){return new Node(p);};
+  self.makeNode = function(p){return new Node(p);};
   self.nativeConstructor(Node);
 })()""");
+  applyTestExtensions(['Node']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/fixup_get_tag_test.dart b/tests/dart2js_2/native/fixup_get_tag_test.dart
index 8853041..4f5bbee 100644
--- a/tests/dart2js_2/native/fixup_get_tag_test.dart
+++ b/tests/dart2js_2/native/fixup_get_tag_test.dart
@@ -35,11 +35,12 @@
   function B(){ }
   B.prototype.token = function () { return 'isB'; };
 
-  makeA = function() { return new A(); };
-  makeB = function() { return new B(); };
+  self.makeA = function() { return new A(); };
+  self.makeB = function() { return new B(); };
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 makeA() native;
diff --git a/tests/dart2js_2/native/hash_code_test.dart b/tests/dart2js_2/native/hash_code_test.dart
index 9024625..6debbae 100644
--- a/tests/dart2js_2/native/hash_code_test.dart
+++ b/tests/dart2js_2/native/hash_code_test.dart
@@ -22,12 +22,13 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/issue9182_test.dart b/tests/dart2js_2/native/issue9182_test.dart
index cfbb2b2..8b6f819 100644
--- a/tests/dart2js_2/native/issue9182_test.dart
+++ b/tests/dart2js_2/native/issue9182_test.dart
@@ -30,9 +30,10 @@
   JS('', r"""
 (function(){
   function A(){}
-  makeA = function() { return new A() };
+  self.makeA = function() { return new A() };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 makeA() native;
diff --git a/tests/dart2js_2/native/jsobject_test.dart b/tests/dart2js_2/native/jsobject_test.dart
index f5febe0..5b8ed68 100644
--- a/tests/dart2js_2/native/jsobject_test.dart
+++ b/tests/dart2js_2/native/jsobject_test.dart
@@ -29,16 +29,17 @@
 void setup() {
   JS('', r"""
 (function(){
-makeA = function(){return {hello: 123};};
+self.makeA = function(){return {hello: 123};};
 
 function BB(){}
-makeB = function(){return new BB();};
+self.makeB = function(){return new BB();};
 
 function QQ(){}
-makeQ = function(){return new QQ();};
+self.makeQ = function(){return new QQ();};
 
 self.nativeConstructor(QQ);
 })()""");
+  applyTestExtensions(['QQ']);
 }
 
 class Is<T> {
diff --git a/tests/dart2js_2/native/name_conflict_test.dart b/tests/dart2js_2/native/name_conflict_test.dart
index d39bf3b..ef72d1c 100644
--- a/tests/dart2js_2/native/name_conflict_test.dart
+++ b/tests/dart2js_2/native/name_conflict_test.dart
@@ -37,9 +37,10 @@
   function I(){}
   I.prototype.read = function() { return this._x; };
   I.prototype.write = function(x) { this._x = x; };
-  makeI = function(){return new I()};
+  self.makeI = function(){return new I()};
   self.nativeConstructor(I);
 })()""");
+  applyTestExtensions(['I']);
 }
 
 // A pure Dart implementation of I.
diff --git a/tests/dart2js_2/native/native_call_arity1_frog_test.dart b/tests/dart2js_2/native/native_call_arity1_frog_test.dart
index c7041fd..35549c1 100644
--- a/tests/dart2js_2/native/native_call_arity1_frog_test.dart
+++ b/tests/dart2js_2/native/native_call_arity1_frog_test.dart
@@ -39,12 +39,13 @@
   function B() {}
   B.prototype.foo = function () { return arguments.length; };
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js_2/native/native_call_arity2_frog_test.dart b/tests/dart2js_2/native/native_call_arity2_frog_test.dart
index b66ddce..7be1152 100644
--- a/tests/dart2js_2/native/native_call_arity2_frog_test.dart
+++ b/tests/dart2js_2/native/native_call_arity2_frog_test.dart
@@ -42,12 +42,13 @@
   B.prototype.foo = function () { return arguments.length; };
   inherits(B, A);
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js_2/native/native_call_arity3_frog_test.dart b/tests/dart2js_2/native/native_call_arity3_frog_test.dart
index 28e0412..bf4435c 100644
--- a/tests/dart2js_2/native/native_call_arity3_frog_test.dart
+++ b/tests/dart2js_2/native/native_call_arity3_frog_test.dart
@@ -35,12 +35,13 @@
   function B() {}
   B.prototype.foo = function () { return arguments.length; };
 
-  makeA = function(){return new A();};
-  makeB = function(){return new B();};
+  self.makeA = function(){return new A();};
+  self.makeB = function(){return new B();};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js_2/native/native_checked_arguments1_frog_test.dart b/tests/dart2js_2/native/native_checked_arguments1_frog_test.dart
index ff52fa3..23fcc34 100644
--- a/tests/dart2js_2/native/native_checked_arguments1_frog_test.dart
+++ b/tests/dart2js_2/native/native_checked_arguments1_frog_test.dart
@@ -34,12 +34,13 @@
   B.prototype.foo = function (x) { return x + 'ha!'; };
   B.prototype.cmp = function (x) { return 1; };
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 expectThrows(action()) {
diff --git a/tests/dart2js_2/native/native_checked_fields_frog_test.dart b/tests/dart2js_2/native/native_checked_fields_frog_test.dart
index 76f512d..df76fdb 100644
--- a/tests/dart2js_2/native/native_checked_fields_frog_test.dart
+++ b/tests/dart2js_2/native/native_checked_fields_frog_test.dart
@@ -28,12 +28,13 @@
 
   function B() {}
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 expectThrows(action()) {
diff --git a/tests/dart2js_2/native/native_class_avoids_hidden_name_frog_test.dart b/tests/dart2js_2/native/native_class_avoids_hidden_name_frog_test.dart
index 488cd67..d183807 100644
--- a/tests/dart2js_2/native/native_class_avoids_hidden_name_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_avoids_hidden_name_frog_test.dart
@@ -37,6 +37,7 @@
   BB = null;
   CC = null;
 })()""");
+  applyTestExtensions(['BB', 'CC']);
 }
 
 void setup2() {
@@ -45,8 +46,8 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function BB(){}
   function CC(){}
-  makeA = function(){return new BB()};  // AA is native "BB"
-  makeB = function(){return new CC()};  // BB is native "CC"
+  self.makeA = function(){return new BB()};  // AA is native "BB"
+  self.makeB = function(){return new CC()};  // BB is native "CC"
   self.nativeConstructor(BB);
   self.nativeConstructor(CC);
 })()""");
diff --git a/tests/dart2js_2/native/native_class_fields_2_test.dart b/tests/dart2js_2/native/native_class_fields_2_test.dart
index b8b031e..1d11429 100644
--- a/tests/dart2js_2/native/native_class_fields_2_test.dart
+++ b/tests/dart2js_2/native/native_class_fields_2_test.dart
@@ -35,9 +35,10 @@
     return a;
   }
 
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 A makeA() native;
diff --git a/tests/dart2js_2/native/native_class_fields_3_test.dart b/tests/dart2js_2/native/native_class_fields_3_test.dart
index ad96532..98791e9 100644
--- a/tests/dart2js_2/native/native_class_fields_3_test.dart
+++ b/tests/dart2js_2/native/native_class_fields_3_test.dart
@@ -61,9 +61,10 @@
     return a;
   }
 
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 A makeA() native;
diff --git a/tests/dart2js_2/native/native_class_fields_test.dart b/tests/dart2js_2/native/native_class_fields_test.dart
index a960803..1239904 100644
--- a/tests/dart2js_2/native/native_class_fields_test.dart
+++ b/tests/dart2js_2/native/native_class_fields_test.dart
@@ -42,6 +42,7 @@
 makeA = function(){return new A()};
 self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 A makeA() native;
diff --git a/tests/dart2js_2/native/native_class_inheritance1_frog_test.dart b/tests/dart2js_2/native/native_class_inheritance1_frog_test.dart
index 298a5f7..e527e3e 100644
--- a/tests/dart2js_2/native/native_class_inheritance1_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_inheritance1_frog_test.dart
@@ -59,8 +59,8 @@
   A1.prototype.foo = function(){return 100;};
   B1.prototype.foo = function(){return 200;};
 
-  makeA1 = function(){return new A1()};
-  makeB1 = function(){return new B1()};
+  self.makeA1 = function(){return new A1()};
+  self.makeB1 = function(){return new B1()};
 
   function A2(){}
   function B2(){}
@@ -68,14 +68,15 @@
   A2.prototype.foo = function(a){return a + 10000;};
   B2.prototype.foo = function(z){return z + 20000;};
 
-  makeA2 = function(){return new A2()};
-  makeB2 = function(){return new B2()};
+  self.makeA2 = function(){return new A2()};
+  self.makeB2 = function(){return new B2()};
 
   self.nativeConstructor(A1);
   self.nativeConstructor(A2);
   self.nativeConstructor(B1);
   self.nativeConstructor(B2);
 })()""");
+  applyTestExtensions(['A1', 'A2', 'B1', 'B2']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_class_inheritance2_frog_test.dart b/tests/dart2js_2/native/native_class_inheritance2_frog_test.dart
index 865ff93..489502c 100644
--- a/tests/dart2js_2/native/native_class_inheritance2_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_inheritance2_frog_test.dart
@@ -58,16 +58,17 @@
   A.prototype.foo = function(a){return 'A.foo(' + a + ')'};
   C.prototype.foo = function(z){return 'C.foo(' + z + ')'};
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
-  makeC = function(){return new C()};
-  makeD = function(){return new D()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
+  self.makeC = function(){return new C()};
+  self.makeD = function(){return new D()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
   self.nativeConstructor(D);
 })()""");
+  applyTestExtensions(['A', 'B', 'C', 'D']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_class_inheritance3_frog_test.dart b/tests/dart2js_2/native/native_class_inheritance3_frog_test.dart
index d6bc323..73834f4 100644
--- a/tests/dart2js_2/native/native_class_inheritance3_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_inheritance3_frog_test.dart
@@ -50,24 +50,25 @@
   function B1(){}
   inherits(B1, A1);
 
-  makeA1 = function(){return new A1()};
-  makeB1 = function(){return new B1()};
+  self.makeA1 = function(){return new A1()};
+  self.makeB1 = function(){return new B1()};
 
   function A2(){}
   function B2(){}
   inherits(B2, A2);
   A2.prototype.foo = function(a){return 'A2.foo(' + a  + ')';};
 
-  makeA2 = function(){return new A2()};
-  makeB2 = function(){return new B2()};
+  self.makeA2 = function(){return new A2()};
+  self.makeB2 = function(){return new B2()};
 
-  makeObject = function(){return new Object()};
+  self.makeObject = function(){return new Object()};
 
   self.nativeConstructor(A1);
   self.nativeConstructor(A2);
   self.nativeConstructor(B1);
   self.nativeConstructor(B2);
 })()""");
+  applyTestExtensions(['A1', 'A2', 'B1', 'B2']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_class_inheritance4_frog_test.dart b/tests/dart2js_2/native/native_class_inheritance4_frog_test.dart
index c230a0e..b83b8e1 100644
--- a/tests/dart2js_2/native/native_class_inheritance4_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_inheritance4_frog_test.dart
@@ -54,12 +54,13 @@
   function A(){}
   function B(){}
   inherits(B, A);
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testBasicA_dynamic() {
diff --git a/tests/dart2js_2/native/native_class_is_check1_frog_test.dart b/tests/dart2js_2/native/native_class_is_check1_frog_test.dart
index 0294507..83123db 100644
--- a/tests/dart2js_2/native/native_class_is_check1_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_is_check1_frog_test.dart
@@ -31,9 +31,10 @@
   function A(){}
   A.prototype.read = function() { return this._x; };
   A.prototype.write = function(x) { this._x = x; };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 class B {}
diff --git a/tests/dart2js_2/native/native_class_is_check3_frog_test.dart b/tests/dart2js_2/native/native_class_is_check3_frog_test.dart
index fdd225a..fe7b154 100644
--- a/tests/dart2js_2/native/native_class_is_check3_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_is_check3_frog_test.dart
@@ -49,11 +49,12 @@
   inherits(B, A);
   A.prototype.read = function() { return this._x; };
   A.prototype.write = function(x) { this._x = x; };
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 class C {}
diff --git a/tests/dart2js_2/native/native_class_with_dart_methods_frog_test.dart b/tests/dart2js_2/native/native_class_with_dart_methods_frog_test.dart
index c3061d8..8bd6b66 100644
--- a/tests/dart2js_2/native/native_class_with_dart_methods_frog_test.dart
+++ b/tests/dart2js_2/native/native_class_with_dart_methods_frog_test.dart
@@ -26,9 +26,10 @@
   JS('', r"""
 (function(){
   function A() {}
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_closure_identity_frog_test.dart b/tests/dart2js_2/native/native_closure_identity_frog_test.dart
index 2f85058..3d3a44c 100644
--- a/tests/dart2js_2/native/native_closure_identity_frog_test.dart
+++ b/tests/dart2js_2/native/native_closure_identity_frog_test.dart
@@ -24,10 +24,11 @@
   A.prototype.setClosure = function(f) { this.f = f; };
   A.prototype.check = function(f) { return this.f === f; };
   A.prototype.invoke = function() { return this.f(); };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 var staticClosure;
diff --git a/tests/dart2js_2/native/native_constructor_name_test.dart b/tests/dart2js_2/native/native_constructor_name_test.dart
index 1dc6d6c..bde29a4 100644
--- a/tests/dart2js_2/native/native_constructor_name_test.dart
+++ b/tests/dart2js_2/native/native_constructor_name_test.dart
@@ -25,9 +25,10 @@
   JS('', r"""
 (function(){
   function A(){}
-  makeZ = function(){return new A()};
+  self.makeZ = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_equals_frog_test.dart b/tests/dart2js_2/native/native_equals_frog_test.dart
index 1b5b38b..657c923 100644
--- a/tests/dart2js_2/native/native_equals_frog_test.dart
+++ b/tests/dart2js_2/native/native_equals_frog_test.dart
@@ -29,11 +29,12 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_exception2_test.dart b/tests/dart2js_2/native/native_exception2_test.dart
index 4bbc029..b1751c8 100644
--- a/tests/dart2js_2/native/native_exception2_test.dart
+++ b/tests/dart2js_2/native/native_exception2_test.dart
@@ -23,9 +23,10 @@
   JS('', r"""
 (function(){
   function NativeClass() {}
-  makeNativeClass = function() { return new NativeClass(); };
+  self.makeNativeClass = function() { return new NativeClass(); };
   self.nativeConstructor(NativeClass);
 })()""");
+  applyTestExtensions(['NativeClass']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_exceptions1_frog_test.dart b/tests/dart2js_2/native/native_exceptions1_frog_test.dart
index 8617219..c82bb98 100644
--- a/tests/dart2js_2/native/native_exceptions1_frog_test.dart
+++ b/tests/dart2js_2/native/native_exceptions1_frog_test.dart
@@ -49,6 +49,7 @@
   A = null;
   E = null;
 })()""");
+  applyTestExtensions(['E', 'A']);
 }
 
 void setup2() {
@@ -62,7 +63,7 @@
   if (x & 1) throw new E(100);
   return  x / 2;
 };
-makeA = function(){return new A()};
+self.makeA = function(){return new A()};
 
 self.nativeConstructor(E);
 self.nativeConstructor(A);
diff --git a/tests/dart2js_2/native/native_field_invocation2_test.dart b/tests/dart2js_2/native/native_field_invocation2_test.dart
index 2a4d013..046a03d 100644
--- a/tests/dart2js_2/native/native_field_invocation2_test.dart
+++ b/tests/dart2js_2/native/native_field_invocation2_test.dart
@@ -38,7 +38,7 @@
 void setup() {
   JS('', r"""
 (function(){
-nativeId = function(x) { return x; }
+self.nativeId = function(x) { return x; }
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/native_field_invocation3_test.dart b/tests/dart2js_2/native/native_field_invocation3_test.dart
index 8e0d918..a492116 100644
--- a/tests/dart2js_2/native/native_field_invocation3_test.dart
+++ b/tests/dart2js_2/native/native_field_invocation3_test.dart
@@ -12,9 +12,10 @@
   JS('', r"""
 (function(){
   function CC() {}
-  makeCC = function() { return new CC() };
+  self.makeCC = function() { return new CC() };
   self.nativeConstructor(CC);
 })()""");
+  applyTestExtensions(['CC']);
 }
 
 @Native("CC")
diff --git a/tests/dart2js_2/native/native_field_invocation4_test.dart b/tests/dart2js_2/native/native_field_invocation4_test.dart
index 7e5b0d4..abc22af 100644
--- a/tests/dart2js_2/native/native_field_invocation4_test.dart
+++ b/tests/dart2js_2/native/native_field_invocation4_test.dart
@@ -20,7 +20,7 @@
 void setup() {
   JS('', r"""
 (function(){
-nativeId = function(x) { return x; }
+self.nativeId = function(x) { return x; }
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/native_field_invocation5_test.dart b/tests/dart2js_2/native/native_field_invocation5_test.dart
index 5e9e853..eca547d 100644
--- a/tests/dart2js_2/native/native_field_invocation5_test.dart
+++ b/tests/dart2js_2/native/native_field_invocation5_test.dart
@@ -13,10 +13,11 @@
   JS('', r"""
 (function(){
   function CC() {}
-  makeCC = function() { return new CC() };
-  nativeFirst = function(x, y) { return x; };
+  self.makeCC = function() { return new CC() };
+  self.nativeFirst = function(x, y) { return x; };
   self.nativeConstructor(CC);
 })()""");
+  applyTestExtensions(['CC']);
 }
 
 class C {
diff --git a/tests/dart2js_2/native/native_field_invocation6_test.dart b/tests/dart2js_2/native/native_field_invocation6_test.dart
index 3ca229f..9dafb45 100644
--- a/tests/dart2js_2/native/native_field_invocation6_test.dart
+++ b/tests/dart2js_2/native/native_field_invocation6_test.dart
@@ -12,12 +12,13 @@
 void setup() {
   JS('', r"""
 (function(){
-  nativeFirst = function(x, y) { return x; };
+  self.nativeFirst = function(x, y) { return x; };
 
   function A() {}
-  makeA = function() { return new A() };
+  self.makeA = function() { return new A() };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 @Native("A")
diff --git a/tests/dart2js_2/native/native_field_invocation_test.dart b/tests/dart2js_2/native/native_field_invocation_test.dart
index 65077fe..6531ff2 100644
--- a/tests/dart2js_2/native/native_field_invocation_test.dart
+++ b/tests/dart2js_2/native/native_field_invocation_test.dart
@@ -20,7 +20,7 @@
 void setup() {
   JS('', r"""
 (function(){
-  nativeId = function(x) { return x; }
+  self.nativeId = function(x) { return x; }
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/native_field_name_test.dart b/tests/dart2js_2/native/native_field_name_test.dart
index c03a88d..8c1a623 100644
--- a/tests/dart2js_2/native/native_field_name_test.dart
+++ b/tests/dart2js_2/native/native_field_name_test.dart
@@ -43,10 +43,11 @@
     return a;
   }
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 /*A*/ makeA() native;
diff --git a/tests/dart2js_2/native/native_field_optimization_test.dart b/tests/dart2js_2/native/native_field_optimization_test.dart
index 6b5a976..6aa3aa4 100644
--- a/tests/dart2js_2/native/native_field_optimization_test.dart
+++ b/tests/dart2js_2/native/native_field_optimization_test.dart
@@ -44,10 +44,11 @@
     }
   });
 
-  makeFoo = function() { return new Foo() };
+  self.makeFoo = function() { return new Foo() };
 
   self.nativeConstructor(Foo);
 })()""");
+  applyTestExtensions(['Foo']);
 }
 
 test1() {
diff --git a/tests/dart2js_2/native/native_field_rename_1_frog_test.dart b/tests/dart2js_2/native/native_field_rename_1_frog_test.dart
index 11420c4..4277754 100644
--- a/tests/dart2js_2/native/native_field_rename_1_frog_test.dart
+++ b/tests/dart2js_2/native/native_field_rename_1_frog_test.dart
@@ -45,12 +45,13 @@
   function X(){}
   X.prototype.key = function(){return 666;};
 
-  makeA = function(){return new A()};
-  makeX = function(){return new X()};
+  self.makeA = function(){return new A()};
+  self.makeX = function(){return new X()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(X);
 })()""");
+  applyTestExtensions(['A', 'X']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js_2/native/native_field_rename_2_frog_test.dart b/tests/dart2js_2/native/native_field_rename_2_frog_test.dart
index 1591a28..37c9c36 100644
--- a/tests/dart2js_2/native/native_field_rename_2_frog_test.dart
+++ b/tests/dart2js_2/native/native_field_rename_2_frog_test.dart
@@ -48,12 +48,13 @@
   function X(){}
   X.prototype.key = function(){return 666;};
 
-  makeA = function(){return new A()};
-  makeX = function(){return new X()};
+  self.makeA = function(){return new A()};
+  self.makeX = function(){return new X()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(X);
 })()""");
+  applyTestExtensions(['A', 'X']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js_2/native/native_method_inlining_test.dart b/tests/dart2js_2/native/native_method_inlining_test.dart
index 0df556d..5ae5cce 100644
--- a/tests/dart2js_2/native/native_method_inlining_test.dart
+++ b/tests/dart2js_2/native/native_method_inlining_test.dart
@@ -66,7 +66,7 @@
   A.prototype.foo = function () { return arguments.length; };
   A.prototype.callFun = function (fn) { return fn ? fn(123) : 1; };
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   findMethodTextContaining = function (instance, string) {
     var proto = Object.getPrototypeOf(instance);
@@ -81,6 +81,7 @@
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 void match(String s, String pattern1) {
diff --git a/tests/dart2js_2/native/native_method_rename1_frog_test.dart b/tests/dart2js_2/native/native_method_rename1_frog_test.dart
index 65d0741..cdac340 100644
--- a/tests/dart2js_2/native/native_method_rename1_frog_test.dart
+++ b/tests/dart2js_2/native/native_method_rename1_frog_test.dart
@@ -37,10 +37,11 @@
   A.prototype.barA = function(){return 200;};
   A.prototype.bazA = function(){return 300;};
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js_2/native/native_method_rename2_frog_test.dart b/tests/dart2js_2/native/native_method_rename2_frog_test.dart
index d2c5b49..51058f1 100644
--- a/tests/dart2js_2/native/native_method_rename2_frog_test.dart
+++ b/tests/dart2js_2/native/native_method_rename2_frog_test.dart
@@ -43,12 +43,13 @@
   inherits(B, A);
   B.prototype.fooB = function(){return 200;};
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js_2/native/native_method_rename3_frog_test.dart b/tests/dart2js_2/native/native_method_rename3_frog_test.dart
index b2875a9..2cb4951 100644
--- a/tests/dart2js_2/native/native_method_rename3_frog_test.dart
+++ b/tests/dart2js_2/native/native_method_rename3_frog_test.dart
@@ -50,12 +50,13 @@
   inherits(B, A);
   B.prototype.fooB = function(){return 200;};
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testDynamic() {
diff --git a/tests/dart2js_2/native/native_method_with_keyword_name_test.dart b/tests/dart2js_2/native/native_method_with_keyword_name_test.dart
index 1245550..89b5d25 100644
--- a/tests/dart2js_2/native/native_method_with_keyword_name_test.dart
+++ b/tests/dart2js_2/native/native_method_with_keyword_name_test.dart
@@ -24,6 +24,7 @@
 makeA = function(){return new A()};
 self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_missing_method1_frog_test.dart b/tests/dart2js_2/native/native_missing_method1_frog_test.dart
index e083b17..df551ab 100644
--- a/tests/dart2js_2/native/native_missing_method1_frog_test.dart
+++ b/tests/dart2js_2/native/native_missing_method1_frog_test.dart
@@ -16,9 +16,10 @@
 (function(){
   function A() {};
   A.prototype.foo = function() { return  99; };
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 class B {
diff --git a/tests/dart2js_2/native/native_missing_method2_frog_test.dart b/tests/dart2js_2/native/native_missing_method2_frog_test.dart
index 7b96c87..ca407b2 100644
--- a/tests/dart2js_2/native/native_missing_method2_frog_test.dart
+++ b/tests/dart2js_2/native/native_missing_method2_frog_test.dart
@@ -16,9 +16,10 @@
 (function(){
   function A() {};
   A.prototype.foo = function() { return  42; };
-  makeA = function() { return new A() };
+  self.makeA = function() { return new A() };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 class B {
diff --git a/tests/dart2js_2/native/native_mixin_field2_test.dart b/tests/dart2js_2/native/native_mixin_field2_test.dart
index a2b9062..0736aaf 100644
--- a/tests/dart2js_2/native/native_mixin_field2_test.dart
+++ b/tests/dart2js_2/native/native_mixin_field2_test.dart
@@ -46,12 +46,13 @@
 (function(){
   function A() {this.foo='A-foo';}
   function B() {A.call(this);this.bar='B-bar';this.baz='M1-baz';}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 @pragma('dart2js:assumeDynamic')
diff --git a/tests/dart2js_2/native/native_mixin_field_test.dart b/tests/dart2js_2/native/native_mixin_field_test.dart
index bc7d36c..4a92fc2 100644
--- a/tests/dart2js_2/native/native_mixin_field_test.dart
+++ b/tests/dart2js_2/native/native_mixin_field_test.dart
@@ -36,12 +36,13 @@
 (function(){
   function A() {this.foo='A-foo';}
   function B() {A.call(this);this.bar='B-bar';this.baz='M1-baz';}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_mixin_multiple2_test.dart b/tests/dart2js_2/native/native_mixin_multiple2_test.dart
index aa95f87..3ad645b 100644
--- a/tests/dart2js_2/native/native_mixin_multiple2_test.dart
+++ b/tests/dart2js_2/native/native_mixin_multiple2_test.dart
@@ -32,10 +32,11 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_mixin_multiple3_test.dart b/tests/dart2js_2/native/native_mixin_multiple3_test.dart
index 9992295..2fc6dc1 100644
--- a/tests/dart2js_2/native/native_mixin_multiple3_test.dart
+++ b/tests/dart2js_2/native/native_mixin_multiple3_test.dart
@@ -46,14 +46,15 @@
   function A() {}
   function B() {}
   function C() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
-  makeC = function(){return new C()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
+  self.makeC = function(){return new C()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
 })()""");
+  applyTestExtensions(['A', 'B', 'C']);
 }
 
 var g;
diff --git a/tests/dart2js_2/native/native_mixin_multiple_test.dart b/tests/dart2js_2/native/native_mixin_multiple_test.dart
index 377353c..f657023 100644
--- a/tests/dart2js_2/native/native_mixin_multiple_test.dart
+++ b/tests/dart2js_2/native/native_mixin_multiple_test.dart
@@ -36,12 +36,13 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_mixin_test.dart b/tests/dart2js_2/native/native_mixin_test.dart
index 096f39e..f0f055a 100644
--- a/tests/dart2js_2/native/native_mixin_test.dart
+++ b/tests/dart2js_2/native/native_mixin_test.dart
@@ -32,12 +32,13 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_mixin_with_plain_test.dart b/tests/dart2js_2/native/native_mixin_with_plain_test.dart
index a7bd565..b896ad1 100644
--- a/tests/dart2js_2/native/native_mixin_with_plain_test.dart
+++ b/tests/dart2js_2/native/native_mixin_with_plain_test.dart
@@ -47,12 +47,13 @@
 (function(){
   function A() {this.aa = 'aa'}
   function B() {this.aa = 'bb'}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_named_constructors2_frog_test.dart b/tests/dart2js_2/native/native_named_constructors2_frog_test.dart
index 916b9ec..a8a5f20 100644
--- a/tests/dart2js_2/native/native_named_constructors2_frog_test.dart
+++ b/tests/dart2js_2/native/native_named_constructors2_frog_test.dart
@@ -33,9 +33,10 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function A(arg) { this._x = arg; }
   A.prototype.foo = function() { return this._x; };
-  makeA = function(arg) { return new A(arg); };
+  self.makeA = function(arg) { return new A(arg); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_named_constructors3_frog_test.dart b/tests/dart2js_2/native/native_named_constructors3_frog_test.dart
index d90df20..c98aaa3 100644
--- a/tests/dart2js_2/native/native_named_constructors3_frog_test.dart
+++ b/tests/dart2js_2/native/native_named_constructors3_frog_test.dart
@@ -32,9 +32,10 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function A(arg) { this._x = arg; }
   A.prototype.foo = function(){ return this._x; };
-  makeA = function(arg) { return new A(arg); };
+  self.makeA = function(arg) { return new A(arg); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_no_such_method_exception2_frog_test.dart b/tests/dart2js_2/native/native_no_such_method_exception2_frog_test.dart
index b562085..6fb278b 100644
--- a/tests/dart2js_2/native/native_no_such_method_exception2_frog_test.dart
+++ b/tests/dart2js_2/native/native_no_such_method_exception2_frog_test.dart
@@ -33,13 +33,14 @@
     function A() {}
     function B() {}
     inherits(B, A);
-    makeA = function() { return new A() };
-    makeB = function() { return new B() };
+    self.makeA = function() { return new A() };
+    self.makeB = function() { return new B() };
     B.prototype.foo = function() { return 42; };
 
     self.nativeConstructor(A);
     self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_no_such_method_exception_frog_test.dart b/tests/dart2js_2/native/native_no_such_method_exception_frog_test.dart
index 857bf54..c01d397 100644
--- a/tests/dart2js_2/native/native_no_such_method_exception_frog_test.dart
+++ b/tests/dart2js_2/native/native_no_such_method_exception_frog_test.dart
@@ -22,9 +22,10 @@
   JS('', r"""
 (function(){
   function A() {}
-  makeA = function() { return new A(); };
+  self.makeA = function() { return new A(); };
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_novel_html_test.dart b/tests/dart2js_2/native/native_novel_html_test.dart
index 5330028..1e2d20d 100644
--- a/tests/dart2js_2/native/native_novel_html_test.dart
+++ b/tests/dart2js_2/native/native_novel_html_test.dart
@@ -25,17 +25,18 @@
   HTMLGoofyElement.prototype.nativeMethod = function(a) {
     return 'Goofy.nativeMethod(' + a  + ')';
   };
-  makeE = function(){return new HTMLGoofyElement()};
+  self.makeE = function(){return new HTMLGoofyElement()};
 
   // A non-HTML element with a misleading name.
   function HTMLFakeyElement(){}
   HTMLFakeyElement.prototype.nativeMethod = function(a) {
     return 'Fakey.nativeMethod(' + a  + ')';
   };
-  makeF = function(){return new HTMLFakeyElement()};
+  self.makeF = function(){return new HTMLFakeyElement()};
 
   self.nativeConstructor(HTMLGoofyElement);
 })()""");
+  applyTestExtensions(['HTMLGoofyElement']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_null_closure_frog_test.dart b/tests/dart2js_2/native/native_null_closure_frog_test.dart
index a7c83a3..1ec0bfd 100644
--- a/tests/dart2js_2/native/native_null_closure_frog_test.dart
+++ b/tests/dart2js_2/native/native_null_closure_frog_test.dart
@@ -26,10 +26,11 @@
   A.prototype.setClosure = function(f) { this.f = f; };
   A.prototype.check = function(f) { return this.f === f; };
   A.prototype.invoke = function() { return this.f(); };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_null_frog_test.dart b/tests/dart2js_2/native/native_null_frog_test.dart
index 9cf083d..14f19c2 100644
--- a/tests/dart2js_2/native/native_null_frog_test.dart
+++ b/tests/dart2js_2/native/native_null_frog_test.dart
@@ -26,9 +26,10 @@
   A.prototype.returnUndefined = function() { return void 0; };
   A.prototype.returnEmptyString = function() { return ""; };
   A.prototype.returnZero = function() { return 0; };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 @pragma('dart2js:noInline')
diff --git a/tests/dart2js_2/native/native_property_frog_test.dart b/tests/dart2js_2/native/native_property_frog_test.dart
index 2deeed5..026dd6a 100644
--- a/tests/dart2js_2/native/native_property_frog_test.dart
+++ b/tests/dart2js_2/native/native_property_frog_test.dart
@@ -40,10 +40,11 @@
     set: function (v) { this._x = v; }
   });
 
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
 
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_testing.dart b/tests/dart2js_2/native/native_testing.dart
index 9eb9246..19d5bae 100644
--- a/tests/dart2js_2/native/native_testing.dart
+++ b/tests/dart2js_2/native/native_testing.dart
@@ -12,7 +12,8 @@
 import 'dart:_foreign_helper' show JS;
 
 export "package:expect/expect.dart";
-export 'dart:_js_helper' show Creates, Native, JSName, Returns;
+export 'dart:_js_helper'
+    show Creates, Native, JSName, Returns, applyTestExtensions;
 export 'dart:_foreign_helper' show JS;
 
 void nativeTesting() {
diff --git a/tests/dart2js_2/native/native_to_string_frog_test.dart b/tests/dart2js_2/native/native_to_string_frog_test.dart
index f17ad7b..aafb8f1 100644
--- a/tests/dart2js_2/native/native_to_string_frog_test.dart
+++ b/tests/dart2js_2/native/native_to_string_frog_test.dart
@@ -17,9 +17,10 @@
   JS('', r"""
 (function(){
   function A() {}
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_use_native_name_in_table_frog_test.dart b/tests/dart2js_2/native/native_use_native_name_in_table_frog_test.dart
index ef7b2a7..7a9b283 100644
--- a/tests/dart2js_2/native/native_use_native_name_in_table_frog_test.dart
+++ b/tests/dart2js_2/native/native_use_native_name_in_table_frog_test.dart
@@ -38,12 +38,13 @@
   inherits(NativeB, NativeA);
   NativeA.prototype.foo = function() { return 42; };
 
-  makeA = function(){return new NativeA()};
-  makeB = function(){return new NativeB()};
+  self.makeA = function(){return new NativeA()};
+  self.makeB = function(){return new NativeB()};
 
   self.nativeConstructor(NativeA);
   self.nativeConstructor(NativeB);
 })()""");
+  applyTestExtensions(['NativeA', 'NativeB']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_wrapping_function3_frog_test.dart b/tests/dart2js_2/native/native_wrapping_function3_frog_test.dart
index e3de1ed..da2ea28 100644
--- a/tests/dart2js_2/native/native_wrapping_function3_frog_test.dart
+++ b/tests/dart2js_2/native/native_wrapping_function3_frog_test.dart
@@ -26,9 +26,10 @@
   A.prototype.foo2 = function(closure, arg1, arg2) {
     return closure(arg1, arg2);
   };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/native_wrapping_function_frog_test.dart b/tests/dart2js_2/native/native_wrapping_function_frog_test.dart
index e05b809..325705e 100644
--- a/tests/dart2js_2/native/native_wrapping_function_frog_test.dart
+++ b/tests/dart2js_2/native/native_wrapping_function_frog_test.dart
@@ -28,9 +28,10 @@
   A.prototype.foo2 = function(closure, arg1, arg2) {
     return closure(arg1, arg2);
   };
-  makeA = function(){return new A()};
+  self.makeA = function(){return new A()};
   self.nativeConstructor(A);
 })()""");
+  applyTestExtensions(['A']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/oddly_named_fields_test.dart b/tests/dart2js_2/native/oddly_named_fields_test.dart
index e59f247..19c2777 100644
--- a/tests/dart2js_2/native/oddly_named_fields_test.dart
+++ b/tests/dart2js_2/native/oddly_named_fields_test.dart
@@ -1387,9 +1387,10 @@
   JS('', r"""
 (function(){
   function NativeClassWithOddNames() {}
-  makeNativeClassWithOddNames = function() {return new NativeClassWithOddNames()};
+  self.makeNativeClassWithOddNames = function() {return new NativeClassWithOddNames()};
   self.nativeConstructor(NativeClassWithOddNames);
 })()""");
+  applyTestExtensions(['NativeClassWithOddNames']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/runtimetype_test.dart b/tests/dart2js_2/native/runtimetype_test.dart
index 4465ae1..62911e2 100644
--- a/tests/dart2js_2/native/runtimetype_test.dart
+++ b/tests/dart2js_2/native/runtimetype_test.dart
@@ -33,12 +33,13 @@
   function TAGY(){}
   inherits(TAGY, TAGX);
 
-  makeA = function(){return new TAGX()};
-  makeB = function(){return new TAGY()};
+  self.makeA = function(){return new TAGX()};
+  self.makeB = function(){return new TAGY()};
 
   self.nativeConstructor(TAGX);
   self.nativeConstructor(TAGY);
 })()""");
+  applyTestExtensions(['TAGX', 'TAGY']);
 }
 
 testDynamicContext() {
diff --git a/tests/dart2js_2/native/subclassing_1_test.dart b/tests/dart2js_2/native/subclassing_1_test.dart
index fd3dc84..c19ce2b 100644
--- a/tests/dart2js_2/native/subclassing_1_test.dart
+++ b/tests/dart2js_2/native/subclassing_1_test.dart
@@ -37,13 +37,13 @@
   function A() {}
   function B() {}
   function C() {}
-  makeA = function(){return new A()};
-  makeB1 = function(){return new B()};
-  makeB2 = function(){return new B()};
-  makeC = function(){return new C()};
+  self.makeA = function(){return new A()};
+  self.makeB1 = function(){return new B()};
+  self.makeB2 = function(){return new B()};
+  self.makeC = function(){return new C()};
 
-  getBPrototype = function(){return B.prototype;};
-  getCPrototype = function(){return C.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
+  self.getCPrototype = function(){return C.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_2_test.dart b/tests/dart2js_2/native/subclassing_2_test.dart
index 63f3711..d5ee89d 100644
--- a/tests/dart2js_2/native/subclassing_2_test.dart
+++ b/tests/dart2js_2/native/subclassing_2_test.dart
@@ -34,10 +34,10 @@
 (function(){
   function A() {}
   function B() {}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_3_test.dart b/tests/dart2js_2/native/subclassing_3_test.dart
index fb7a794..d033b08 100644
--- a/tests/dart2js_2/native/subclassing_3_test.dart
+++ b/tests/dart2js_2/native/subclassing_3_test.dart
@@ -40,9 +40,9 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B();};
+  self.makeB = function(){return new B();};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_4_test.dart b/tests/dart2js_2/native/subclassing_4_test.dart
index 089f134..c80a161 100644
--- a/tests/dart2js_2/native/subclassing_4_test.dart
+++ b/tests/dart2js_2/native/subclassing_4_test.dart
@@ -38,8 +38,8 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
-  getBPrototype = function(){return B.prototype;};
+  self.makeB = function(){return new B()};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_5_test.dart b/tests/dart2js_2/native/subclassing_5_test.dart
index 3ae3859..5599399 100644
--- a/tests/dart2js_2/native/subclassing_5_test.dart
+++ b/tests/dart2js_2/native/subclassing_5_test.dart
@@ -45,8 +45,8 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
-  getBPrototype = function(){return B.prototype;};
+  self.makeB = function(){return new B()};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_constructor_1_test.dart b/tests/dart2js_2/native/subclassing_constructor_1_test.dart
index d70e1e3..9ee71bb 100644
--- a/tests/dart2js_2/native/subclassing_constructor_1_test.dart
+++ b/tests/dart2js_2/native/subclassing_constructor_1_test.dart
@@ -67,9 +67,9 @@
 (function(){
   function B() { this.a2 = 102; }
 
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_super_call_test.dart b/tests/dart2js_2/native/subclassing_super_call_test.dart
index 71a77e5..b94cfd6 100644
--- a/tests/dart2js_2/native/subclassing_super_call_test.dart
+++ b/tests/dart2js_2/native/subclassing_super_call_test.dart
@@ -51,9 +51,9 @@
   N2.prototype.foo = function() { return "foo:" + this.text; };
   function BB() {}
   BB.prototype.__proto__ = N2.prototype;
-  makeBB = function(){return new BB()};
+  self.makeBB = function(){return new BB()};
 
-  getBBPrototype = function(){return BB.prototype;};
+  self.getBBPrototype = function(){return BB.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_super_field_1_test.dart b/tests/dart2js_2/native/subclassing_super_field_1_test.dart
index a1e3c2a..f14bb3d 100644
--- a/tests/dart2js_2/native/subclassing_super_field_1_test.dart
+++ b/tests/dart2js_2/native/subclassing_super_field_1_test.dart
@@ -38,9 +38,9 @@
   JS('', r"""
 (function(){
 function B() { }
-makeB = function(){return new B()};
+self.makeB = function(){return new B()};
 
-getBPrototype = function(){return B.prototype;};
+self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_super_field_2_test.dart b/tests/dart2js_2/native/subclassing_super_field_2_test.dart
index efd1bf6..334e83a 100644
--- a/tests/dart2js_2/native/subclassing_super_field_2_test.dart
+++ b/tests/dart2js_2/native/subclassing_super_field_2_test.dart
@@ -42,9 +42,9 @@
   JS('', r"""
 (function(){
   function B() { this.foo = 111; }  // N.foo
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/subclassing_type_test.dart b/tests/dart2js_2/native/subclassing_type_test.dart
index 3abc875..39f9745 100644
--- a/tests/dart2js_2/native/subclassing_type_test.dart
+++ b/tests/dart2js_2/native/subclassing_type_test.dart
@@ -35,9 +35,9 @@
   JS('', r"""
 (function(){
   function B() {}
-  makeB = function(){return new B()};
+  self.makeB = function(){return new B()};
 
-  getBPrototype = function(){return B.prototype;};
+  self.getBPrototype = function(){return B.prototype;};
 })()""");
 }
 
diff --git a/tests/dart2js_2/native/super_call_test.dart b/tests/dart2js_2/native/super_call_test.dart
index 2dfff1a..1e91195 100644
--- a/tests/dart2js_2/native/super_call_test.dart
+++ b/tests/dart2js_2/native/super_call_test.dart
@@ -61,16 +61,17 @@
   function D(){}
   inherits(D, C);
 
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
-  makeC = function(){return new C()};
-  makeD = function(){return new D()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
+  self.makeC = function(){return new C()};
+  self.makeD = function(){return new D()};
 
   self.nativeConstructor(A);
   self.nativeConstructor(B);
   self.nativeConstructor(C);
   self.nativeConstructor(D);
 })()""");
+  applyTestExtensions(['A', 'B', 'C', 'D']);
 }
 
 main() {
diff --git a/tests/dart2js_2/native/super_property_test.dart b/tests/dart2js_2/native/super_property_test.dart
index 5efcf62..ada33df 100644
--- a/tests/dart2js_2/native/super_property_test.dart
+++ b/tests/dart2js_2/native/super_property_test.dart
@@ -48,11 +48,12 @@
   // This code is inside 'setup' and so not accessible from the global scope.
   function A(){}
   function B(){}
-  makeA = function(){return new A()};
-  makeB = function(){return new B()};
+  self.makeA = function(){return new A()};
+  self.makeB = function(){return new B()};
   self.nativeConstructor(A);
   self.nativeConstructor(B);
 })()""");
+  applyTestExtensions(['A', 'B']);
 }
 
 testThing(a) {
diff --git a/tests/lib/js/native_as_js_classes_static_test/default_library_namespace_test.dart b/tests/lib/js/native_as_js_classes_static_test/default_library_namespace_test.dart
new file mode 100644
index 0000000..d230129
--- /dev/null
+++ b/tests/lib/js/native_as_js_classes_static_test/default_library_namespace_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test errors with a library with the default namespace.
+
+@JS()
+library default_library_namespace_test;
+
+import 'package:js/js.dart';
+
+// Test same class name as a native class.
+@JS()
+class HTMLDocument {}
+//    ^
+// [web] JS interop class 'HTMLDocument' conflicts with natively supported class 'HtmlDocument' in 'dart:html'.
+
+// Test same annotation name as a native class.
+@JS('HTMLDocument')
+class HtmlDocument {}
+//    ^
+// [web] JS interop class 'HtmlDocument' conflicts with natively supported class 'HtmlDocument' in 'dart:html'.
+
+// Test annotation name with 'self' and 'window' prefixes.
+@JS('self.Window')
+class WindowWithSelf {}
+//    ^
+// [web] JS interop class 'WindowWithSelf' conflicts with natively supported class 'Window' in 'dart:html'.
+
+@JS('window.Window')
+class WindowWithWindow {}
+//    ^
+// [web] JS interop class 'WindowWithWindow' conflicts with natively supported class 'Window' in 'dart:html'.
+
+@JS('self.window.self.window.self.Window')
+class WindowWithMultipleSelfsAndWindows {}
+//    ^
+// [web] JS interop class 'WindowWithMultipleSelfsAndWindows' conflicts with natively supported class 'Window' in 'dart:html'.
+
+// Test annotation with native class name but with a prefix that isn't 'self' or
+// 'window'.
+@JS('foo.Window')
+class WindowWithDifferentPrefix {}
+
+// Test same class name as a native class with multiple annotation names.
+// dart:html.Window uses both "Window" and "DOMWindow".
+@JS()
+class DOMWindow {}
+//    ^
+// [web] JS interop class 'DOMWindow' conflicts with natively supported class 'Window' in 'dart:html'.
+
+// Test same annotation name as a native class with multiple annotation names
+// dart:html.Window uses both "Window" and "DOMWindow".
+@JS('DOMWindow')
+class DomWindow {}
+//    ^
+// [web] JS interop class 'DomWindow' conflicts with natively supported class 'Window' in 'dart:html'.
+
+// Test different annotation name but with same class name as a @Native class.
+@JS('Foo')
+class Window {}
+
+// Dart classes don't have to worry about conflicts.
+class Element {}
+
+// Anonymous classes don't have to worry about conflicts either.
+@JS()
+@anonymous
+class HTMLElement {}
+
+@JS('HTMLElement')
+@anonymous
+class HtmlElement {}
+
+void main() {}
diff --git a/tests/lib/js/native_as_js_classes_static_test/global_library_namespace_test.dart b/tests/lib/js/native_as_js_classes_static_test/global_library_namespace_test.dart
new file mode 100644
index 0000000..fb55aa6
--- /dev/null
+++ b/tests/lib/js/native_as_js_classes_static_test/global_library_namespace_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test errors with a library with a global namespace.
+
+@JS('window')
+library global_library_namespace_test;
+
+import 'package:js/js.dart';
+
+@JS()
+class HTMLDocument {}
+//    ^
+// [web] JS interop class 'HTMLDocument' conflicts with natively supported class 'HtmlDocument' in 'dart:html'.
+
+@JS('HTMLDocument')
+class HtmlDocument {}
+//    ^
+// [web] JS interop class 'HtmlDocument' conflicts with natively supported class 'HtmlDocument' in 'dart:html'.
+
+@JS('self.Window')
+class WindowWithSelf {}
+//    ^
+// [web] JS interop class 'WindowWithSelf' conflicts with natively supported class 'Window' in 'dart:html'.
+
+@JS('window.Window')
+class WindowWithWindow {}
+//    ^
+// [web] JS interop class 'WindowWithWindow' conflicts with natively supported class 'Window' in 'dart:html'.
+
+@JS('self.window.self.window.self.Window')
+class WindowWithMultipleSelfsAndWindows {}
+//    ^
+// [web] JS interop class 'WindowWithMultipleSelfsAndWindows' conflicts with natively supported class 'Window' in 'dart:html'.
+
+@JS('foo.Window')
+class WindowWithDifferentPrefix {}
+
+@JS()
+class DOMWindow {}
+//    ^
+// [web] JS interop class 'DOMWindow' conflicts with natively supported class 'Window' in 'dart:html'.
+
+@JS('DOMWindow')
+class DomWindow {}
+//    ^
+// [web] JS interop class 'DomWindow' conflicts with natively supported class 'Window' in 'dart:html'.
+
+@JS('Foo')
+class Window {}
+
+class Element {}
+
+@JS()
+@anonymous
+class HTMLElement {}
+
+@JS('HTMLElement')
+@anonymous
+class HtmlElement {}
+
+void main() {}
diff --git a/tests/lib/js/native_as_js_classes_static_test/local_library_namespace_test.dart b/tests/lib/js/native_as_js_classes_static_test/local_library_namespace_test.dart
new file mode 100644
index 0000000..e529bfa
--- /dev/null
+++ b/tests/lib/js/native_as_js_classes_static_test/local_library_namespace_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test errors with a library with a non-default or non-global namespace.
+// Note that none of the following should be errors in this case.
+
+@JS('foo')
+library global_library_namespace_test;
+
+import 'package:js/js.dart';
+
+@JS()
+class HTMLDocument {}
+
+@JS('HTMLDocument')
+class HtmlDocument {}
+
+@JS('self.Window')
+class WindowWithSelf {}
+
+@JS('window.Window')
+class WindowWithWindow {}
+
+@JS('self.window.self.window.self.Window')
+class WindowWithMultipleSelfsAndWindows {}
+
+@JS('foo.Window')
+class WindowWithDifferentPrefix {}
+
+@JS()
+class DOMWindow {}
+
+@JS('DOMWindow')
+class DomWindow {}
+
+@JS('Foo')
+class Window {}
+
+class Element {}
+
+@JS()
+@anonymous
+class HTMLElement {}
+
+@JS('HTMLElement')
+@anonymous
+class HtmlElement {}
+
+void main() {}
diff --git a/tools/VERSION b/tools/VERSION
index 3cd2a88..f03f533 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 226
+PRERELEASE 227
 PRERELEASE_PATCH 0
\ No newline at end of file
