diff --git a/pkg/analyzer/test/src/diagnostics/invalid_export_of_internal_element_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_export_of_internal_element_test.dart
index 3ffe641..542262d 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_export_of_internal_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_export_of_internal_element_test.dart
@@ -2,12 +2,8 @@
 // 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/analysis/analysis_context.dart';
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/test_utilities/mock_packages.dart';
-import 'package:analyzer/src/workspace/bazel.dart';
-import 'package:analyzer/src/workspace/package_build.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -25,9 +21,6 @@
 class InvalidExportOfInternalElement_BazelPackageTest
     extends BazelWorkspaceResolutionTest
     with InvalidExportOfInternalElementTest {
-  /// A cached analysis context for resolving sources via the same [Workspace].
-  AnalysisContext analysisContext;
-
   String get testPackageBazelBinPath => '$workspaceRootPath/bazel-bin/dart/my';
 
   String get testPackageGenfilesPath =>
@@ -37,13 +30,6 @@
   String get testPackageLibPath => myPackageLibPath;
 
   @override
-  Future<ResolvedUnitResult> resolveFile(String path) {
-    analysisContext ??= contextFor(path);
-    assert(analysisContext.workspace is BazelWorkspace);
-    return analysisContext.currentSession.getResolvedUnit(path);
-  }
-
-  @override
   void setUp() async {
     super.setUp();
     var metaPath = '$workspaceThirdPartyDartPath/meta';
@@ -59,14 +45,12 @@
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    newFile('$testPackageBazelBinPath/lib/bar.dart', content: r'''
+    await resolveFileCode('$testPackageBazelBinPath/lib/bar.dart', r'''
 export 'src/foo.dart';
 ''');
-    await resolveFile2('$testPackageBazelBinPath/lib/bar.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT, 0, 22),
     ]);
   }
@@ -76,14 +60,12 @@
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    newFile('$testPackageBazelBinPath/lib/src/bar.dart', content: r'''
+    await resolveFileCode('$testPackageBazelBinPath/lib/src/bar.dart', r'''
 export 'foo.dart';
 ''');
-    await resolveFile2('$testPackageBazelBinPath/lib/src/bar.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_exporterIsInGenfilesLib() async {
@@ -91,14 +73,12 @@
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    newFile('$testPackageGenfilesPath/lib/bar.dart', content: r'''
+    await resolveFileCode('$testPackageGenfilesPath/lib/bar.dart', r'''
 export 'src/foo.dart';
 ''');
-    await resolveFile2('$testPackageGenfilesPath/lib/bar.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT, 0, 22),
     ]);
   }
@@ -108,14 +88,12 @@
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    newFile('$testPackageGenfilesPath/lib/src/bar.dart', content: r'''
+    await resolveFileCode('$testPackageGenfilesPath/lib/src/bar.dart', r'''
 export 'foo.dart';
 ''');
-    await resolveFile2('$testPackageGenfilesPath/lib/src/bar.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_exporterIsInLib() async {
@@ -124,12 +102,11 @@
 @internal class One {}
 ''');
 
-    newFile('$testPackageLibPath/bar.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/bar.dart', r'''
 export 'src/foo.dart';
 ''');
-    await resolveFile2('$testPackageLibPath/bar.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT, 0, 22),
     ]);
   }
@@ -140,12 +117,11 @@
 @internal class One {}
 ''');
 
-    newFile('$testPackageLibPath/src/bar.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/src/bar.dart', r'''
 export 'foo.dart';
 ''');
-    await resolveFile2('$testPackageLibPath/src/bar.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_exporterIsInTest() async {
@@ -154,12 +130,11 @@
 @internal class One {}
 ''');
 
-    newFile('$myPackageRootPath/test/foo_test.dart', content: r'''
+    await resolveFileCode('$myPackageRootPath/test/foo_test.dart', r'''
 export 'package:dart.my/src/foo.dart';
 ''');
-    await resolveFile2('$myPackageRootPath/test/foo_test.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_internalIsInBazelBin() async {
@@ -205,56 +180,43 @@
 @reflectiveTest
 class InvalidExportOfInternalElement_PackageBuildPackageTest
     extends InvalidExportOfInternalElement_PubPackageTest {
-  /// A cached analysis context for resolving sources via the same [Workspace].
-  AnalysisContext analysisContext;
-
   String get testPackageDartToolPath =>
       '$testPackageRootPath/.dart_tool/build/generated/test';
 
-  @override
-  Future<ResolvedUnitResult> resolveFile(String path) {
-    analysisContext ??= contextFor(path);
-    assert(analysisContext.workspace is PackageBuildWorkspace);
-    return analysisContext.currentSession.getResolvedUnit(path);
-  }
-
-  @override
-  void setUp() async {
-    analysisContext = null;
-    super.setUp();
-    newFolder(testPackageDartToolPath);
-  }
-
+  @FailingTest(reason: r'''
+We try to analyze a file in .dart_tool, which is implicitly excluded from
+analysis. So, there is no context to analyze it.
+''')
   void test_exporterInGeneratedLib() async {
     newFile('$testPackageRootPath/lib/src/foo.dart', content: r'''
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageRootPath/lib/src/foo.dart');
 
-    newFile('$testPackageDartToolPath/lib/bar.dart', content: r'''
+    await resolveFileCode('$testPackageDartToolPath/lib/bar.dart', r'''
 export 'package:test/src/foo.dart';
 ''');
-    await resolveFile2('$testPackageDartToolPath/lib/bar.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT, 0, 35),
     ]);
   }
 
+  @FailingTest(reason: r'''
+We try to analyze a file in .dart_tool, which is implicitly excluded from
+analysis. So, there is no context to analyze it.
+''')
   void test_exporterInGeneratedLibSrc() async {
     newFile('$testPackageRootPath/lib/src/foo.dart', content: r'''
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageRootPath/lib/src/foo.dart');
 
-    newFile('$testPackageDartToolPath/lib/src/bar.dart', content: r'''
+    await resolveFileCode('$testPackageDartToolPath/lib/src/bar.dart', r'''
 export 'package:test/src/foo.dart';
 ''');
-    await resolveFile2('$testPackageDartToolPath/lib/src/bar.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_exporterInLib() async {
@@ -262,14 +224,12 @@
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageRootPath/lib/src/foo.dart');
 
-    newFile('$testPackageRootPath/lib/bar.dart', content: r'''
+    await resolveFileCode('$testPackageRootPath/lib/bar.dart', r'''
 export 'package:test/src/foo.dart';
 ''');
-    await resolveFile2('$testPackageRootPath/lib/bar.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT, 0, 35),
     ]);
   }
@@ -279,14 +239,12 @@
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageRootPath/lib/src/foo.dart');
 
-    newFile('$testPackageRootPath/lib/src/bar.dart', content: r'''
+    await resolveFileCode('$testPackageRootPath/lib/src/bar.dart', r'''
 export 'package:test/src/foo.dart';
 ''');
-    await resolveFile2('$testPackageRootPath/lib/src/bar.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_internalIsInGeneratedLibSrc() async {
@@ -336,12 +294,11 @@
 @internal class One {}
 ''');
 
-    newFile('$testPackageLibPath/bar.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/bar.dart', r'''
 export 'src/foo.dart';
 ''');
-    await resolveFile2('$testPackageLibPath/bar.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT, 0, 22),
     ]);
   }
@@ -352,12 +309,11 @@
 @internal class One {}
 ''');
 
-    newFile('$testPackageLibPath/src/bar.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/src/bar.dart', r'''
 export 'foo.dart';
 ''');
-    await resolveFile2('$testPackageLibPath/src/bar.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_exporterIsInTest() async {
@@ -366,12 +322,11 @@
 @internal class One {}
 ''');
 
-    newFile('$testPackageRootPath/test/foo_test.dart', content: r'''
+    await resolveFileCode('$testPackageRootPath/test/foo_test.dart', r'''
 export 'package:test/src/foo.dart';
 ''');
-    await resolveFile2('$testPackageRootPath/test/foo_test.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_internalIsLibSrc() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_internal_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_internal_annotation_test.dart
index 7de20a1..8a3ca44 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_internal_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_internal_annotation_test.dart
@@ -15,8 +15,7 @@
 
 @reflectiveTest
 class InvalidInternalAnnotationTest extends PubPackageResolutionTest {
-  String get testPackageImplementationFilePath =>
-      '$testPackageLibPath/src/foo.dart';
+  String get testPackageLibSrcFilePath => '$testPackageLibPath/src/foo.dart';
 
   @override
   void setUp() async {
@@ -29,137 +28,126 @@
   }
 
   void test_annotationInLib() async {
-    newFile('$testPackageLibPath/foo.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/foo.dart', r'''
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageLibPath/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
     ]);
   }
 
   void test_annotationInLib_onLibrary() async {
-    newFile('$testPackageLibPath/foo.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/foo.dart', r'''
 @internal
 library foo;
 import 'package:meta/meta.dart';
 ''');
-    await resolveFile2('$testPackageLibPath/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 0, 9),
     ]);
   }
 
   void test_annotationInLibSrc() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_annotationInLibSrcSubdirectory() async {
-    newFile('$testPackageLibPath/src/foo/foo.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/src/foo/foo.dart', r'''
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo/foo.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_annotationInLibSubdirectory() async {
-    newFile('$testPackageLibPath/foo/foo.dart', content: r'''
+    await resolveFileCode('$testPackageLibPath/foo/foo.dart', r'''
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageLibPath/foo/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
     ]);
   }
 
   void test_annotationInTest() async {
-    newFile('$testPackageRootPath/test/foo_test.dart', content: r'''
+    await resolveFileCode('$testPackageRootPath/test/foo_test.dart', r'''
 import 'package:meta/meta.dart';
 @internal class One {}
 ''');
-    await resolveFile2('$testPackageRootPath/test/foo_test.dart');
 
-    assertErrorsInResolvedUnit(result, []);
+    assertNoErrorsInResult();
   }
 
   void test_privateClass() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal class _One {}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
       error(HintCode.UNUSED_ELEMENT, 49, 4),
     ]);
   }
 
   void test_privateClassConstructor_named() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class _C {
   @internal _C.named();
 }
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.UNUSED_ELEMENT, 39, 2),
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 46, 9),
     ]);
   }
 
   void test_privateClassConstructor_unnamed() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class _C {
   @internal _C();
 }
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.UNUSED_ELEMENT, 39, 2),
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 46, 9),
     ]);
   }
 
   void test_privateConstructor() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class C {
   @internal C._f();
 }
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 45, 9),
     ]);
   }
 
   void test_privateEnum() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal enum _E {one}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
       error(HintCode.UNUSED_ELEMENT, 48, 2),
       error(HintCode.UNUSED_FIELD, 52, 3),
@@ -167,193 +155,179 @@
   }
 
   void test_privateEnumValue() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 enum E {@internal _one}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 41, 9),
       error(HintCode.UNUSED_FIELD, 51, 4),
     ]);
   }
 
   void test_privateExtension() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal extension _One on String {}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
     ]);
   }
 
   void test_privateExtension_unnamed() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal extension on String {}
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
     ]);
   }
 
   void test_privateField_instance() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class C {
   @internal int _i = 0;
 }
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.UNUSED_FIELD, 59, 2),
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 59, 6),
     ]);
   }
 
   void test_privateField_static() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class C {
   @internal static int _i = 0;
 }
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.UNUSED_FIELD, 66, 2),
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 66, 6),
     ]);
   }
 
   void test_privateGetter() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class C {
   @internal int get _i => 0;
 }
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 45, 9),
       error(HintCode.UNUSED_ELEMENT, 63, 2),
     ]);
   }
 
   void test_privateMethod_instance() async {
-    newFile(testPackageImplementationFilePath, content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class C {
   @internal void _f() {}
 }
 ''');
-    await resolveFile2(testPackageImplementationFilePath);
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 45, 9),
       error(HintCode.UNUSED_ELEMENT, 60, 2),
     ]);
   }
 
   void test_privateMethod_static() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class C {
   @internal static void _f() {}
 }
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 45, 9),
       error(HintCode.UNUSED_ELEMENT, 67, 2),
     ]);
   }
 
   void test_privateMixin() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal mixin _One {}
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
       error(HintCode.UNUSED_ELEMENT, 49, 4),
     ]);
   }
 
   void test_privateTopLevelFunction() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal void _f() {}
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
       error(HintCode.UNUSED_ELEMENT, 48, 2),
     ]);
   }
 
   void test_privateTopLevelVariable() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal int _i = 1;
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 47, 6),
       error(HintCode.UNUSED_ELEMENT, 47, 2),
     ]);
   }
 
   void test_privateTypedef() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 @internal typedef _T = void Function();
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.INVALID_INTERNAL_ANNOTATION, 33, 9),
       error(HintCode.UNUSED_ELEMENT, 51, 2),
     ]);
   }
 
   void test_publicMethod_privateClass() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class _C {
   @internal void f() {}
 }
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.UNUSED_ELEMENT, 39, 2),
     ]);
   }
 
   void test_publicMethod_privateClass_static() async {
-    newFile('$testPackageLibPath/src/foo.dart', content: r'''
+    await resolveFileCode(testPackageLibSrcFilePath, r'''
 import 'package:meta/meta.dart';
 class _C {
   @internal static void f() {}
 }
 ''');
-    await resolveFile2('$testPackageLibPath/src/foo.dart');
 
-    assertErrorsInResolvedUnit(result, [
+    assertErrorsInResult([
       error(HintCode.UNUSED_ELEMENT, 39, 2),
       error(HintCode.UNUSED_ELEMENT, 68, 1),
     ]);
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 5eeb420..98f2f79 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -447,7 +447,7 @@
     new OptionHandler(Flags.enableNativeNullAssertions, passThrough),
     new OptionHandler(Flags.trustTypeAnnotations, setTrustTypeAnnotations),
     new OptionHandler(Flags.trustPrimitives, passThrough),
-    new OptionHandler(Flags.trustJSInteropTypeAnnotations, passThrough),
+    new OptionHandler(Flags.trustJSInteropTypeAnnotations, ignoreOption),
     new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true),
     new OptionHandler('--packages=.+', setPackageConfig),
     new OptionHandler(Flags.noSourceMaps, passThrough),
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index a574666..ab22c77 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1939,10 +1939,6 @@
 
   KernelBehaviorBuilder(this.elementEnvironment, this.commonElements,
       this.nativeBasicData, this.reporter, this.options);
-
-  @override
-  bool get trustJSInteropTypeAnnotations =>
-      options.trustJSInteropTypeAnnotations;
 }
 
 class KernelNativeMemberResolver implements NativeMemberResolver {
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index a01fac5..0457090 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -736,7 +736,6 @@
   CommonElements get commonElements;
   DiagnosticReporter get reporter;
   NativeBasicData get nativeBasicData;
-  bool get trustJSInteropTypeAnnotations;
   ElementEnvironment get elementEnvironment;
   CompilerOptions get options;
   DartTypes get dartTypes => commonElements.dartTypes;
@@ -817,21 +816,13 @@
           _behavior.typesInstantiated.add(type);
         }
 
-        if (!trustJSInteropTypeAnnotations || dartTypes.isTopType(type)) {
-          // By saying that only JS-interop types can be created, we prevent
-          // pulling in every other native type (e.g. all of dart:html) when a
-          // JS interop API returns dynamic or when we don't trust the type
-          // annotations. This means that to some degree we still use the return
-          // type to decide whether to include native types, even if we don't
-          // trust the type annotation.
-          ClassEntity cls = commonElements.jsJavaScriptObjectClass;
-          _behavior.typesInstantiated.add(elementEnvironment.getThisType(cls));
-        } else {
-          // Otherwise, when the declared type is a Dart type, we do not
-          // register an allocation because we assume it cannot be instantiated
-          // from within the JS-interop code. It must have escaped from another
-          // API.
-        }
+        // By saying that only JS-interop types can be created, we prevent
+        // pulling in every other native type (e.g. all of dart:html) when a
+        // JS interop API returns dynamic.  This means that to some degree we
+        // still use the return type to decide whether to include native types,
+        // even though we don't trust the type annotation.
+        ClassEntity cls = commonElements.jsJavaScriptObjectClass;
+        _behavior.typesInstantiated.add(elementEnvironment.getThisType(cls));
       }
     }
   }
@@ -868,9 +859,7 @@
       {bool isJsInterop}) {
     _behavior = new NativeBehavior();
     // TODO(sigmund,sra): consider doing something better for numeric types.
-    _addReturnType(!isJsInterop || trustJSInteropTypeAnnotations
-        ? type
-        : commonElements.dynamicType);
+    _addReturnType(!isJsInterop ? type : commonElements.dynamicType);
     _capture(type, isJsInterop);
     _overrideWithAnnotations(
         createsAnnotations, returnsAnnotations, lookupType);
@@ -898,15 +887,12 @@
     // Note: For dart:html and other internal libraries we maintain, we can
     // trust the return type and use it to limit what we enqueue. We have to
     // be more conservative about JS interop types and assume they can return
-    // anything (unless the user provides the experimental flag to trust the
-    // type of js-interop APIs). We do restrict the allocation effects and say
-    // that interop calls create only interop types (which may be unsound if
-    // an interop call returns a DOM type and declares a dynamic return type,
-    // but otherwise we would include a lot of code by default).
+    // anything. We do restrict the allocation effects and say that interop
+    // calls create only interop types (which may be unsound if an interop call
+    // returns a DOM type and declares a dynamic return type, but otherwise we
+    // would include a lot of code by default).
     // TODO(sigmund,sra): consider doing something better for numeric types.
-    _addReturnType(!isJsInterop || trustJSInteropTypeAnnotations
-        ? returnType
-        : commonElements.dynamicType);
+    _addReturnType(!isJsInterop ? returnType : commonElements.dynamicType);
     _capture(type, isJsInterop);
 
     for (DartType type in type.optionalParameterTypes) {
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index f9d0f30..f8c7901 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -281,9 +281,6 @@
   /// The compiler is run from the build bot.
   bool testMode = false;
 
-  /// Whether to trust JS-interop annotations. (experimental)
-  bool trustJSInteropTypeAnnotations = false;
-
   /// Whether to trust primitive types during inference and optimizations.
   bool trustPrimitives = false;
 
@@ -506,8 +503,6 @@
       .._legacyJavaScript = _hasOption(options, Flags.legacyJavaScript)
       .._noLegacyJavaScript = _hasOption(options, Flags.noLegacyJavaScript)
       ..testMode = _hasOption(options, Flags.testMode)
-      ..trustJSInteropTypeAnnotations =
-          _hasOption(options, Flags.trustJSInteropTypeAnnotations)
       ..trustPrimitives = _hasOption(options, Flags.trustPrimitives)
       ..useContentSecurityPolicy =
           _hasOption(options, Flags.useContentSecurityPolicy)
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index e093833..b3b3e6f 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -4967,11 +4967,6 @@
           new js.Template(null, js.objectLiteral(parameterNameMap));
 
       var nativeBehavior = new NativeBehavior()..codeTemplate = codeTemplate;
-      if (options.trustJSInteropTypeAnnotations) {
-        InterfaceType thisType =
-            _elementEnvironment.getThisType(constructor.enclosingClass);
-        nativeBehavior.typesReturned.add(thisType);
-      }
       registry.registerNativeMethod(element);
       // TODO(efortuna): Source information.
       return new HForeignCode(
@@ -4991,10 +4986,9 @@
         ? _elementEnvironment.getThisType(element.enclosingClass)
         : _elementEnvironment.getFunctionType(element).returnType;
     // Native behavior effects here are similar to native/behavior.dart.
-    // The return type is dynamic if we don't trust js-interop type
+    // The return type is dynamic because we don't trust js-interop type
     // declarations.
-    nativeBehavior.typesReturned.add(
-        options.trustJSInteropTypeAnnotations ? type : dartTypes.dynamicType());
+    nativeBehavior.typesReturned.add(dartTypes.dynamicType());
 
     // The allocation effects include the declared type if it is native (which
     // includes js interop types).
@@ -5003,14 +4997,13 @@
       nativeBehavior.typesInstantiated.add(type);
     }
 
-    // It also includes any other JS interop type if we don't trust the
-    // annotation or if is declared too broad.
-    if (!options.trustJSInteropTypeAnnotations ||
-        type == _commonElements.objectType ||
-        type is DynamicType) {
-      nativeBehavior.typesInstantiated.add(_elementEnvironment
-          .getThisType(_commonElements.jsJavaScriptObjectClass));
-    }
+    // It also includes any other JS interop type. Technically, a JS interop API
+    // could return anything, so the sound thing to do would be to assume that
+    // anything that may come from JS as instantiated. In order to prevent the
+    // resulting code bloat (e.g. from `dart:html`), we unsoundly assume that
+    // only JS interop types are returned.
+    nativeBehavior.typesInstantiated.add(_elementEnvironment
+        .getThisType(_commonElements.jsJavaScriptObjectClass));
 
     AbstractValue instructionType =
         _typeInferenceMap.typeFromNativeBehavior(nativeBehavior, closedWorld);
diff --git a/pkg/compiler/test/helpers/compiler_helper.dart b/pkg/compiler/test/helpers/compiler_helper.dart
index 562741f..eb7046a 100644
--- a/pkg/compiler/test/helpers/compiler_helper.dart
+++ b/pkg/compiler/test/helpers/compiler_helper.dart
@@ -37,7 +37,6 @@
     bool enableTypeAssertions: false,
     bool minify: false,
     bool disableInlining: true,
-    bool trustJSInteropTypeAnnotations: false,
     bool disableTypeInference: true,
     bool omitImplicitChecks: true,
     bool enableVariance: false,
@@ -58,9 +57,6 @@
   if (minify) {
     options.add(Flags.minify);
   }
-  if (trustJSInteropTypeAnnotations) {
-    options.add(Flags.trustJSInteropTypeAnnotations);
-  }
   if (disableInlining) {
     options.add(Flags.disableInlining);
   }
diff --git a/pkg/compiler/test/jsinterop/interop_anonymous_unreachable_test.dart b/pkg/compiler/test/jsinterop/interop_anonymous_unreachable_test.dart
index ded9c90..2e4e586 100644
--- a/pkg/compiler/test/jsinterop/interop_anonymous_unreachable_test.dart
+++ b/pkg/compiler/test/jsinterop/interop_anonymous_unreachable_test.dart
@@ -80,16 +80,6 @@
   Expect.isTrue(generated1.contains("UniqueLongNameForTesting_B"));
   Expect.isTrue(generated1.contains("UniqueLongNameForTesting_C"));
   Expect.isTrue(generated1.contains("UniqueLongNameForTesting_E"));
-
-  print(' - tree-shake when using flag -');
-  String generated2 = await compile(program,
-      trustJSInteropTypeAnnotations: true, returnAll: true);
-  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_A"));
-  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_D"));
-
-  Expect.isFalse(generated2.contains("UniqueLongNameForTesting_B"));
-  Expect.isFalse(generated2.contains("UniqueLongNameForTesting_C"));
-  Expect.isFalse(generated2.contains("UniqueLongNameForTesting_E"));
 }
 
 testTreeShakingNativeTypes() async {
@@ -122,14 +112,6 @@
   // but we exclude other native types like HTMLAudioElement
   Expect.isFalse(generated1.contains("HTMLAudioElement"));
 
-  print(' - allocation effect of dynamic excludes native types [flag] -');
-  // Trusting types doesn't make a difference.
-  String generated2 = await compile(program,
-      trustJSInteropTypeAnnotations: true, returnAll: true);
-  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_A"));
-  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_B"));
-  Expect.isFalse(generated2.contains("HTMLAudioElement"));
-
   print(' - declared native types are included in allocation effect -');
   String program2 = """
         import 'dart:html';
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index d6ee556..f4d1611 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4200,8 +4200,14 @@
 
   @override
   js_ast.Expression visitPropertyGet(PropertyGet node) {
-    return _emitPropertyGet(
-        node.receiver, node.interfaceTarget, node.name.text);
+    var propertyGet =
+        _emitPropertyGet(node.receiver, node.interfaceTarget, node.name.text);
+    if (_isCheckableNative(node.interfaceTarget)) {
+      // If target is a native getter with a non-nullable type, add a null check
+      // for soundness.
+      return runtimeCall('checkNativeNonNull(#)', [propertyGet]);
+    }
+    return propertyGet;
   }
 
   @override
@@ -4264,6 +4270,16 @@
     }
   }
 
+  /// Return whether [member] returns a native object whose type needs to be
+  /// checked.
+  bool _isCheckableNative(Member member) =>
+      member != null &&
+      member.isExternal &&
+      _extensionTypes.isNativeClass(member.enclosingClass) &&
+      member is Procedure &&
+      member.function != null &&
+      member.function.returnType.isPotentiallyNonNullable;
+
   // TODO(jmesserly): can we encapsulate REPL name lookups and remove this?
   // _emitMemberName would be a nice place to handle it, but we don't have
   // access to the target expression there (needed for `dart.replNameLookup`).
@@ -4334,8 +4350,14 @@
 
   @override
   js_ast.Expression visitMethodInvocation(MethodInvocation node) {
-    return _emitMethodCall(
+    var methodCall = _emitMethodCall(
         node.receiver, node.interfaceTarget, node.arguments, node);
+    if (_isCheckableNative(node.interfaceTarget)) {
+      // If target is a native method with a non-nullable type, add a null check
+      // for soundness.
+      return runtimeCall('checkNativeNonNull(#)', [methodCall]);
+    }
+    return methodCall;
   }
 
   @override
@@ -5066,11 +5088,30 @@
 
     var result = js.parseForeignJS(source).instantiate(jsArgs);
 
+    // Add a check to make sure any JS() values from a native type are typed
+    // properly.
+    if (_isWebLibrary(_currentLibrary.importUri)) {
+      var type = node.getStaticType(_staticTypeContext);
+      if (type.isPotentiallyNonNullable) {
+        result = runtimeCall('checkNativeNonNull(#)', [result]);
+      }
+    }
+
     assert(result is js_ast.Expression ||
         result is js_ast.Statement && node.parent is ExpressionStatement);
     return result;
   }
 
+  bool _isWebLibrary(Uri importUri) =>
+      importUri.scheme == 'dart' &&
+      (importUri.path == 'html' ||
+          importUri.path == 'svg' ||
+          importUri.path == 'indexed_db' ||
+          importUri.path == 'web_audio' ||
+          importUri.path == 'web_gl' ||
+          importUri.path == 'web_sql' ||
+          importUri.path == 'html_common');
+
   bool _isNull(Expression expr) =>
       expr is NullLiteral ||
       expr.getStaticType(_staticTypeContext) == _coreTypes.nullType;
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index b2cd5ce..126090a 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -54,6 +54,11 @@
             'parameters are not null.',
         defaultsTo: false,
         negatable: true)
+    ..addFlag('native-null-assertions',
+        help: 'Run with assertions on non-nullable values returned from native '
+            'APIs.',
+        defaultsTo: true,
+        negatable: true)
     ..addFlag('observe',
         help:
             'Run the compiler in the Dart VM with --observe. Implies --debug.',
@@ -109,6 +114,7 @@
   var run = mode == 'run' || mode == 'all';
   var verbose = options['verbose'] as bool;
   var nonNullAsserts = options['null-assertions'] as bool;
+  var nativeNonNullAsserts = options['null-assertions'] as bool;
 
   var soundNullSafety = options['sound-null-safety'] as bool;
   // Enable null safety either by passing the `non-nullable` experiment flag or
@@ -280,6 +286,7 @@
     if ($nnbd) {
       sdk.dart.weakNullSafetyWarnings(!$soundNullSafety);
       sdk.dart.nonNullAsserts($nonNullAsserts);
+      sdk.dart.nativeNonNullAsserts($nativeNonNullAsserts);
     }
     sdk._debugger.registerDevtoolsFormatter();
     app.$libname.main([]);
@@ -315,6 +322,7 @@
   if ($nnbd) {
     sdk.dart.weakNullSafetyWarnings(!$soundNullSafety);
     sdk.dart.nonNullAsserts($nonNullAsserts);
+    sdk.dart.nativeNonNullAsserts($nativeNonNullAsserts);
   }
   sdk._isolate_helper.startRootIsolate(main, []);
 } catch(e) {
@@ -351,6 +359,7 @@
   if ($nnbd) {
     dart.weakNullSafetyWarnings(!$soundNullSafety);
     dart.nonNullAsserts($nonNullAsserts);
+    dart.nativeNonNullAsserts($nativeNonNullAsserts);
   }
   _isolate_helper.startRootIsolate(() => {}, []);
   main([]);
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index d931293..6fcd3d1 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -870,3 +870,10 @@
   }
   return ${defineProperty(to, name, desc)};
 })()''');
+
+checkNativeNonNull(dynamic variable) {
+  if (_nativeNonNullAsserts) {
+    return nullCheck(variable);
+  }
+  return variable;
+}
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index 8dd643c..acb1615 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -44,6 +44,15 @@
   _nonNullAsserts = enable;
 }
 
+@notNull
+bool _nativeNonNullAsserts = false;
+
+/// Enables null assertions on native APIs to make sure value returned from the
+/// browser is sound. These apply to dart:html and similar web libraries.
+void nativeNonNullAsserts(bool enable) {
+  _nativeNonNullAsserts = enable;
+}
+
 final metadata = JS('', 'Symbol("metadata")');
 
 /// Types in dart are represented internally at runtime as follows.
diff --git a/tests/lib/html/js_typed_interop_anonymous2_exp_test.dart b/tests/lib/html/js_typed_interop_anonymous2_exp_test.dart
deleted file mode 100644
index 2c827b8..0000000
--- a/tests/lib/html/js_typed_interop_anonymous2_exp_test.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Same test as js_typed_interop_anonymous2, but using the
-// --experimental-trust-js-interop-type-annotations flag.
-@JS()
-library js_typed_interop_anonymous2_exp_test;
-
-import 'dart:html';
-import 'dart:js' as js;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class A {
-  external factory A({B? b});
-
-  external B? get b;
-}
-
-@JS()
-@anonymous
-class B {
-  external factory B({C? c});
-
-  external C? get c;
-}
-
-@JS()
-@anonymous
-class C {
-  external factory C();
-}
-
-// D is unreachable, and that is OK
-@JS()
-@anonymous
-class D {
-  external factory D();
-}
-
-main() {
-  test('simple', () {
-    var b = new B();
-    var a = new A(b: b);
-    expect(a.b, equals(b));
-    expect(b.c, isNull);
-  });
-}
diff --git a/tests/lib/html/js_typed_interop_anonymous_exp_test.dart b/tests/lib/html/js_typed_interop_anonymous_exp_test.dart
deleted file mode 100644
index e160bdd..0000000
--- a/tests/lib/html/js_typed_interop_anonymous_exp_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Same test as js_typed_interop_anonymous, but using the
-// --experimental-trust-js-interop-type-annotations flag.
-@JS()
-library js_typed_interop_anonymous_exp_test;
-
-import 'dart:html';
-import 'dart:js' as js;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class Literal {
-  external factory Literal({int? x, String? y, num? z});
-
-  external int? get x;
-  external String? get y;
-  external num? get z;
-}
-
-main() {
-  test('simple', () {
-    var l = new Literal(x: 3, y: "foo");
-    expect(l.x, equals(3));
-    expect(l.y, equals("foo"));
-    expect(l.z, isNull);
-  });
-}
diff --git a/tests/lib/html/js_typed_interop_anonymous_unreachable_exp_test.dart b/tests/lib/html/js_typed_interop_anonymous_unreachable_exp_test.dart
deleted file mode 100644
index 046dcff..0000000
--- a/tests/lib/html/js_typed_interop_anonymous_unreachable_exp_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Same test as js_typed_interop_anonymous_unreachable, but using the
-// --experimental-trust-js-interop-type-annotations flag.
-@JS()
-library js_typed_interop_anonymous_unreachable_exp_test;
-
-import 'dart:html';
-import 'dart:js' as js;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class Literal {
-  external factory Literal({required int x, required String y, required num z});
-
-  external int get x;
-  external String get y;
-  external num get z;
-}
-
-main() {
-  test('nothing to do', () {
-    // This test is empty, but it is a regression for Issue# 24974: dart2js
-    // would crash trying to compile code that used @anonymous and that was
-    // not reachable from main.
-  });
-}
diff --git a/tests/lib/html/js_typed_interop_side_cast_exp_test.dart b/tests/lib/html/js_typed_interop_side_cast_exp_test.dart
deleted file mode 100644
index be112c8..0000000
--- a/tests/lib/html/js_typed_interop_side_cast_exp_test.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Similar test to js_typed_interop_side_cast, but because we are using the
-// --experimental-trust-js-interop-type-annotations flag, we test a slightly
-// different behavior.
-@JS()
-library js_typed_interop_side_cast_exp_test;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class A {
-  external int get x;
-  external factory A({required int x});
-}
-
-@JS()
-@anonymous
-class B {
-  external int get x;
-  external factory B({required int x});
-}
-
-@JS()
-@anonymous
-class C {
-  external int get x;
-  external factory C({required int x});
-}
-
-main() {
-  test('side-casts work for reachable types', () {
-    new C(x: 3); // make C reachable
-    dynamic a = new A(x: 3);
-    expect(a is C, isTrue);
-    C c = a;
-    expect(c.x, equals(3));
-  });
-
-  // Note: this test would fail without the experimental flag.
-  test('side-casts do not work for unreachable types', () {
-    dynamic a = new A(x: 3);
-    expect(a is B, isFalse); //# 01: ok
-  });
-}
diff --git a/tests/lib_2/html/js_typed_interop_anonymous2_exp_test.dart b/tests/lib_2/html/js_typed_interop_anonymous2_exp_test.dart
deleted file mode 100644
index ba4afc2..0000000
--- a/tests/lib_2/html/js_typed_interop_anonymous2_exp_test.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Same test as js_typed_interop_anonymous2, but using the
-// --experimental-trust-js-interop-type-annotations flag.
-@JS()
-library js_typed_interop_anonymous2_exp_test;
-
-import 'dart:html';
-import 'dart:js' as js;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class A {
-  external factory A({B b});
-
-  external B get b;
-}
-
-@JS()
-@anonymous
-class B {
-  external factory B({C c});
-
-  external C get c;
-}
-
-@JS()
-@anonymous
-class C {
-  external factory C();
-}
-
-// D is unreachable, and that is OK
-@JS()
-@anonymous
-class D {
-  external factory D();
-}
-
-main() {
-  test('simple', () {
-    var b = new B();
-    var a = new A(b: b);
-    expect(a.b, equals(b));
-    expect(b.c, isNull);
-  });
-}
diff --git a/tests/lib_2/html/js_typed_interop_anonymous_exp_test.dart b/tests/lib_2/html/js_typed_interop_anonymous_exp_test.dart
deleted file mode 100644
index 362a41c..0000000
--- a/tests/lib_2/html/js_typed_interop_anonymous_exp_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Same test as js_typed_interop_anonymous, but using the
-// --experimental-trust-js-interop-type-annotations flag.
-@JS()
-library js_typed_interop_anonymous_exp_test;
-
-import 'dart:html';
-import 'dart:js' as js;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class Literal {
-  external factory Literal({int x, String y, num z});
-
-  external int get x;
-  external String get y;
-  external num get z;
-}
-
-main() {
-  test('simple', () {
-    var l = new Literal(x: 3, y: "foo");
-    expect(l.x, equals(3));
-    expect(l.y, equals("foo"));
-    expect(l.z, isNull);
-  });
-}
diff --git a/tests/lib_2/html/js_typed_interop_anonymous_unreachable_exp_test.dart b/tests/lib_2/html/js_typed_interop_anonymous_unreachable_exp_test.dart
deleted file mode 100644
index 95c6141..0000000
--- a/tests/lib_2/html/js_typed_interop_anonymous_unreachable_exp_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Same test as js_typed_interop_anonymous_unreachable, but using the
-// --experimental-trust-js-interop-type-annotations flag.
-@JS()
-library js_typed_interop_anonymous_unreachable_exp_test;
-
-import 'dart:html';
-import 'dart:js' as js;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class Literal {
-  external factory Literal({int x, String y, num z});
-
-  external int get x;
-  external String get y;
-  external num get z;
-}
-
-main() {
-  test('nothing to do', () {
-    // This test is empty, but it is a regression for Issue# 24974: dart2js
-    // would crash trying to compile code that used @anonymous and that was
-    // not reachable from main.
-  });
-}
diff --git a/tests/lib_2/html/js_typed_interop_side_cast_exp_test.dart b/tests/lib_2/html/js_typed_interop_side_cast_exp_test.dart
deleted file mode 100644
index a5061fb..0000000
--- a/tests/lib_2/html/js_typed_interop_side_cast_exp_test.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// SharedOptions=--experimental-trust-js-interop-type-annotations
-
-// Similar test to js_typed_interop_side_cast, but because we are using the
-// --experimental-trust-js-interop-type-annotations flag, we test a slightly
-// different behavior.
-@JS()
-library js_typed_interop_side_cast_exp_test;
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-@JS()
-@anonymous
-class A {
-  external int get x;
-  external factory A({int x});
-}
-
-@JS()
-@anonymous
-class B {
-  external int get x;
-  external factory B({int x});
-}
-
-@JS()
-@anonymous
-class C {
-  external int get x;
-  external factory C({int x});
-}
-
-main() {
-  test('side-casts work for reachable types', () {
-    new C(x: 3); // make C reachable
-    dynamic a = new A(x: 3);
-    expect(a is C, isTrue);
-    C c = a;
-    expect(c.x, equals(3));
-  });
-
-  // Note: this test would fail without the experimental flag.
-  test('side-casts do not work for unreachable types', () {
-    dynamic a = new A(x: 3);
-    expect(a is B, isFalse); //# 01: ok
-  });
-}
diff --git a/tools/VERSION b/tools/VERSION
index e19e106..2ace34c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 161
+PRERELEASE 162
 PRERELEASE_PATCH 0
\ No newline at end of file
