diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 7d75dfd..23f68a1 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 11.0.0
+version: 12.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index 6476f46..7e66c3c 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -273,7 +273,7 @@
     var classElement = constructorElement.enclosingElement;
     if (!classesBeingProcessed.add(classElement)) return;
 
-    var existingNamed = <ParameterElement>{};
+    var existingNamed = <String>{};
     if (instanceCreation != null) {
       for (var argumentExpression in instanceCreation.argumentList.arguments) {
         var parameter = argumentExpression.staticParameterElement;
@@ -282,7 +282,7 @@
         Expression valueExpression;
         if (argumentExpression is NamedExpression) {
           valueExpression = argumentExpression.expression;
-          existingNamed.add(parameter);
+          existingNamed.add(parameter.name);
         } else {
           valueExpression = argumentExpression;
         }
@@ -301,7 +301,7 @@
 
     for (var parameter in constructorElement.parameters) {
       if (!parameter.isNamed) continue;
-      if (existingNamed.contains(parameter)) continue;
+      if (existingNamed.contains(parameter.name)) continue;
 
       _addProperty(
         properties: properties,
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 7a99a5e..235e17f 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -4,18 +4,21 @@
 
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/features.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';
-import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:linter/src/rules.dart';
 import 'package:meta/meta.dart';
@@ -41,92 +44,64 @@
 typedef _ElementVisitorFunction = void Function(Element element);
 
 class AbstractContextTest with ResourceProviderMixin {
-  OverlayResourceProvider overlayResourceProvider;
+  static bool _lintRulesAreRegistered = false;
 
+  final ByteStore _byteStore = MemoryByteStore();
+
+  final Map<String, String> _declaredVariables = {};
   AnalysisContextCollection _analysisContextCollection;
-  AnalysisDriver _driver;
 
   /// The file system specific `/home/test/analysis_options.yaml` path.
   String get analysisOptionsPath =>
       convertPath('/home/test/analysis_options.yaml');
 
-  AnalysisDriver get driver => _driver;
+  List<String> get collectionIncludedPaths => [workspaceRootPath];
 
-  AnalysisSession get session => driver.currentSession;
+  @deprecated
+  AnalysisDriver get driver {
+    throw 0;
+  }
+
+  String get latestLanguageVersion =>
+      '${ExperimentStatus.currentVersion.major}.'
+      '${ExperimentStatus.currentVersion.minor}';
+
+  AnalysisSession get session => contextFor('/home/test').currentSession;
+
+  String get testPackageLanguageVersion => '2.9';
+
+  String get testPackageLibPath => '$testPackageRootPath/lib';
+
+  String get testPackageRootPath => '$workspaceRootPath/test';
 
   /// The file system specific `/home/test/pubspec.yaml` path.
   String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
 
-  void addFlutterPackage() {
-    addMetaPackage();
-
-    addTestPackageDependency(
-      'ui',
-      MockPackages.instance.addUI(resourceProvider).parent.path,
-    );
-
-    addTestPackageDependency(
-      'flutter',
-      MockPackages.instance.addFlutter(resourceProvider).parent.path,
-    );
-  }
-
-  void addMetaPackage() {
-    var libFolder = MockPackages.instance.addMeta(resourceProvider);
-    addTestPackageDependency('meta', libFolder.parent.path);
-  }
-
-  /// Add a new file with the given [pathInLib] to the package with the
-  /// given [packageName].  Then ensure that the test package depends on the
-  /// [packageName].
-  File addPackageFile(String packageName, String pathInLib, String content) {
-    var packagePath = '/.pub-cache/$packageName';
-    addTestPackageDependency(packageName, packagePath);
-    return newFile('$packagePath/lib/$pathInLib', content: content);
-  }
+  String get workspaceRootPath => '/home';
 
   Source addSource(String path, String content, [Uri uri]) {
     var file = newFile(path, content: content);
-    var source = file.createSource(uri);
-    driver.addFile(file.path);
-    driver.changeFile(file.path);
-    return source;
+    return file.createSource(uri);
   }
 
-  void addTestPackageDependency(String name, String rootPath) {
-    var packagesFile = getFile('/home/test/.packages');
-    var packagesContent =
-        packagesFile.exists ? packagesFile.readAsStringSync() : '';
-
-    // Ignore if there is already the same package dependency.
-    if (packagesContent.contains('$name:file://')) {
-      return;
+  Future<void> analyzeTestPackageFiles() async {
+    var analysisContext = contextFor(testPackageRootPath);
+    var files = analysisContext.contextRoot.analyzedFiles().toList();
+    for (var path in files) {
+      await analysisContext.currentSession.getResolvedUnit(path);
     }
-
-    rootPath = convertPath(rootPath);
-    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
-
-    packagesFile.writeAsStringSync(packagesContent);
-
-    createAnalysisContexts();
   }
 
-  void addVectorMathPackage() {
-    var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
-    addTestPackageDependency('vector_math', libFolder.parent.path);
+  void changeFile(String path) {
+    path = convertPath(path);
+    driverFor(path).changeFile(path);
   }
 
-  /// Create all analysis contexts in `/home`.
-  void createAnalysisContexts() {
-    _analysisContextCollection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath('/home')],
-      enableIndex: true,
-      resourceProvider: overlayResourceProvider,
-      sdkPath: convertPath('/sdk'),
-    );
+  AnalysisContext contextFor(String path) {
+    _createAnalysisContexts();
 
-    var testPath = convertPath('/home/test');
-    _driver = getDriver(testPath);
+    path = convertPath(path);
+    return _analysisContextCollection.contextFor(path);
   }
 
   /// Create an analysis options file based on the given arguments.
@@ -162,9 +137,11 @@
     }
 
     newFile(analysisOptionsPath, content: buffer.toString());
-    if (_driver != null) {
-      createAnalysisContexts();
-    }
+  }
+
+  AnalysisDriver driverFor(String path) {
+    var context = contextFor(path) as DriverBasedAnalysisContext;
+    return context.driver;
   }
 
   /// Return the existing analysis context that should be used to analyze the
@@ -183,26 +160,33 @@
     return context.driver;
   }
 
-  Future<CompilationUnit> resolveLibraryUnit(Source source) async {
-    var resolveResult = await session.getResolvedUnit(source.fullName);
-    return resolveResult.unit;
+  @override
+  File newFile(String path, {String content = ''}) {
+    if (_analysisContextCollection != null && !path.endsWith('.dart')) {
+      throw StateError('Only dart files can be changed after analysis.');
+    }
+
+    return super.newFile(path, content: content);
+  }
+
+  Future<ResolvedUnitResult> resolveFile(String path) async {
+    return contextFor(path).currentSession.getResolvedUnit(path);
   }
 
   @mustCallSuper
   void setUp() {
-    registerLintRules();
+    if (!_lintRulesAreRegistered) {
+      registerLintRules();
+      _lintRulesAreRegistered = true;
+    }
 
     setupResourceProvider();
-    overlayResourceProvider = OverlayResourceProvider(resourceProvider);
 
-    MockSdk(resourceProvider: resourceProvider);
+    MockSdk(
+      resourceProvider: resourceProvider,
+    );
 
-    newFolder('/home/test');
-    newFile('/home/test/.packages', content: '''
-test:${toUriStr('/home/test/lib')}
-''');
-
-    createAnalysisContexts();
+    writeTestPackageConfig();
   }
 
   void setupResourceProvider() {}
@@ -214,7 +198,95 @@
   /// Update `/home/test/pubspec.yaml` and create the driver.
   void updateTestPubspecFile(String content) {
     newFile(testPubspecPath, content: content);
-    createAnalysisContexts();
+  }
+
+  void verifyCreatedCollection() {}
+
+  void writePackageConfig(String path, PackageConfigFileBuilder config) {
+    newFile(path, content: config.toContent(toUriStr: toUriStr));
+  }
+
+  void writeTestPackageConfig({
+    PackageConfigFileBuilder config,
+    String languageVersion,
+    bool flutter = false,
+    bool meta = false,
+    bool vector_math = false,
+  }) {
+    if (config == null) {
+      config = PackageConfigFileBuilder();
+    } else {
+      config = config.copy();
+    }
+
+    config.add(
+      name: 'test',
+      rootPath: testPackageRootPath,
+      languageVersion: languageVersion ?? testPackageLanguageVersion,
+    );
+
+    if (meta || flutter) {
+      var libFolder = MockPackages.instance.addMeta(resourceProvider);
+      config.add(name: 'meta', rootPath: libFolder.parent.path);
+    }
+
+    if (flutter) {
+      {
+        var libFolder = MockPackages.instance.addUI(resourceProvider);
+        config.add(name: 'ui', rootPath: libFolder.parent.path);
+      }
+      {
+        var libFolder = MockPackages.instance.addFlutter(resourceProvider);
+        config.add(name: 'flutter', rootPath: libFolder.parent.path);
+      }
+    }
+
+    if (vector_math) {
+      var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
+      config.add(name: 'vector_math', rootPath: libFolder.parent.path);
+    }
+
+    var path = '$testPackageRootPath/.dart_tool/package_config.json';
+    writePackageConfig(path, config);
+  }
+
+  /// Create all analysis contexts in [collectionIncludedPaths].
+  void _createAnalysisContexts() {
+    if (_analysisContextCollection != null) {
+      return;
+    }
+
+    _analysisContextCollection = AnalysisContextCollectionImpl(
+      byteStore: _byteStore,
+      declaredVariables: _declaredVariables,
+      enableIndex: true,
+      includedPaths: collectionIncludedPaths.map(convertPath).toList(),
+      resourceProvider: resourceProvider,
+      sdkPath: convertPath('/sdk'),
+    );
+
+    verifyCreatedCollection();
+  }
+}
+
+mixin WithNullSafetyMixin on AbstractContextTest {
+  @override
+  String get testPackageLanguageVersion =>
+      Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
+
+  bool get withPackageMeta => false;
+
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+  /// Remove when Null Safety is enabled by default.
+  @nonVirtual
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      languageVersion: testPackageLanguageVersion,
+      meta: withPackageMeta,
+    );
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
   }
 }
 
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index d40c389..7b1c442 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -43,6 +43,9 @@
   }
 
   void addTestSource(String code, [Uri uri]) {
+    if (useLineEndingsForPlatform) {
+      code = normalizeNewlinesForPlatform(code);
+    }
     testCode = code;
     testSource = addSource(testFile, code, uri);
   }
@@ -128,10 +131,11 @@
   }
 
   Future<void> resolveTestUnit(String code) async {
-    if (useLineEndingsForPlatform) {
-      code = normalizeNewlinesForPlatform(code);
-    }
     addTestSource(code);
+    await resolveTestUnit2();
+  }
+
+  Future<void> resolveTestUnit2() async {
     testAnalysisResult = await session.getResolvedUnit(testFile);
     testUnit = testAnalysisResult.unit;
     if (verifyNoTestUnitErrors) {
@@ -147,7 +151,7 @@
     }
     testUnitElement = testUnit.declaredElement;
     testLibraryElement = testUnitElement.library;
-    findNode = FindNode(code, testUnit);
+    findNode = FindNode(testCode, testUnit);
   }
 
   @override
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
index a5c4aff..358df55 100644
--- a/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -35,7 +35,7 @@
     newFile(testFile, content: r'''
 import '../../other/b.dart';
 
-B b;
+var b = B();
 ''');
     createProject();
 
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 5ee0b8a..d80900b 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -351,7 +351,7 @@
 extension Ex on A {}
 mixin M { }
 typedef T = Function(Object);
-int v;
+var v = 0;
 ''');
 
     await addTestFile('''
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 45b57b3..9b966d2 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -323,7 +323,7 @@
         content: 'pkgA:${toUriStr('/packages/pkgA')}');
     addTestFile('''
 import 'package:pkgA/libA.dart';
-main(A a) {
+void f(A a) {
 }
 ''');
     // create project and wait for analysis
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index 07d6afb3..f797e2b 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -10,7 +10,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/utilities/mock_packages.dart';
 import '../tool/lsp_spec/matchers.dart';
 import 'code_actions_abstract.dart';
 
@@ -304,14 +303,10 @@
   @override
   void setUp() {
     super.setUp();
-
-    final flutterLibFolder = MockPackages.instance.addFlutter(resourceProvider);
-    final metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
-    // Create .packages in the project.
-    newFile(join(projectFolderPath, '.packages'), content: '''
-flutter:${flutterLibFolder.toUri()}
-meta:${metaLibFolder.toUri()}
-''');
+    writePackageConfig(
+      projectFolderPath,
+      flutter: true,
+    );
   }
 
   Future<void> test_appliesCorrectEdits() async {
diff --git a/pkg/analysis_server/test/lsp/completion_test.dart b/pkg/analysis_server/test/lsp/completion_test.dart
index 92789b23..cdecc6f 100644
--- a/pkg/analysis_server/test/lsp/completion_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_test.dart
@@ -768,26 +768,26 @@
 
   Future<void> test_suggestionSets_enumValuesAlreadyImported() async {
     newFile(
-      join(projectFolderPath, 'source_file.dart'),
+      join(projectFolderPath, 'lib', 'source_file.dart'),
       content: '''
       enum MyExportedEnum { One, Two }
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport1.dart'),
+      join(projectFolderPath, 'lib', 'reexport1.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport2.dart'),
+      join(projectFolderPath, 'lib', 'reexport2.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
 
     final content = '''
-import '../reexport1.dart';
+import 'reexport1.dart';
 
 main() {
   var a = MyExported^
@@ -812,26 +812,26 @@
 
   Future<void> test_suggestionSets_filtersOutAlreadyImportedSymbols() async {
     newFile(
-      join(projectFolderPath, 'source_file.dart'),
+      join(projectFolderPath, 'lib', 'source_file.dart'),
       content: '''
       class MyExportedClass {}
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport1.dart'),
+      join(projectFolderPath, 'lib', 'reexport1.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport2.dart'),
+      join(projectFolderPath, 'lib', 'reexport2.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
 
     final content = '''
-import '../reexport1.dart';
+import 'reexport1.dart';
 
 main() {
   MyExported^
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index 6364bc0..d2555e9 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -9,7 +9,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/utilities/mock_packages.dart';
 import 'server_abstract.dart';
 
 void main() {
@@ -67,12 +66,6 @@
     expect(related.location.range.end.character, equals(16));
   }
 
-  @override
-  void setUp() {
-    super.setUp();
-    pedanticLibFolder = MockPackages.instance.addPedantic(resourceProvider);
-  }
-
   Future<void> test_afterDocumentEdits() async {
     const initialContents = 'int a = 1;';
     newFile(mainFilePath, content: initialContents);
@@ -105,6 +98,7 @@
     expect(initialDiagnostics.first.code, 'undefined_lint_warning');
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/43926')
   Future<void> test_analysisOptionsFile_packageInclude() async {
     newFile(analysisOptionsPath, content: '''
 include: package:pedantic/analysis_options.yaml
@@ -118,15 +112,16 @@
     expect(initialDiagnostics.first.severity, DiagnosticSeverity.Warning);
     expect(initialDiagnostics.first.code, 'include_file_not_found');
 
-    // Write a package file that allows resolving the include.
-    final secondDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
-    newFile('$projectFolderPath/.packages', content: '''
-pedantic:${pedanticLibFolder.toUri()}
-''');
+    // TODO(scheglov) The server does not handle the file change.
+    throw 'Times out';
 
-    // Ensure the error disappeared.
-    final updatedDiagnostics = await secondDiagnosticsUpdate;
-    expect(updatedDiagnostics, hasLength(0));
+    // // Write a package file that allows resolving the include.
+    // final secondDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
+    // writePackageConfig(projectFolderPath, pedantic: true);
+    //
+    // // Ensure the error disappeared.
+    // final updatedDiagnostics = await secondDiagnosticsUpdate;
+    // expect(updatedDiagnostics, hasLength(0));
   }
 
   Future<void> test_contextMessage() async {
diff --git a/pkg/analysis_server/test/lsp/flutter_outline_test.dart b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
index 8a21287..5ece2b69 100644
--- a/pkg/analysis_server/test/lsp/flutter_outline_test.dart
+++ b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
@@ -6,7 +6,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/utilities/mock_packages.dart';
 import 'server_abstract.dart';
 
 void main() {
@@ -20,12 +19,7 @@
   @override
   void setUp() {
     super.setUp();
-
-    final flutterLibFolder = MockPackages.instance.addFlutter(resourceProvider);
-    // Create .packages in the project.
-    newFile(join(projectFolderPath, '.packages'), content: '''
-flutter:${flutterLibFolder.toUri()}
-''');
+    writePackageConfig(projectFolderPath, flutter: true);
   }
 
   Future<void> test_afterChange() async {
diff --git a/pkg/analysis_server/test/lsp/hover_test.dart b/pkg/analysis_server/test/lsp/hover_test.dart
index d46f8bb8..de40613 100644
--- a/pkg/analysis_server/test/lsp/hover_test.dart
+++ b/pkg/analysis_server/test/lsp/hover_test.dart
@@ -67,7 +67,7 @@
 ```dart
 String abc
 ```
-*lib/main.dart*
+*package:test/main.dart*
 
 ---
 This is a string.
@@ -182,7 +182,7 @@
 ```dart
 String abc
 ```
-*lib/main.dart*
+*package:test/main.dart*
     '''
         .trim();
 
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 4ec3477..a21044d 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -17,8 +17,10 @@
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -28,6 +30,7 @@
 import 'package:test/test.dart';
 
 import '../mocks.dart';
+import '../src/utilities/mock_packages.dart';
 
 const dartLanguageId = 'dart';
 
@@ -43,7 +46,8 @@
     with
         ResourceProviderMixin,
         ClientCapabilitiesHelperMixin,
-        LspAnalysisServerTestMixin {
+        LspAnalysisServerTestMixin,
+        ConfigurationFilesMixin {
   MockLspServerChannel channel;
   TestPluginManager pluginManager;
   LspAnalysisServer server;
@@ -143,6 +147,7 @@
     pubspecFileUri = Uri.file(pubspecFilePath);
     analysisOptionsPath = join(projectFolderPath, 'analysis_options.yaml');
     analysisOptionsUri = Uri.file(analysisOptionsPath);
+    writePackageConfig(projectFolderPath);
   }
 
   Future tearDown() async {
@@ -389,6 +394,66 @@
   }
 }
 
+mixin ConfigurationFilesMixin on ResourceProviderMixin {
+  String get latestLanguageVersion =>
+      '${ExperimentStatus.currentVersion.major}.'
+      '${ExperimentStatus.currentVersion.minor}';
+
+  String get testPackageLanguageVersion => '2.9';
+
+  void writePackageConfig(
+    String projectFolderPath, {
+    PackageConfigFileBuilder config,
+    String languageVersion,
+    bool flutter = false,
+    bool meta = false,
+    bool pedantic = false,
+    bool vector_math = false,
+  }) {
+    if (config == null) {
+      config = PackageConfigFileBuilder();
+    } else {
+      config = config.copy();
+    }
+
+    config.add(
+      name: 'test',
+      rootPath: projectFolderPath,
+      languageVersion: languageVersion ?? testPackageLanguageVersion,
+    );
+
+    if (meta || flutter) {
+      var libFolder = MockPackages.instance.addMeta(resourceProvider);
+      config.add(name: 'meta', rootPath: libFolder.parent.path);
+    }
+
+    if (flutter) {
+      {
+        var libFolder = MockPackages.instance.addUI(resourceProvider);
+        config.add(name: 'ui', rootPath: libFolder.parent.path);
+      }
+      {
+        var libFolder = MockPackages.instance.addFlutter(resourceProvider);
+        config.add(name: 'flutter', rootPath: libFolder.parent.path);
+      }
+    }
+
+    if (pedantic) {
+      var libFolder = MockPackages.instance.addPedantic(resourceProvider);
+      config.add(name: 'pedantic', rootPath: libFolder.parent.path);
+    }
+
+    if (vector_math) {
+      var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
+      config.add(name: 'vector_math', rootPath: libFolder.parent.path);
+    }
+
+    var path = '$projectFolderPath/.dart_tool/package_config.json';
+    var content = config.toContent(toUriStr: toUriStr);
+    newFile(path, content: content);
+  }
+}
+
 mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
   static const positionMarker = '^';
   static const rangeMarkerStart = '[[';
diff --git a/pkg/analysis_server/test/lsp/signature_help_test.dart b/pkg/analysis_server/test/lsp/signature_help_test.dart
index fbac555..64d902d 100644
--- a/pkg/analysis_server/test/lsp/signature_help_test.dart
+++ b/pkg/analysis_server/test/lsp/signature_help_test.dart
@@ -452,6 +452,9 @@
   AnalysisServerOptions get serverOptions =>
       AnalysisServerOptions()..enabledExperiments = ['non-nullable'];
 
+  @override
+  String get testPackageLanguageVersion => latestLanguageVersion;
+
   Future<void> test_params_requiredNamed() async {
     // This test requires support for the "required" keyword.
     final content = '''
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index 745d3d3..f00057a 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -17,7 +17,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../abstract_context.dart';
+import '../abstract_single_unit.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -96,7 +96,7 @@
 }
 
 @reflectiveTest
-class ElementTest extends AbstractContextTest {
+class ElementTest extends AbstractSingleUnitTest {
   engine.Element findElementInUnit(engine.CompilationUnit unit, String name,
       [engine.ElementKind kind]) {
     return findElementsByName(unit, name)
@@ -105,13 +105,12 @@
   }
 
   Future<void> test_fromElement_CLASS() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 @deprecated
 abstract class _A {}
 class B<K, V> {}''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, '_A');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, '_A');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.CLASS);
@@ -119,7 +118,7 @@
       expect(element.typeParameters, isNull);
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 27);
         expect(location.length, '_A'.length);
         expect(location.startLine, 2);
@@ -133,7 +132,7 @@
               Element.FLAG_PRIVATE);
     }
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, 'B');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, 'B');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.CLASS);
@@ -144,13 +143,12 @@
   }
 
   Future<void> test_fromElement_CONSTRUCTOR() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 class A {
   const A.myConstructor(int a, [String b]);
 }''');
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.CONSTRUCTOR);
@@ -158,7 +156,7 @@
     expect(element.typeParameters, isNull);
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 20);
       expect(location.length, 'myConstructor'.length);
       expect(location.startLine, 2);
@@ -170,16 +168,15 @@
   }
 
   Future<void> test_fromElement_CONSTRUCTOR_required_parameters_1() async {
-    addMetaPackage();
-    var source = addSource('/test.dart', '''
+    writeTestPackageConfig(meta: true);
+    await resolveTestUnit('''
 import 'package:meta/meta.dart';    
 class A {
   const A.myConstructor(int a, {int b, @required int c});
 }''');
 
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters, '(int a, {@required int c, int b})');
@@ -187,16 +184,15 @@
 
   /// Verify parameter re-ordering for required params
   Future<void> test_fromElement_CONSTRUCTOR_required_parameters_2() async {
-    addMetaPackage();
-    var source = addSource('/test.dart', '''
+    writeTestPackageConfig(meta: true);
+    await resolveTestUnit('''
 import 'package:meta/meta.dart';    
 class A {
   const A.myConstructor(int a, {int b, @required int d, @required int c});
 }''');
 
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters,
@@ -205,16 +201,16 @@
 
   /// Verify parameter re-ordering for required params
   Future<void> test_fromElement_CONSTRUCTOR_required_parameters_3() async {
-    addMetaPackage();
-    var source = addSource('/test.dart', '''
+    writeTestPackageConfig(meta: true);
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
 import 'package:meta/meta.dart';    
 class A {
   const A.myConstructor(int a, {int b, @required int d, @required int c, int a});
 }''');
 
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters,
@@ -234,13 +230,12 @@
   }
 
   Future<void> test_fromElement_ENUM() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, '_E1');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, '_E1');
       expect(engineElement.hasDeprecated, isTrue);
       // create notification Element
       var element = convertElement(engineElement);
@@ -249,7 +244,7 @@
       expect(element.typeParameters, isNull);
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 17);
         expect(location.length, '_E1'.length);
         expect(location.startLine, 2);
@@ -262,7 +257,7 @@
               Element.FLAG_PRIVATE);
     }
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, 'E2');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, 'E2');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM);
@@ -273,20 +268,19 @@
   }
 
   Future<void> test_fromElement_ENUM_CONSTANT() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.FieldElement engineElement = findElementInUnit(unit, 'one');
+      engine.FieldElement engineElement = findElementInUnit(testUnit, 'one');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM_CONSTANT);
       expect(element.name, 'one');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 23);
         expect(location.length, 'one'.length);
         expect(location.startLine, 2);
@@ -303,14 +297,14 @@
           Element.FLAG_CONST | Element.FLAG_STATIC);
     }
     {
-      engine.FieldElement engineElement = findElementInUnit(unit, 'three');
+      engine.FieldElement engineElement = findElementInUnit(testUnit, 'three');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM_CONSTANT);
       expect(element.name, 'three');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 44);
         expect(location.length, 'three'.length);
         expect(location.startLine, 3);
@@ -321,14 +315,14 @@
       expect(element.flags, Element.FLAG_CONST | Element.FLAG_STATIC);
     }
     {
-      var engineElement = unit.declaredElement.enums[1].getField('index');
+      var engineElement = testUnit.declaredElement.enums[1].getField('index');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.FIELD);
       expect(element.name, 'index');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, -1);
         expect(location.length, 'index'.length);
         expect(location.startLine, 1);
@@ -339,14 +333,14 @@
       expect(element.flags, Element.FLAG_FINAL);
     }
     {
-      var engineElement = unit.declaredElement.enums[1].getField('values');
+      var engineElement = testUnit.declaredElement.enums[1].getField('values');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.FIELD);
       expect(element.name, 'values');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, -1);
         expect(location.length, 'values'.length);
         expect(location.startLine, 1);
@@ -359,19 +353,18 @@
   }
 
   Future<void> test_fromElement_FIELD() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 class A {
   static const myField = 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
-    engine.FieldElement engineElement = findElementInUnit(unit, 'myField');
+    engine.FieldElement engineElement = findElementInUnit(testUnit, 'myField');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FIELD);
     expect(element.name, 'myField');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 25);
       expect(location.length, 'myField'.length);
       expect(location.startLine, 2);
@@ -383,12 +376,11 @@
   }
 
   Future<void> test_fromElement_FUNCTION_TYPE_ALIAS() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 typedef int F<T>(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
     engine.FunctionTypeAliasElement engineElement =
-        findElementInUnit(unit, 'F');
+        findElementInUnit(testUnit, 'F');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
@@ -396,7 +388,7 @@
     expect(element.typeParameters, '<T>');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 12);
       expect(location.length, 'F'.length);
       expect(location.startLine, 1);
@@ -408,12 +400,11 @@
   }
 
   Future<void> test_fromElement_FUNCTION_TYPE_ALIAS_genericTypeAlias() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 typedef F<T> = int Function(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
     engine.FunctionTypeAliasElement engineElement =
-        findElementInUnit(unit, 'F');
+        findElementInUnit(testUnit, 'F');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
@@ -421,7 +412,7 @@
     expect(element.typeParameters, '<T>');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 8);
       expect(location.length, 'F'.length);
       expect(location.startLine, 1);
@@ -433,20 +424,20 @@
   }
 
   Future<void> test_fromElement_GETTER() async {
-    var source = addSource('/test.dart', '''
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
 class A {
   String get myGetter => 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
     engine.PropertyAccessorElement engineElement =
-        findElementInUnit(unit, 'myGetter', engine.ElementKind.GETTER);
+        findElementInUnit(testUnit, 'myGetter', engine.ElementKind.GETTER);
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.GETTER);
     expect(element.name, 'myGetter');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 23);
       expect(location.length, 'myGetter'.length);
       expect(location.startLine, 2);
@@ -458,22 +449,21 @@
   }
 
   Future<void> test_fromElement_LABEL() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 main() {
 myLabel:
   while (true) {
     break myLabel;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
-    engine.LabelElement engineElement = findElementInUnit(unit, 'myLabel');
+    engine.LabelElement engineElement = findElementInUnit(testUnit, 'myLabel');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.LABEL);
     expect(element.name, 'myLabel');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 9);
       expect(location.length, 'myLabel'.length);
       expect(location.startLine, 2);
@@ -485,21 +475,21 @@
   }
 
   Future<void> test_fromElement_METHOD() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 class A {
   static List<String> myMethod(int a, {String b, int c}) {
     return null;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
-    engine.MethodElement engineElement = findElementInUnit(unit, 'myMethod');
+    engine.MethodElement engineElement =
+        findElementInUnit(testUnit, 'myMethod');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.METHOD);
     expect(element.name, 'myMethod');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 32);
       expect(location.length, 'myGetter'.length);
       expect(location.startLine, 2);
@@ -511,12 +501,11 @@
   }
 
   Future<void> test_fromElement_MIXIN() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 mixin A {}
 ''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, 'A');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, 'A');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.MIXIN);
@@ -524,7 +513,7 @@
       expect(element.typeParameters, isNull);
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 6);
         expect(location.length, 'A'.length);
         expect(location.startLine, 1);
@@ -536,20 +525,19 @@
   }
 
   Future<void> test_fromElement_SETTER() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestUnit('''
 class A {
   set mySetter(String x) {}
 }''');
-    var unit = await resolveLibraryUnit(source);
     engine.PropertyAccessorElement engineElement =
-        findElementInUnit(unit, 'mySetter', engine.ElementKind.SETTER);
+        findElementInUnit(testUnit, 'mySetter', engine.ElementKind.SETTER);
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.SETTER);
     expect(element.name, 'mySetter');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 16);
       expect(location.length, 'mySetter'.length);
       expect(location.startLine, 2);
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 197842e..f91b4f7 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -9,16 +9,17 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import 'completion_contributor_util.dart';
 
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ArgListContributorTest);
+    defineReflectiveTests(ArgListContributorWithNullSafetyTest);
   });
 }
 
-@reflectiveTest
-class ArgListContributorTest extends DartCompletionContributorTest {
+mixin ArgListContributorMixin on DartCompletionContributorTest {
   void assertNoOtherSuggestions(Iterable<CompletionSuggestion> expected) {
     for (var suggestion in suggestions) {
       if (!expected.contains(suggestion)) {
@@ -111,7 +112,11 @@
   DartCompletionContributor createContributor() {
     return ArgListContributor();
   }
+}
 
+@reflectiveTest
+class ArgListContributorTest extends DartCompletionContributorTest
+    with ArgListContributorMixin {
   Future<void> test_Annotation_imported_constructor_named_param() async {
     addSource('/home/test/lib/a.dart', '''
 library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
@@ -380,7 +385,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_0() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/widgets.dart';
@@ -400,7 +405,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_01() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -421,7 +426,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_1() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -442,7 +447,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_2() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -466,7 +471,7 @@
       test_ArgumentList_Flutter_InstanceCreationExpression_children_dynamic() async {
     // Ensure we don't generate unneeded <dynamic> param if a future API doesn't
     // type it's children.
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -492,7 +497,7 @@
   Future<void>
       test_ArgumentList_Flutter_InstanceCreationExpression_children_Map() async {
     // Ensure we don't generate Map params for a future API
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -516,7 +521,7 @@
 
   Future<void>
       test_ArgumentList_Flutter_InstanceCreationExpression_slivers() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -544,7 +549,7 @@
     // TODO(brianwilkerson) This test has been changed so that it no longer has
     // anything to do with Flutter (by moving the declaration of `foo` out of
     // the 'material' library). Determine whether the test is still valid.
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -964,7 +969,7 @@
   }
 
   Future<void> test_ArgumentList_local_constructor_required_param_0() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 class A { A({int one, @required String two: 'defaultValue'}) { } }
@@ -1078,8 +1083,27 @@
     assertNoSuggestions();
   }
 
+  Future<void> test_superConstructorInvocation() async {
+    addTestSource('''
+class A {
+  final bool field1;
+  final int field2;
+  A({this.field1, this.field2});
+}
+class B extends A {
+  B() : super(^);
+}
+''');
+    await computeSuggestions();
+    assertSuggestArgumentsAndTypes(
+        namedArgumentsWithTypes: {'field1': 'bool', 'field2': 'int'});
+  }
+}
+
+@reflectiveTest
+class ArgListContributorWithNullSafetyTest extends DartCompletionContributorTest
+    with WithNullSafetyMixin, ArgListContributorMixin {
   Future<void> test_ArgumentList_nnbd_function_named_param() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     addTestSource(r'''
 f({int? nullable, int nonnullable}) {}
 main() { f(^);}');
@@ -1092,7 +1116,6 @@
   }
 
   Future<void> test_ArgumentList_nnbd_function_named_param_imported() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     addSource('/home/test/lib/a.dart', '''
 f({int? nullable, int nonnullable}) {}''');
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
@@ -1108,7 +1131,6 @@
   }
 
   Future<void> test_ArgumentList_nnbd_function_named_param_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     addSource('/home/test/lib/a.dart', '''
 // @dart = 2.8
 f({int named}) {}''');
@@ -1121,20 +1143,4 @@
       'named': 'int*',
     });
   }
-
-  Future<void> test_superConstructorInvocation() async {
-    addTestSource('''
-class A {
-  final bool field1;
-  final int field2;
-  A({this.field1, this.field2});
-}
-class B extends A {
-  B() : super(^);
-}
-''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'field1': 'bool', 'field2': 'int'});
-  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index d326ca1..8e22c6a 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -11,6 +11,7 @@
     show DartCompletionRequestImpl;
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -75,6 +76,8 @@
   int replacementOffset;
   int replacementLength;
 
+  ResolvedUnitResult result;
+
   /// The Dartdoc information passed to requests.
   final DartdocDirectiveInfo dartdocInfo = DartdocDirectiveInfo();
 
@@ -547,9 +550,9 @@
       DartCompletionRequest request);
 
   Future computeSuggestions({int times = 200}) async {
-    var resolveResult = await session.getResolvedUnit(testFile);
-    var baseRequest = CompletionRequestImpl(resolveResult, completionOffset,
-        useNewRelevance, CompletionPerformance());
+    result = await session.getResolvedUnit(testFile);
+    var baseRequest = CompletionRequestImpl(
+        result, completionOffset, useNewRelevance, CompletionPerformance());
 
     return await baseRequest.performance.runRequestOperation(
       (performance) async {
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index c77e7ce..5a3825d 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_resolveDirectives() async {
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 library libA;
 /// My class.
 /// Short description.
@@ -38,13 +38,15 @@
 /// Longer description.
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
 library libB;
 import "a.dart" as foo;
 part 'test.dart';
 ''');
     addTestSource('part of libB; main() {^}');
 
+    await resolveFile('$testPackageLibPath/b.dart');
+
     // Build the request
     var baseRequest = CompletionRequestImpl(
         await session.getResolvedUnit(testFile),
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 1ae4849..610dded 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -9,16 +9,17 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import 'completion_contributor_util.dart';
 
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ImportedReferenceContributorTest);
+    defineReflectiveTests(ImportedReferenceContributorWithNullSafetyTest);
   });
 }
 
-@reflectiveTest
-class ImportedReferenceContributorTest extends DartCompletionContributorTest {
+mixin ImportedReferenceContributorMixin on DartCompletionContributorTest {
   @override
   bool get isNullExpectedReturnTypeConsideredDynamic => false;
 
@@ -26,10 +27,14 @@
   DartCompletionContributor createContributor() {
     return ImportedReferenceContributor();
   }
+}
 
+@reflectiveTest
+class ImportedReferenceContributorTest extends DartCompletionContributorTest
+    with ImportedReferenceContributorMixin {
   /// Sanity check.  Permutations tested in local_ref_contributor.
   Future<void> test_ArgDefaults_function_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
 
     resolveSource('/home/test/lib/b.dart', '''
 lib B;
@@ -1192,7 +1197,8 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('aaa', 'a.dart', 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+
     addTestSource('main() { ^ }');
 
     await computeSuggestions();
@@ -2303,69 +2309,6 @@
     expect(suggestion.hasNamedParameters, true);
   }
 
-  Future<void> test_function_parameters_nnbd_required() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
-void m(int? nullable, int nonNullable) {}
-''');
-    addTestSource('''
-import 'a.dart';
-
-main() {^}
-''');
-    await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'nullable');
-    expect(suggestion.parameterTypes[0], 'int?');
-    expect(suggestion.parameterNames[1], 'nonNullable');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 2);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  Future<void> test_function_parameters_nnbd_required_into_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
-void m(int? nullable, int nonNullable) {}
-''');
-    addTestSource('''
-// @dart = 2.8
-import 'a.dart';
-
-main() {^}
-''');
-    await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'nullable');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.parameterNames[1], 'nonNullable');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 2);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  Future<void> test_function_parameters_nnbd_required_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
-// @dart = 2.8
-void m(int param) {}
-''');
-    addTestSource('''
-import 'a.dart';
-
-main() {^}
-''');
-    await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(1));
-    expect(suggestion.parameterNames[0], 'param');
-    expect(suggestion.parameterTypes[0], 'int*');
-    expect(suggestion.requiredParameterCount, 1);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
   Future<void> test_function_parameters_none() async {
     resolveSource('/home/test/lib/a.dart', '''
 void m() {}
@@ -3776,12 +3719,12 @@
 
   Future<void> test_partFile_TypeName() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library libA;
         import 'b.dart';
         part "test.dart";
@@ -3792,6 +3735,8 @@
         class B { B.bar(int x); }
         main() {new ^}''');
 
+    await resolveFile('$testPackageLibPath/a.dart');
+
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -4755,3 +4700,71 @@
     assertSuggestClass('Object');
   }
 }
+
+@reflectiveTest
+class ImportedReferenceContributorWithNullSafetyTest
+    extends DartCompletionContributorTest
+    with WithNullSafetyMixin, ImportedReferenceContributorMixin {
+  Future<void> test_function_parameters_nnbd_required() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+void m(int? nullable, int nonNullable) {}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'nullable');
+    expect(suggestion.parameterTypes[0], 'int?');
+    expect(suggestion.parameterNames[1], 'nonNullable');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  Future<void> test_function_parameters_nnbd_required_into_legacy() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+void m(int? nullable, int nonNullable) {}
+''');
+    addTestSource('''
+// @dart = 2.8
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'nullable');
+    expect(suggestion.parameterTypes[0], 'int');
+    expect(suggestion.parameterNames[1], 'nonNullable');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  Future<void> test_function_parameters_nnbd_required_legacy() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+// @dart = 2.8
+void m(int param) {}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(1));
+    expect(suggestion.parameterNames[0], 'param');
+    expect(suggestion.parameterTypes[0], 'int*');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 9f3adc4..f5f9774 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -11,6 +11,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import 'completion_contributor_util.dart';
 
 void main() {
@@ -457,7 +458,7 @@
 
   /// Return `true` if the given [feature] is enabled.
   bool isEnabled(Feature feature) =>
-      driver.analysisOptions.contextFeatures.isEnabled(feature);
+      result.libraryElement.featureSet.isEnabled(feature);
 
   Future<void> test_after_class_noPrefix() async {
     addTestSource('class A {} ^');
@@ -2267,10 +2268,5 @@
 }
 
 @reflectiveTest
-class KeywordContributorWithNullSafetyTest extends KeywordContributorTest {
-  @override
-  void setupResourceProvider() {
-    super.setupResourceProvider();
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-  }
-}
+class KeywordContributorWithNullSafetyTest extends KeywordContributorTest
+    with WithNullSafetyMixin {}
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index 1f1a333..95a7d99 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -99,11 +99,12 @@
 
   Future<void> test_libraryPrefix_deferred_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library testA;
         import "dart:async" deferred as bar;
         part "test.dart";''');
     addTestSource('part of testA; foo() {bar.^}');
+    await resolveFile('$testPackageLibPath/a.dart');
     // Assume that libraries containing has been computed for part files
     await computeSuggestions();
     assertSuggestClass('Future');
@@ -112,8 +113,8 @@
   }
 
   Future<void> test_libraryPrefix_with_exports() async {
-    addSource('/home/test/lib/a.dart', 'library libA; class A { }');
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: 'library libA; class A { }');
+    newFile('$testPackageLibPath/b.dart', content: '''
         library libB;
         export "a.dart";
         class B { }
@@ -188,12 +189,12 @@
 
   Future<void> test_PrefixedIdentifier_library_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library testA;
         import "b.dart" as b;
         part "test.dart";
@@ -202,6 +203,7 @@
     addTestSource('''
         part of testA;
         main() {b.^}''');
+    await resolveFile('$testPackageLibPath/a.dart');
     // Assume that libraries containing has been computed for part files
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -218,7 +220,7 @@
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
         class X { }
@@ -243,7 +245,7 @@
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
         class X { }
@@ -268,7 +270,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
@@ -282,7 +284,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index 0cdcb90..e6e9ec2 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
@@ -303,6 +303,7 @@
     addTestSource('''
 part of testB;
 main() {new ^ String x = "hello";}''');
+    await analyzeTestPackageFiles();
     await computeSuggestions();
     assertSuggestLibraryPrefixes(['math', 't']);
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index e6724b6..08f9a72 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -24,12 +24,12 @@
 
   Future<void> test_partFile_Constructor() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library libA;
         import "b.dart";
         part "test.dart";
@@ -39,6 +39,7 @@
         part of libA;
         class B { B.bar(int x); }
         main() {new ^}''');
+    await resolveFile('$testPackageLibPath/a.dart');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -58,12 +59,12 @@
 
   Future<void> test_partFile_Constructor2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class B { }''');
     addTestSource('''
@@ -91,7 +92,7 @@
   }
 
   Future<void> test_partFile_extension() async {
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 part of libA;
 extension E on int {}
 ''');
@@ -109,12 +110,12 @@
   Future<void>
       test_partFile_InstanceCreationExpression_assignment_filter() async {
     // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class A {} class B extends A {} class C implements A {} class D {}
         ''');
@@ -156,12 +157,12 @@
   Future<void>
       test_partFile_InstanceCreationExpression_variable_declaration_filter() async {
     // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class A {} class B extends A {} class C implements A {} class D {}
         ''');
@@ -199,12 +200,12 @@
   }
 
   Future<void> test_partFile_TypeName() async {
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library libA;
         import "b.dart";
         part "test.dart";
@@ -216,6 +217,7 @@
         part of libA;
         class B { B.bar(int x); }
         main() {^}''');
+    await resolveFile('$testPackageLibPath/a.dart');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -241,12 +243,12 @@
   }
 
   Future<void> test_partFile_TypeName2() async {
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class B { var b1; b2(){}}
         int bf() => 0;
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index bb0f9a8..e0268de 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_ArgDefaults_function_with_optional_positional() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_ArgDefaults_function_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_ArgDefaults_inherited_method_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     resolveSource('/home/test/lib/b.dart', '''
 import 'package:meta/meta.dart';
 
@@ -96,7 +96,7 @@
   }
 
   Future<void> test_ArgDefaults_method_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -1498,7 +1498,7 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('aaa', 'a.dart', 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('main() { ^ }');
 
     await computeSuggestions();
@@ -3995,7 +3995,7 @@
   }
 
   Future<void> test_localConstructor() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -4010,14 +4010,14 @@
   }
 
   Future<void> test_localConstructor2() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''class A {A.named();} main() {^}}''');
     await computeSuggestions();
     assertSuggestConstructor('A.named');
   }
 
   Future<void> test_localConstructor_abstract() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 abstract class A {
   A();
@@ -4030,14 +4030,14 @@
   }
 
   Future<void> test_localConstructor_defaultConstructor() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''class A {} main() {^}}''');
     await computeSuggestions();
     assertSuggestConstructor('A');
   }
 
   Future<void> test_localConstructor_factory() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 abstract class A {
   factory A();
@@ -4050,7 +4050,7 @@
   }
 
   Future<void> test_localConstructor_optionalNew() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -6047,7 +6047,7 @@
 
   Future<void> _check_flutter_setState(
       String line, String completion, int selectionOffset) async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     addTestSource('''
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index 7edebfc..34832e9 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -171,6 +171,7 @@
 }
 ''');
     // assume information for context.getLibrariesContaining has been cached
+    await resolveFile('$testPackageLibPath/myLib.dart');
     await computeSuggestions();
     _assertOverride('''
 @override
@@ -405,7 +406,7 @@
   }
 
   Future<void> test_private_otherLibrary() async {
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   void foo() {}
   void _bar() {}
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index ba212b20..f1fd8f5 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -78,7 +78,7 @@
   }
 
   Future<void> test_ArgDefaults_method_with_optional_positional() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -93,7 +93,7 @@
   }
 
   Future<void> test_ArgDefaults_method_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -1075,7 +1075,7 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('aaa', 'a.dart', 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('main() { ^ }');
 
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index cf86d79..3d4a399 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:path/path.dart';
 import 'package:test/test.dart';
@@ -21,6 +22,8 @@
 
 @reflectiveTest
 class UriContributorTest extends DartCompletionContributorTest {
+  String get testPackageTestPath => '$testPackageRootPath/test';
+
   @override
   DartCompletionContributor createContributor() {
     return UriContributor();
@@ -67,9 +70,18 @@
   }
 
   Future<void> test_export_package2() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart', content: 'library foo;');
+    newFile('$fooRootPath/lib/baz/too.dart', content: 'library too;');
+    newFile('$barRootPath/lib/bar.dart', content: 'library bar;');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('export "package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -79,9 +91,19 @@
   Future<void> test_export_package2_off() async {
     try {
       UriContributor.suggestFilePaths = false;
-      addPackageFile('foo', 'foo.dart', 'library foo;');
-      addPackageFile('foo', 'baz/too.dart', 'library too;');
-      addPackageFile('bar', 'bar.dart', 'library bar;');
+
+      var fooRootPath = '$workspaceRootPath/foo';
+      var barRootPath = '$workspaceRootPath/bar';
+      newFile('$fooRootPath/lib/foo.dart', content: 'library foo;');
+      newFile('$fooRootPath/lib/baz/too.dart', content: 'library too;');
+      newFile('$barRootPath/lib/bar.dart', content: 'library bar;');
+
+      writeTestPackageConfig(
+        config: PackageConfigFileBuilder()
+          ..add(name: 'foo', rootPath: fooRootPath)
+          ..add(name: 'bar', rootPath: barRootPath),
+      );
+
       addTestSource('export "package:foo/baz/^" import');
       await computeSuggestions();
       assertNotSuggested('package:foo/baz/too.dart');
@@ -142,10 +164,11 @@
   }
 
   Future<void> test_import_file() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -159,10 +182,11 @@
   }
 
   Future<void> test_import_file2() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -178,10 +202,12 @@
   Future<void> test_import_file2_off() async {
     try {
       UriContributor.suggestFilePaths = false;
-      testFile = convertPath('/proj/completion.dart');
-      addSource('/proj/other.dart', 'library other;');
-      addSource('/proj/foo/bar.dart', 'library bar;');
-      addSource('/blat.dart', 'library blat;');
+
+      testFile = convertPath('$testPackageRootPath/test.dart');
+      newFile('$testPackageRootPath/other.dart');
+      newFile('$testPackageRootPath/foo/bar.dart');
+      newFile('$workspaceRootPath/blat.dart');
+
       addTestSource('import "..^" import');
       await computeSuggestions();
       expect(replacementOffset, completionOffset - 2);
@@ -198,10 +224,11 @@
   }
 
   Future<void> test_import_file_child() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -215,11 +242,11 @@
   }
 
   Future<void> test_import_file_outside_lib() async {
-    testFile = convertPath('/proj/lib/completion.dart');
-    addSource('/proj/lib/other.dart', 'library other;');
-    addSource('/proj/lib/foo/bar.dart', 'library bar;');
-    addSource('/proj/blat.dart', 'library blat;');
-    addSource('/proj/bin/boo.dart', 'library boo;');
+    newFile('$testPackageLibPath/other.dart');
+    newFile('$testPackageLibPath/foo/bar.dart');
+    newFile('$testPackageRootPath/blat.dart');
+    newFile('$testPackageRootPath/bin/boo.dart');
+
     addTestSource('import "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -235,11 +262,12 @@
   }
 
   Future<void> test_import_file_parent() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
-    addSource('/proj2/boo.dart', 'library boo;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+    newFile('$workspaceRootPath/aaa/boo.dart');
+
     addTestSource('import "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -250,14 +278,15 @@
     assertNotSuggested('foo/');
     assertNotSuggested('foo/bar.dart');
     assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
-    assertSuggest('../proj2/', csKind: CompletionSuggestionKind.IMPORT);
+    assertSuggest('../aaa/', csKind: CompletionSuggestionKind.IMPORT);
   }
 
   Future<void> test_import_file_parent2() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "../b^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -271,27 +300,37 @@
   }
 
   Future<void> test_import_no_dot_folders() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    newFolder('/proj/.fooFolder');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFolder('$testPackageRootPath/.foo');
+
     addTestSource('import "package:^";');
     await computeSuggestions();
-    assertNotSuggested('.fooFolder/');
+    assertNotSuggested('.foo/');
   }
 
   Future<void> test_import_only_dart_files() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    newFile('/proj/analysis_options.yaml', content: '# analysis options');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/analysis_options.yaml');
+
     addTestSource('import "package:^";');
     await computeSuggestions();
     assertNotSuggested('analysis_options.yaml');
   }
 
   Future<void> test_import_package() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "p^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -308,9 +347,18 @@
   }
 
   Future<void> test_import_package2() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -320,9 +368,19 @@
   Future<void> test_import_package2_off() async {
     try {
       UriContributor.suggestFilePaths = false;
-      addPackageFile('foo', 'foo.dart', 'library foo;');
-      addPackageFile('foo', 'baz/too.dart', 'library too;');
-      addPackageFile('bar', 'bar.dart', 'library bar;');
+
+      var fooRootPath = '$workspaceRootPath/foo';
+      var barRootPath = '$workspaceRootPath/bar';
+      newFile('$fooRootPath/lib/foo.dart');
+      newFile('$fooRootPath/lib/baz/too.dart');
+      newFile('$barRootPath/lib/bar.dart');
+
+      writeTestPackageConfig(
+        config: PackageConfigFileBuilder()
+          ..add(name: 'foo', rootPath: fooRootPath)
+          ..add(name: 'bar', rootPath: barRootPath),
+      );
+
       addTestSource('import "package:foo/baz/^" import');
       await computeSuggestions();
       assertNotSuggested('package:foo/baz/too.dart');
@@ -332,9 +390,18 @@
   }
 
   Future<void> test_import_package2_raw() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import r"package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -342,9 +409,18 @@
   }
 
   Future<void> test_import_package2_with_trailing() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "package:foo/baz/^.dart" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -354,8 +430,12 @@
   }
 
   Future<void> test_import_package_missing_lib() async {
-    var pkgFile = addPackageFile('bar', 'bar.dart', 'library bar;');
-    deleteFolder(pkgFile.parent.path);
+    var barRootPath = '$workspaceRootPath/bar';
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "p^" class');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -366,9 +446,18 @@
   }
 
   Future<void> test_import_package_raw() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import r"p^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -458,10 +547,11 @@
   }
 
   Future<void> test_part_file() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -475,10 +565,11 @@
   }
 
   Future<void> test_part_file2() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -492,10 +583,11 @@
   }
 
   Future<void> test_part_file_child() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -509,10 +601,11 @@
   }
 
   Future<void> test_part_file_parent() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -539,10 +632,11 @@
   }
 
   Future<void> test_import_file() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -556,10 +650,11 @@
   }
 
   Future<void> test_import_file2() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -573,10 +668,11 @@
   }
 
   Future<void> test_import_file_child() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -590,10 +686,11 @@
   }
 
   Future<void> test_import_file_parent() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -607,10 +704,11 @@
   }
 
   Future<void> test_import_file_parent2() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "../b^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -624,10 +722,11 @@
   }
 
   Future<void> test_part_file() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -641,10 +740,11 @@
   }
 
   Future<void> test_part_file2() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -658,10 +758,11 @@
   }
 
   Future<void> test_part_file_child() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -675,10 +776,11 @@
   }
 
   Future<void> test_part_file_parent() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index 07d36a2..da88074 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
@@ -4,10 +4,10 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/completion/postfix/postfix_completion.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import '../../../abstract_single_unit.dart';
 
 void main() {
@@ -623,7 +623,7 @@
 }
 
 @reflectiveTest
-class _TryTest extends PostfixCompletionTest {
+class _TryTest extends PostfixCompletionTest with WithNullSafetyMixin {
   Future<void> test_try() async {
     await _prepareCompletion('.try', '''
 f() {
@@ -710,7 +710,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     await _prepareCompletion('.tryon', '''
 f() {
   throw 'error';.tryon
@@ -728,7 +727,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 String? x;
 ''');
@@ -753,7 +751,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy_nested() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 List<String?> x;
 ''');
@@ -778,7 +775,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 // @dart = 2.8
 String x;
@@ -802,7 +798,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy_nested() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 // @dart = 2.8
 List<String> x;
@@ -826,7 +821,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_nullable() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     await _prepareCompletion('.tryon', '''
 f() {
   String? x;
@@ -846,7 +840,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_nullable_nested() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     await _prepareCompletion('.tryon', '''
 f() {
   List<String?>? x;
diff --git a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
index 11cbc6b..cb6d7b5 100644
--- a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
@@ -61,7 +61,6 @@
   }
 
   Future<void> _computeCompletion(int offset) async {
-    driver.changeFile(testFile);
     var result = await session.getResolvedUnit(testFile);
     var context = StatementCompletionContext(result, offset);
     var processor = StatementCompletionProcessor(context);
diff --git a/pkg/analysis_server/test/services/correction/util_test.dart b/pkg/analysis_server/test/services/correction/util_test.dart
index 530c5ea..7d4eacc 100644
--- a/pkg/analysis_server/test/services/correction/util_test.dart
+++ b/pkg/analysis_server/test/services/correction/util_test.dart
@@ -11,6 +11,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../abstract_single_unit.dart';
+import '../../src/services/correction/assist/assist_processor.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -36,6 +37,9 @@
     var condition = ifStatement.condition;
     var result = CorrectionUtils(testAnalysisResult).invertCondition(condition);
     expect(result, expected);
+    // For compactness we put multiple cases into one test method.
+    // Prepare for resolving the test file one again.
+    changeFile(testFile);
   }
 
   Future<void> test_addLibraryImports_dart_hasImports_between() async {
@@ -192,7 +196,15 @@
 
   Future<void>
       test_addLibraryImports_package_hasDart_hasPackages_insertAfter() async {
-    addPackageFile('aaa', 'aaa.dart', '');
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart');
+    newFile('$workspaceRootPath/bbb/lib/bbb.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'),
+    );
+
     await resolveTestUnit('''
 import 'dart:async';
 
@@ -209,7 +221,15 @@
 
   Future<void>
       test_addLibraryImports_package_hasDart_hasPackages_insertBefore() async {
-    addPackageFile('bbb', 'bbb.dart', '');
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart');
+    newFile('$workspaceRootPath/bbb/lib/bbb.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'),
+    );
+
     await resolveTestUnit('''
 import 'dart:async';
 
@@ -225,8 +245,19 @@
   }
 
   Future<void> test_addLibraryImports_package_hasImports_between() async {
-    addPackageFile('aaa', 'aaa.dart', '');
-    addPackageFile('ddd', 'ddd.dart', '');
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart');
+    newFile('$workspaceRootPath/bbb/lib/bbb.dart');
+    newFile('$workspaceRootPath/ccc/lib/ccc.dart');
+    newFile('$workspaceRootPath/ddd/lib/ddd.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb')
+        ..add(name: 'ccc', rootPath: '$workspaceRootPath/ccc')
+        ..add(name: 'ddd', rootPath: '$workspaceRootPath/ddd'),
+    );
+
     await resolveTestUnit('''
 import 'package:aaa/aaa.dart';
 import 'package:ddd/ddd.dart';
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
index 9f40c52..36d28f4 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
@@ -136,10 +136,12 @@
   }
 
   @override
-  void setUp() {
-    super.setUp();
+  void verifyCreatedCollection() {
+    super.verifyCreatedCollection();
     // TODO(dantup): Get these tests passing with either line ending and change this to true.
     useLineEndingsForPlatform = false;
-    searchEngine = SearchEngineImpl([driver]);
+    searchEngine = SearchEngineImpl([
+      driverFor(testPackageRootPath),
+    ]);
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 4b0783f..7de0635 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -12,6 +12,8 @@
 
 import 'abstract_refactoring.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 /// The base class for all [RenameRefactoring] tests.
 class RenameRefactoringTest extends RefactoringTest {
   @override
@@ -49,7 +51,10 @@
   /// Creates a new [RenameRefactoring] in [refactoring] for [element].
   /// Fails if no [RenameRefactoring] can be created.
   void createRenameRefactoringForElement(Element element) {
-    var workspace = RefactoringWorkspace([driver], searchEngine);
+    var workspace = RefactoringWorkspace(
+      [driverFor(testFile)],
+      searchEngine,
+    );
     refactoring = RenameRefactoring(workspace, testAnalysisResult, element);
     expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
   }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 8c1da18..be25023 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -21,8 +21,15 @@
   @override
   ExtractWidgetRefactoringImpl refactoring;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_checkAllConditions_selection() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 class C {}
@@ -34,7 +41,6 @@
   }
 
   Future<void> test_checkName() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -65,7 +71,6 @@
   }
 
   Future<void> test_checkName_alreadyDeclared() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -87,7 +92,6 @@
   }
 
   Future<void> test_expression() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -146,7 +150,6 @@
   }
 
   Future<void> test_expression_localFunction() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -193,7 +196,6 @@
   }
 
   Future<void> test_expression_onTypeName() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -230,7 +232,6 @@
   }
 
   Future<void> test_expression_selection() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -278,7 +279,6 @@
   }
 
   Future<void> test_expression_topFunction() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -319,7 +319,6 @@
   }
 
   Future<void> test_invocation_enclosingClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -344,7 +343,6 @@
   }
 
   Future<void> test_invocation_enclosingSuperClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -371,7 +369,6 @@
   }
 
   Future<void> test_invocation_otherClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -433,7 +430,6 @@
   }
 
   Future<void> test_method() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -482,7 +478,6 @@
   }
 
   Future<void> test_method_parameters() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -554,7 +549,6 @@
   }
 
   Future<void> test_method_parameters_named() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -626,7 +620,6 @@
   }
 
   Future<void> test_parameters_field_read_enclosingClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -670,7 +663,6 @@
   }
 
   Future<void> test_parameters_field_read_otherClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -722,7 +714,6 @@
   }
 
   Future<void> test_parameters_field_read_topLevelVariable() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -763,7 +754,6 @@
   }
 
   Future<void> test_parameters_field_write_enclosingClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -788,7 +778,6 @@
   }
 
   Future<void> test_parameters_field_write_enclosingSuperClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -815,7 +804,6 @@
   }
 
   Future<void> test_parameters_field_write_otherClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -877,7 +865,6 @@
   }
 
   Future<void> test_parameters_key() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -896,7 +883,6 @@
   }
 
   Future<void> test_parameters_local_read_enclosingScope() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -938,7 +924,6 @@
   }
 
   Future<void> test_parameters_local_write_enclosingScope() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -962,7 +947,6 @@
   }
 
   Future<void> test_parameters_private() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1006,7 +990,6 @@
   }
 
   Future<void> test_parameters_private_conflictWithPublic() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1054,7 +1037,6 @@
   }
 
   Future<void> test_parameters_readField_readLocal() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1112,7 +1094,6 @@
   }
 
   Future<void> test_refactoringName() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -1128,7 +1109,6 @@
   }
 
   Future<void> test_statements() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1184,7 +1164,6 @@
   }
 
   Future<void> test_statements_BAD_emptySelection() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1200,7 +1179,6 @@
   }
 
   Future<void> test_statements_BAD_notReturnStatement() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 6fdbfda..26f8105 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -38,6 +38,7 @@
 part 'a.dart';
 part '${toUriStr('/absolute/uri.dart')}';
 ''');
+    await analyzeTestPackageFiles();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
@@ -59,6 +60,7 @@
     addTestSource(r'''
 import 'package:test/old_name.dart';
 ''');
+    await analyzeTestPackageFiles();
 
     // Since the file being refactored isn't the test source, we set the
     // testAnalysisResult manually here, the path is referenced through the
@@ -147,6 +149,7 @@
     addTestSource(r'''
 import 'package:test/111/old_name.dart';
 ''');
+    await analyzeTestPackageFiles();
 
     // Since the file being refactored isn't the test source, we set the
     // testAnalysisResult manually here, the path is referenced through the
@@ -166,6 +169,7 @@
     addTestSource(r'''
 import 'package:test/222/old_name.dart';
 ''');
+    await analyzeTestPackageFiles();
 
     // Since the file being refactored isn't the test source, we set the
     // testAnalysisResult manually here, the path is referenced through the
@@ -186,6 +190,7 @@
     addSource(pathA, '''
 import 'test.dart';
 ''');
+    await analyzeTestPackageFiles();
     await resolveTestUnit('');
 
     // perform refactoring
@@ -204,6 +209,7 @@
     addSource(pathA, '''
 import 'sub/folder/test.dart';
 ''');
+    await analyzeTestPackageFiles();
     await resolveTestUnit('');
     // perform refactoring
     _createRefactoring('/home/test/000/new/folder/name/new_name.dart');
@@ -220,6 +226,7 @@
     addSource(pathA, '''
 import '22/test.dart';
 ''');
+    await analyzeTestPackageFiles();
     await resolveTestUnit('');
     // perform refactoring
     _createRefactoring('/home/test/000/1111/new_name.dart');
@@ -269,9 +276,11 @@
 library lib;
 part '22/test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of lib;
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestUnit2();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
@@ -328,9 +337,11 @@
 library lib;
 part '22/test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of '../a.dart';
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestUnit2();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/33/test.dart');
     await _assertSuccessfulRefactoring();
@@ -398,9 +409,11 @@
     addSource(pathA, '''
 part 'test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of 'a.dart';
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestUnit2();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/test.dart');
     await _assertSuccessfulRefactoring();
@@ -421,9 +434,11 @@
     addSource(pathA, '''
 part 'test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of 'a.dart';
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestUnit2();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/test2.dart');
     await _assertSuccessfulRefactoring();
@@ -449,7 +464,8 @@
   }
 
   void _createRefactoring(String newFile, {String oldFile}) {
-    var refactoringWorkspace = RefactoringWorkspace([driver], searchEngine);
+    var refactoringWorkspace =
+        RefactoringWorkspace([driverFor(testFile)], searchEngine);
     // Allow passing an oldName for when we don't want to rename testSource,
     // but otherwise fall back to testSource.fullname
     oldFile = convertPath(oldFile ?? testSource.fullName);
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index dec50cc..97731a6 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -748,11 +748,18 @@
   }
 
   Future<void> test_createChange_MethodElement_potential_inPubCache() async {
-    var externalPath = addPackageFile('aaa', 'lib.dart', r'''
+    var externalPath = '/.pub-cache/aaa/lib/lib.dart';
+    newFile(externalPath, content: r'''
 processObj(p) {
   p.test();
 }
-''').path;
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '/.pub-cache/aaa/'),
+    );
+
     await indexTestUnit('''
 import 'package:aaa/lib.dart';
 
@@ -821,7 +828,7 @@
   }
 
   Future<void> test_createChange_outsideOfProject_declarationInPackage() async {
-    addPackageFile('aaa', 'aaa.dart', r'''
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart', content: r'''
 class A {
   void test() {}
 }
@@ -830,6 +837,12 @@
   a.test();
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
+
     await indexTestUnit('''
 import 'package:aaa/aaa.dart';
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index bd45b2f..045a97a 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -230,7 +230,7 @@
 
   Future<void> test_newInstance_nullElement() async {
     await indexTestUnit('');
-    var workspace = RefactoringWorkspace([driver], searchEngine);
+    var workspace = RefactoringWorkspace([driverFor(testFile)], searchEngine);
     var refactoring = RenameRefactoring(workspace, testAnalysisResult, null);
     expect(refactoring, isNull);
   }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index b0d2aff..31993ea 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -463,11 +463,9 @@
   new A(test: 2);
 }
 ''');
-    driver.addFile(a);
-    driver.addFile(b);
+    await analyzeTestPackageFiles();
 
-    var session = driver.currentSession;
-    testAnalysisResult = await session.getResolvedUnit(a);
+    testAnalysisResult = await resolveFile(a);
     testFile = testAnalysisResult.path;
     testCode = testAnalysisResult.content;
     testUnit = testAnalysisResult.unit;
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 0e64120..ab7d05d 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -236,11 +236,17 @@
   }
 
   Future<void> test_checkInitialConditions_outsideOfProject() async {
-    addPackageFile('aaa', 'lib.dart', r'''
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
 class A {}
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
+
     await indexTestUnit('''
-import "package:aaa/lib.dart";
+import "package:aaa/a.dart";
 main() {
   A a;
 }
@@ -374,7 +380,7 @@
   }
 
   Future<void> test_createChange_ClassElement_flutterWidget() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -416,7 +422,7 @@
 
   Future<void>
       test_createChange_ClassElement_flutterWidget_privateBoth() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -458,7 +464,7 @@
 
   Future<void>
       test_createChange_ClassElement_flutterWidget_privateState() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index b74fc20..f445dcc 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -23,7 +23,7 @@
   @override
   void setUp() {
     super.setUp();
-    searchEngine = SearchEngineImpl([driver]);
+    searchEngine = SearchEngineImpl([driverFor(testFile)]);
   }
 
   Future<void> test_getClassMembers() async {
diff --git a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
index af893d6..4cbaa050 100644
--- a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/computer/import_elements_computer.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -78,12 +79,19 @@
   }
 
   Future<void> test_createEdits_addImport_noPrefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' as foo;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A'])
+      ImportedElements(fooPath, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' as foo;
@@ -92,12 +100,19 @@
   }
 
   Future<void> test_createEdits_addImport_prefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart';
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, 'foo', <String>['A'])
+      ImportedElements(fooPath, 'foo', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart';
@@ -106,13 +121,20 @@
   }
 
   Future<void> test_createEdits_addShow_multipleNames() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show B;
 import 'package:pkg/foo.dart' as foo;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A', 'C'])
+      ImportedElements(fooPath, '', <String>['A', 'C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show B, A, C;
@@ -121,12 +143,19 @@
   }
 
   Future<void> test_createEdits_addShow_removeHide() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show A, B hide C, D;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['C'])
+      ImportedElements(fooPath, '', <String>['C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show A, B, C hide D;
@@ -134,12 +163,19 @@
   }
 
   Future<void> test_createEdits_addShow_singleName_noPrefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show B;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A'])
+      ImportedElements(fooPath, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show B, A;
@@ -147,13 +183,20 @@
   }
 
   Future<void> test_createEdits_addShow_singleName_prefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show C;
 import 'package:pkg/foo.dart' as foo show B;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, 'foo', <String>['A'])
+      ImportedElements(fooPath, 'foo', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show C;
@@ -162,34 +205,55 @@
   }
 
   Future<void> test_createEdits_alreadyImported_noCombinators() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart';
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A', 'B'])
+      ImportedElements(fooPath, '', <String>['A', 'B'])
     ]);
     assertNoChanges();
   }
 
   Future<void> test_createEdits_alreadyImported_withPrefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' as foo;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, 'foo', <String>['A', 'B'])
+      ImportedElements(fooPath, 'foo', <String>['A', 'B'])
     ]);
     assertNoChanges();
   }
 
   Future<void> test_createEdits_alreadyImported_withShow() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show A;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A'])
+      ImportedElements(fooPath, '', <String>['A'])
     ]);
     assertNoChanges();
   }
@@ -207,12 +271,19 @@
   }
 
   Future<void> test_createEdits_invalidUri() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'pakage:pkg/foo.dart';
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A'])
+      ImportedElements(fooPath, '', <String>['A'])
     ]);
     assertChanges('''
 import 'pakage:pkg/foo.dart';
@@ -227,12 +298,19 @@
   }
 
   Future<void> test_createEdits_removeHide_firstInCombinator() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A'])
+      ImportedElements(fooPath, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide B, C;
@@ -240,12 +318,19 @@
   }
 
   Future<void> test_createEdits_removeHide_lastInCombinator() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['C'])
+      ImportedElements(fooPath, '', <String>['C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A, B;
@@ -253,12 +338,19 @@
   }
 
   Future<void> test_createEdits_removeHide_middleInCombinator() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['B'])
+      ImportedElements(fooPath, '', <String>['B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A, C;
@@ -266,12 +358,19 @@
   }
 
   Future<void> test_createEdits_removeHide_multipleCombinators() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['B'])
+      ImportedElements(fooPath, '', <String>['B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A, C hide A, C;
@@ -279,12 +378,19 @@
   }
 
   Future<void> test_createEdits_removeHide_multipleNames() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C hide D, E, F hide G, H, I;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A', 'E', 'I'])
+      ImportedElements(fooPath, '', <String>['A', 'E', 'I'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide B, C hide D, F hide G, H;
@@ -292,12 +398,19 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_first() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A'])
+      ImportedElements(fooPath, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide B hide C;
@@ -305,12 +418,19 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_last() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['C'])
+      ImportedElements(fooPath, '', <String>['C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A hide B;
@@ -318,12 +438,19 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_middle() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['B'])
+      ImportedElements(fooPath, '', <String>['B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A hide C;
@@ -331,12 +458,19 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_only() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A'])
+      ImportedElements(fooPath, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart';
@@ -344,12 +478,19 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_only_multiple() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooPath = '$workspaceRootPath/pkg/lib/foo.dart';
+    newFile(fooPath, content: '');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B;
 ''');
     await computeChanges(<ImportedElements>[
-      ImportedElements(fooFile.path, '', <String>['A', 'B'])
+      ImportedElements(fooPath, '', <String>['A', 'B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart';
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index a00364a..171d627 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -8,6 +8,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../abstract_context.dart';
+import '../../services/refactoring/abstract_rename.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -220,7 +221,8 @@
   }
 
   Future<void> test_package_multipleInSame() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class A {
   static String a = '';
 }
@@ -228,6 +230,12 @@
   static String b = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'A.a + B.b';
     var content = '''
 import 'package:foo/foo.dart';
@@ -237,16 +245,23 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['A', 'B']),
+      ImportedElements(fooPath, '', ['A', 'B']),
     ]);
   }
 
   Future<void> test_package_noPrefix() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'Foo.first';
     var content = '''
 import 'package:foo/foo.dart';
@@ -256,16 +271,23 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
+      ImportedElements(fooPath, '', ['Foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_class() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.Foo.first';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -275,14 +297,21 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['Foo']),
+      ImportedElements(fooPath, 'f', ['Foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_function() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 String foo() => '';
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.foo()';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -292,14 +321,21 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo']),
+      ImportedElements(fooPath, 'f', ['foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_getter() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 String foo = '';
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.foo';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -309,14 +345,21 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo']),
+      ImportedElements(fooPath, 'f', ['foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_setter() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 String foo = '';
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.foo';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -326,16 +369,23 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo=']),
+      ImportedElements(fooPath, 'f', ['foo=']),
     ]);
   }
 
   Future<void> test_package_prefix_unselected() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'Foo.first';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -345,17 +395,24 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
+      ImportedElements(fooPath, '', ['Foo']),
     ]);
   }
 
   Future<void> test_package_prefixedAndNot() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
   static String second = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.Foo.first + Foo.second';
     var content = '''
 import 'package:foo/foo.dart';
@@ -366,8 +423,8 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['Foo']),
+      ImportedElements(fooPath, '', ['Foo']),
+      ImportedElements(fooPath, 'f', ['Foo']),
     ]);
   }
 
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 9f38295..6bdeff5 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -43,7 +43,7 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
   }
 
   Future<void> test_columnWithChildren() async {
@@ -671,7 +671,7 @@
   }
 
   Future<void> test_isTest_isTestGroup() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     var outline = await _computeOutline('''
 import 'package:meta/meta.dart';
 
diff --git a/pkg/analysis_server/test/src/domains/execution/completion_test.dart b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
index 5e7d02c..b70a9bb 100644
--- a/pkg/analysis_server/test/src/domains/execution/completion_test.dart
+++ b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/domains/execution/completion.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,6 +18,7 @@
 
 @reflectiveTest
 class RuntimeCompletionComputerTest extends AbstractContextTest {
+  OverlayResourceProvider overlayResourceProvider;
   String contextFile;
   int contextOffset;
 
@@ -57,8 +59,15 @@
     expect(codeOffset, isNonNegative);
     code = code.replaceAll('^', '');
 
-    var computer = RuntimeCompletionComputer(overlayResourceProvider, driver,
-        code, codeOffset, contextFile, contextOffset, variables, expressions);
+    var computer = RuntimeCompletionComputer(
+        overlayResourceProvider,
+        driverFor(contextFile),
+        code,
+        codeOffset,
+        contextFile,
+        contextOffset,
+        variables,
+        expressions);
     result = await computer.compute();
   }
 
@@ -85,6 +94,7 @@
     return null;
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_class_fields() async {
     addContextFile(r'''
 class A {
@@ -103,6 +113,7 @@
     assertSuggested('c', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_class_methods() async {
     addContextFile(r'''
 class A {
@@ -120,6 +131,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_inPart() async {
     addSource('/home/test/lib/a.dart', r'''
 part 'b.dart';
@@ -147,6 +159,7 @@
     assertSuggested('c', returnType: 'String');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_block() async {
     addContextFile(r'''
 class A {
@@ -167,6 +180,7 @@
     assertSuggested('foo');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_block_codeWithClosure() async {
     addContextFile(r'''
 main() {
@@ -178,6 +192,7 @@
     assertSuggested('toUpperCase');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_block_nested() async {
     addContextFile(r'''
 void main() {
@@ -198,6 +213,7 @@
     assertNotSuggested('c');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_for() async {
     addContextFile(r'''
 void main(List<int> intItems, List<double> doubleItems) {
@@ -211,6 +227,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_forEach() async {
     addContextFile(r'''
 void main(List<int> intItems, List<double> doubleItems) {
@@ -226,6 +243,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_constructor() async {
     addContextFile(r'''
 class C {
@@ -239,6 +257,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_function() async {
     addContextFile(r'''
 void main(int a, double b) {
@@ -250,6 +269,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_function_locals() async {
     addContextFile(r'''
 void main(int a, int b) {
@@ -264,6 +284,7 @@
     assertSuggested('c', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_function_nested() async {
     addContextFile(r'''
 void foo(int a, double b) {
@@ -278,6 +299,7 @@
     assertSuggested('c', returnType: 'bool');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_functionExpression() async {
     addContextFile(r'''
 void main(List<int> intItems, List<double> doubleItems) {
@@ -293,6 +315,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_method() async {
     addContextFile(r'''
 class C {
@@ -306,6 +329,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_method_locals() async {
     addContextFile(r'''
 class C {
@@ -322,6 +346,7 @@
     assertSuggested('c', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_syntheticImportPrefix() async {
     newFile('/test/lib/a.dart', content: 'class A {}');
     newFile('/test/lib/b.dart', content: 'class B {}');
@@ -340,6 +365,7 @@
     }
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_topLevelFunctions() async {
     addContextFile(r'''
 int a() => null;
@@ -353,6 +379,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_topLevelVariables() async {
     addContextFile(r'''
 int a;
diff --git a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
index 701dc96..3ab09de 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
@@ -30,7 +30,7 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
   }
 
 //  void _assertChange(SourceChange change, String expectedCode) {
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index 02fff3b..81e43c3 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -26,8 +26,8 @@
   @override
   void setUp() {
     super.setUp();
+    writeTestPackageConfig(flutter: true);
     testPath = convertPath('/home/test/lib/test.dart');
-    addFlutterPackage();
   }
 
   Future<void> test_attribute_namedExpression() async {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
index ded7a23..9525059 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   /// Full coverage in fix/add_diagnostic_property_reference_test.dart
   Future<void> test_boolField_debugFillProperties() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
@@ -60,7 +67,6 @@
   }
 
   Future<void> test_notAvailable_outsideDiagnosticable() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 class C {
   String get f/*caret*/ => null;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
index d0d30dd..58b7e66 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
@@ -201,17 +201,17 @@
 import 'my_lib.dart';
 part 'test.dart';
 ''';
-    var partCode = r'''
+    addTestSource(r'''
 part of my_app;
 main() {
   var /*caret*/v = getMap();
 }
-''';
+''');
 
     var appPath = convertPath('/home/test/lib/app.dart');
     addSource(appPath, appCode);
-    addSource(testFile, partCode);
-    await resolveTestUnit(partCode);
+    await analyzeTestPackageFiles();
+    await resolveTestUnit2();
 
     await assertHasAssist('''
 part of my_app;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
index 478f098..cac4641 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
@@ -16,6 +16,8 @@
 
 import '../../../../abstract_single_unit.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 /// A base class defining support for writing assist processor tests.
 abstract class AssistProcessorTest extends AbstractSingleUnitTest {
   int _offset;
@@ -32,6 +34,36 @@
     return DartChangeWorkspace([session]);
   }
 
+  @override
+  void addTestSource(String code, [Uri uri]) {
+    if (useLineEndingsForPlatform) {
+      code = normalizeNewlinesForPlatform(code);
+    }
+    final eol = code.contains('\r\n') ? '\r\n' : '\n';
+    var offset = code.indexOf('/*caret*/');
+    if (offset >= 0) {
+      var endOffset = offset + '/*caret*/'.length;
+      code = code.substring(0, offset) + code.substring(endOffset);
+      _offset = offset;
+      _length = 0;
+    } else {
+      var startOffset = code.indexOf('// start$eol');
+      var endOffset = code.indexOf('// end$eol');
+      if (startOffset >= 0 && endOffset >= 0) {
+        var startLength = '// start$eol'.length;
+        code = code.substring(0, startOffset) +
+            code.substring(startOffset + startLength, endOffset) +
+            code.substring(endOffset + '// end$eol'.length);
+        _offset = startOffset;
+        _length = endOffset - startLength - _offset;
+      } else {
+        _offset = 0;
+        _length = 0;
+      }
+    }
+    super.addTestSource(code, uri);
+  }
+
   void assertExitPosition({String before, String after}) {
     var exitPosition = _change.selection;
     expect(exitPosition, isNotNull);
@@ -142,36 +174,6 @@
   }
 
   @override
-  Future<void> resolveTestUnit(String code) async {
-    if (useLineEndingsForPlatform) {
-      code = normalizeNewlinesForPlatform(code);
-    }
-    final eol = code.contains('\r\n') ? '\r\n' : '\n';
-    var offset = code.indexOf('/*caret*/');
-    if (offset >= 0) {
-      var endOffset = offset + '/*caret*/'.length;
-      code = code.substring(0, offset) + code.substring(endOffset);
-      _offset = offset;
-      _length = 0;
-    } else {
-      var startOffset = code.indexOf('// start$eol');
-      var endOffset = code.indexOf('// end$eol');
-      if (startOffset >= 0 && endOffset >= 0) {
-        var startLength = '// start$eol'.length;
-        code = code.substring(0, startOffset) +
-            code.substring(startOffset + startLength, endOffset) +
-            code.substring(endOffset + '// end$eol'.length);
-        _offset = startOffset;
-        _length = endOffset - startLength - _offset;
-      } else {
-        _offset = 0;
-        _length = 0;
-      }
-    }
-    return super.resolveTestUnit(code);
-  }
-
-  @override
   void setUp() {
     super.setUp();
     useLineEndingsForPlatform = true;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
index b09a195..f9aecc2 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
@@ -24,10 +24,14 @@
 library foo;
 part 'src/bar.dart';
 ''');
+
     testFile = convertPath('/home/test/lib/src/bar.dart');
-    await resolveTestUnit('''
+    addTestSource('''
 part of foo;
 ''');
+
+    await analyzeTestPackageFiles();
+    await resolveTestUnit2();
     await assertHasAssistAt('foo', '''
 part of '../foo.dart';
 ''');
@@ -38,10 +42,14 @@
 library foo;
 part 'bar.dart';
 ''');
+
     testFile = convertPath('/home/test/lib/bar.dart');
-    await resolveTestUnit('''
+    addTestSource('''
 part of foo;
 ''');
+
+    await analyzeTestPackageFiles();
+    await resolveTestUnit2();
     await assertHasAssistAt('foo', '''
 part of 'foo.dart';
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
index b34b23d..3884824 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_childUnresolved() async {
-    addFlutterPackage();
     verifyNoTestUnitErrors = false;
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
@@ -34,7 +41,6 @@
   }
 
   Future<void> test_multiLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
@@ -69,7 +75,7 @@
 
   Future<void> test_newlineChild() async {
     // This case could occur with deeply nested constructors, common in Flutter.
-    addFlutterPackage();
+
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
@@ -104,7 +110,6 @@
   }
 
   Future<void> test_notOnChild() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
@@ -119,7 +124,6 @@
   }
 
   Future<void> test_singleLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
index d239e4b..879fef5 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_empty() async {
-    addFlutterPackage();
     await resolveTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -49,7 +56,6 @@
   }
 
   Future<void> test_empty_typeParam() async {
-    addFlutterPackage();
     await resolveTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -78,7 +84,6 @@
   }
 
   Future<void> test_fields() async {
-    addFlutterPackage();
     await resolveTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -159,7 +164,6 @@
   }
 
   Future<void> test_getters() async {
-    addFlutterPackage();
     await resolveTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -218,7 +222,6 @@
   }
 
   Future<void> test_methods() async {
-    addFlutterPackage();
     await resolveTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -308,7 +311,6 @@
   }
 
   Future<void> test_notClass() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 /*caret*/main() {}
@@ -317,7 +319,6 @@
   }
 
   Future<void> test_notStatelessWidget() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 class /*caret*/MyWidget extends Text {
@@ -328,7 +329,6 @@
   }
 
   Future<void> test_notWidget() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 class /*caret*/MyWidget {}
@@ -337,7 +337,6 @@
   }
 
   Future<void> test_simple() async {
-    addFlutterPackage();
     await resolveTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -390,7 +389,6 @@
   }
 
   Future<void> test_tail() async {
-    addFlutterPackage();
     await resolveTestUnit(r'''
 import 'package:flutter/material.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
index ee427b0..12d8ac8 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_MOVE_DOWN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_first() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -49,7 +56,6 @@
   }
 
   Future<void> test_last() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -66,7 +72,6 @@
   }
 
   Future<void> test_notInList() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
index a88b498..b2e3386 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_MOVE_UP;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_first() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -37,7 +44,6 @@
   }
 
   Future<void> test_last() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -66,7 +72,6 @@
   }
 
   Future<void> test_notInList() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
index fce863a..c470789 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_REMOVE_WIDGET;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_childIntoChild_multiLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -57,7 +64,6 @@
   }
 
   Future<void> test_childIntoChild_singleLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -82,7 +88,6 @@
   }
 
   Future<void> test_childIntoChildren() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -119,7 +124,6 @@
   }
 
   Future<void> test_childrenMultipleIntoChild() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -137,7 +141,6 @@
   }
 
   Future<void> test_childrenOneIntoChild() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -161,7 +164,6 @@
   }
 
   Future<void> test_childrenOneIntoReturn() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -181,7 +183,6 @@
   }
 
   Future<void> test_intoChildren() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
index 35dac67..3938f65 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.SURROUND_WITH_SET_STATE;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_outsideState() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -40,7 +47,6 @@
   }
 
   Future<void> test_stateSubclass() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
index 0228ef0..6ebbd20 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_SWAP_WITH_CHILD;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundCenter() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
@@ -60,7 +67,6 @@
   }
 
   Future<void> test_notFormatted() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
index dd3ce14..dbd59ca 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_SWAP_WITH_PARENT;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_inCenter() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
@@ -60,7 +67,6 @@
   }
 
   Future<void> test_notFormatted() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -111,7 +117,6 @@
   }
 
   Future<void> test_outerIsInChildren() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
index 752cc43..b2037c6 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_CENTER;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundCenter() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -33,7 +40,6 @@
   }
 
   Future<void> test_aroundContainer() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -53,7 +59,6 @@
   }
 
   Future<void> test_aroundNamedConstructor() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -83,7 +88,6 @@
   }
 
   Future<void> test_assignment() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -103,7 +107,6 @@
   }
 
   Future<void> test_expressionFunctionBody() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
index c16385a..d707097 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_COLUMN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_controlFlowCollections_if() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -54,7 +61,6 @@
   }
 
   Future<void> test_coveredByWidget() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -84,7 +90,6 @@
   }
 
   Future<void> test_coversWidgets() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -122,7 +127,6 @@
   }
 
   Future<void> test_endOfWidgetName() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
index 26e88f7..39be197 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_CONTAINER;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundContainer() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 main() {
@@ -31,7 +38,6 @@
   }
 
   Future<void> test_aroundText() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
index 794cc11..347d013 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_GENERIC;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_minimal() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 /*caret*/x(){}
 ''');
@@ -28,7 +35,6 @@
   }
 
   Future<void> test_multiLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -65,7 +71,7 @@
 
   Future<void> test_multiLine_inListLiteral() async {
     verifyNoTestUnitErrors = false;
-    addFlutterPackage();
+
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -86,7 +92,6 @@
   }
 
   Future<void> test_multiLines() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -126,7 +131,6 @@
   }
 
   Future<void> test_multiLines_eol2() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {\r
@@ -166,7 +170,6 @@
   }
 
   Future<void> test_prefixedIdentifier_identifier() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -192,7 +195,6 @@
   }
 
   Future<void> test_prefixedIdentifier_prefix() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -218,7 +220,6 @@
   }
 
   Future<void> test_singleLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -232,7 +233,6 @@
   }
 
   Future<void> test_singleLine1() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -252,7 +252,6 @@
   }
 
   Future<void> test_singleLine2() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -272,7 +271,6 @@
   }
 
   Future<void> test_variable() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
index c457ccf..1470d12 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_PADDING;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundContainer() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -43,7 +50,6 @@
   }
 
   Future<void> test_aroundPadding() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -59,7 +65,6 @@
   }
 
   Future<void> test_inConstantContext() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
index 2325c8c..c28ab00 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_ROW;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_twoWidgets() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
index b9b6947..cff7743 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
@@ -21,8 +21,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_SIZED_BOX;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundContainer() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -42,7 +49,6 @@
   }
 
   Future<void> test_aroundNamedConstructor() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -72,7 +78,6 @@
   }
 
   Future<void> test_aroundSizedBox() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
@@ -85,7 +90,6 @@
   }
 
   Future<void> test_assignment() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -105,7 +109,6 @@
   }
 
   Future<void> test_expressionFunctionBody() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
index c44049f..61b04bf 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
@@ -19,8 +19,15 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundStreamBuilder() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -35,7 +42,6 @@
   }
 
   Future<void> test_aroundText() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
index 09acc3d74..aa74274 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'assist_processor.dart';
 
 void main() {
@@ -108,13 +108,8 @@
 }
 
 @reflectiveTest
-class ShadowFieldWithNullSafetyTest extends ShadowFieldTest {
-  @override
-  void setUp() {
-    super.setUp();
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-  }
-
+class ShadowFieldWithNullSafetyTest extends ShadowFieldTest
+    with WithNullSafetyMixin {
   Future<void> test_notNull() async {
     await resolveTestUnit('''
 class C {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
index 9335cd1..86b6655 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
@@ -20,8 +20,15 @@
   @override
   AssistKind get kind => DartAssistKind.SORT_CHILD_PROPERTY_LAST;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_already_sorted() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -39,7 +46,6 @@
   }
 
   Future<void> test_already_sorted_one_prop() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -56,7 +62,6 @@
   }
 
   Future<void> test_no_children() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -69,7 +74,6 @@
   }
 
   Future<void> test_sort() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
@@ -100,7 +104,6 @@
   }
 
   Future<void> test_sort_noAssistWithLint() async {
-    addFlutterPackage();
     createAnalysisOptionsFile(lints: [LintNames.sort_child_properties_last]);
     verifyNoTestUnitErrors = false;
     await resolveTestUnit('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
index 99c530f..f04807c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
@@ -68,8 +68,15 @@
   @override
   String get lintCode => LintNames.prefer_const_constructors_in_immutables;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      meta: true,
+    );
+  }
+
   Future<void> test_constConstructor() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -89,7 +96,6 @@
   }
 
   Future<void> test_constConstructorWithComment() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
index b4fdc40..864433b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
@@ -27,7 +27,9 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   Future<void> test_boolField() async {
@@ -380,7 +382,10 @@
   }
 
   Future<void> test_matrix4Field() async {
-    addVectorMathPackage();
+    writeTestPackageConfig(
+      flutter: true,
+      vector_math: true,
+    );
     await resolveTestUnit('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
index 115d78c..25a4a6c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -478,10 +478,8 @@
 }
 
 @reflectiveTest
-class AddExplicitCastWithNullSafetyTest extends AddExplicitCastTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddExplicitCastWithNullSafetyTest extends AddExplicitCastTest
+    with WithNullSafetyMixin {
   Future<void> test_assignment_null() async {
     await resolveTestUnit('''
 void f(int x) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
index 61a6718..0e59102 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
@@ -20,7 +20,10 @@
   FixKind get kind => DartFixKind.ADD_FIELD_FORMAL_PARAMETERS;
 
   Future<void> test_flutter() async {
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
index 9a67e6e..2169e59 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -32,10 +32,7 @@
 }
 
 @reflectiveTest
-class AddLateTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddLateTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_LATE;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
index 293c98a..9957bbe 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
@@ -156,7 +156,11 @@
 
   Future<void> test_function_inPackage_inWorkspace() async {
     newFile('/home/aaa/lib/a.dart', content: 'void test() {}');
-    addTestPackageDependency('aaa', '/home/aaa');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
 
     _workspace = DartChangeWorkspace([
       session,
@@ -178,7 +182,12 @@
   }
 
   Future<void> test_function_inPackage_outsideWorkspace() async {
-    addPackageFile('bbb', 'b.dart', 'void test() {}');
+    newFile('/home/bbb/lib/b.dart', content: 'void test() {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'),
+    );
 
     await resolveTestUnit('''
 import 'package:bbb/b.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
index 2eb4fa8..ed684f8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -21,9 +21,15 @@
   @override
   FixKind get kind => DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_constructor_flutter_children() async {
-    addFlutterPackage();
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
@@ -51,8 +57,6 @@
   }
 
   Future<void> test_constructor_flutter_hasTrailingComma() async {
-    addFlutterPackage();
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
@@ -80,7 +84,6 @@
   }
 
   Future<void> test_constructor_named() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -108,7 +111,6 @@
   }
 
   Future<void> test_constructor_single() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -135,7 +137,6 @@
   }
 
   Future<void> test_constructor_single_closure() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -164,7 +165,6 @@
   }
 
   Future<void> test_constructor_single_closure2() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -193,7 +193,6 @@
   }
 
   Future<void> test_constructor_single_closure3() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -222,7 +221,6 @@
   }
 
   Future<void> test_constructor_single_closure4() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -250,101 +248,7 @@
 ''');
   }
 
-  Future<void> test_constructor_single_closure_nnbd() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    addMetaPackage();
-    addSource('/home/test/lib/a.dart', r'''
-import 'package:meta/meta.dart';
-
-typedef int Callback(int? a);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-    await resolveTestUnit('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A();
-  print(a);
-}
-''');
-    await assertHasFix('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A(callback: (int? a) {  });
-  print(a);
-}
-''');
-  }
-
-  Future<void> test_constructor_single_closure_nnbd_from_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    addMetaPackage();
-    addSource('/home/test/lib/a.dart', r'''
-// @dart = 2.8
-import 'package:meta/meta.dart';
-
-typedef int Callback(int a);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-    await resolveTestUnit('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A();
-  print(a);
-}
-''');
-    await assertHasFix('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A(callback: (int a) {  });
-  print(a);
-}
-''');
-  }
-
-  Future<void> test_constructor_single_closure_nnbd_into_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    addMetaPackage();
-    addSource('/home/test/lib/a.dart', r'''
-import 'package:meta/meta.dart';
-
-typedef int Callback(int? a);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-    await resolveTestUnit('''
-// @dart = 2.8
-import 'package:test/a.dart';
-
-main() {
-  A a = new A();
-  print(a);
-}
-''');
-    await assertHasFix('''
-// @dart = 2.8
-import 'package:test/a.dart';
-
-main() {
-  A a = new A(callback: (int a) {  });
-  print(a);
-}
-''');
-  }
-
   Future<void> test_constructor_single_list() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -371,7 +275,6 @@
   }
 
   Future<void> test_multiple() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -391,7 +294,6 @@
   }
 
   Future<void> test_multiple_1of2() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -411,7 +313,6 @@
   }
 
   Future<void> test_multiple_2of2() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -431,8 +332,6 @@
   }
 
   Future<void> test_param_child() async {
-    addFlutterPackage();
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
@@ -465,8 +364,6 @@
   }
 
   Future<void> test_param_children() async {
-    addFlutterPackage();
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
@@ -499,7 +396,6 @@
   }
 
   Future<void> test_single() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -520,7 +416,6 @@
   }
 
   Future<void> test_single_normal() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -540,7 +435,6 @@
   }
 
   Future<void> test_single_with_details() async {
-    addMetaPackage();
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
@@ -561,13 +455,101 @@
 }
 
 @reflectiveTest
-class AddMissingRequiredArgumentWithNullSafetyTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddMissingRequiredArgumentWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT;
 
+  @override
+  bool get withPackageMeta => true;
+
+  Future<void> test_constructor_single_closure_nnbd() async {
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef int Callback(int? a);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (int? a) {  });
+  print(a);
+}
+''');
+  }
+
+  Future<void> test_constructor_single_closure_nnbd_from_legacy() async {
+    addSource('/home/test/lib/a.dart', r'''
+// @dart = 2.8
+import 'package:meta/meta.dart';
+
+typedef int Callback(int a);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (int a) {  });
+  print(a);
+}
+''');
+  }
+
+  Future<void> test_constructor_single_closure_nnbd_into_legacy() async {
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef int Callback(int? a);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestUnit('''
+// @dart = 2.8
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+// @dart = 2.8
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (int a) {  });
+  print(a);
+}
+''');
+  }
+
   Future<void> test_nonNullable() async {
     await resolveTestUnit('''
 void f({required int x}) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
index 67c35f1..96010dd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,10 +16,7 @@
 }
 
 @reflectiveTest
-class AddNullCheckTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddNullCheckTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_NULL_CHECK;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
index 9b90123..fcf9c8b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
@@ -4,10 +4,10 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -40,10 +40,8 @@
 }
 
 @reflectiveTest
-class AddRequiredWithNullSafetyTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddRequiredWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_REQUIRED2;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart
index 735e1c5..fd2fc44 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart
@@ -22,7 +22,7 @@
   /// Disabled in BulkFixProcessor.
   @failingTest
   Future<void> test_singleFile() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     await resolveTestUnit(r'''
 class C {
   const C([C c]);
@@ -45,7 +45,7 @@
   String get lintCode => LintNames.prefer_const_constructors_in_immutables;
 
   Future<void> test_singleFile() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     await resolveTestUnit('''
 import 'package:meta/meta.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart
index cda5640..8ea5e2f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.diagnostic_describe_all_properties;
 
   Future<void> test_singleFile() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await resolveTestUnit('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart
index 96292b2..de7282e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart
@@ -62,9 +62,10 @@
   /// Computes fixes for the given [error] in [testUnit].
   Future<SourceChange> _computeFixes() async {
     var tracker = DeclarationsTracker(MemoryByteStore(), resourceProvider);
-    tracker.addContext(driver.analysisContext);
+    var analysisContext = contextFor(testFile);
+    tracker.addContext(analysisContext);
     var changeBuilder =
-        await BulkFixProcessor(workspace).fixErrors([driver.analysisContext]);
+        await BulkFixProcessor(workspace).fixErrors([analysisContext]);
     return changeBuilder.sourceChange;
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
index 5b43664..4a91e90 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'bulk_fix_processor.dart';
@@ -1155,12 +1156,17 @@
   /// Add the file containing the data used by the data-driven fix with the
   /// given [content].
   void addPackageDataFile(String content) {
-    addPackageFile('p', TransformSetManager.dataFileName, content);
+    newFile('$workspaceRootPath/p/lib/${TransformSetManager.dataFileName}',
+        content: content);
   }
 
   /// Set the content of the library that defines the element referenced by the
   /// data on which this test is based.
   void setPackageContent(String content) {
-    addPackageFile('p', 'lib.dart', content);
+    newFile('$workspaceRootPath/p/lib/lib.dart', content: content);
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'p', rootPath: '$workspaceRootPath/p'),
+    );
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last_test.dart
index 80c02dd..dafc81d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.sort_child_properties_last;
 
   Future<void> test_singleFile() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
index 3e17f59..d083826 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
@@ -19,8 +19,15 @@
   @override
   FixKind get kind => DartFixKind.CONVERT_FLUTTER_CHILD;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_hasList() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -50,7 +57,6 @@
   }
 
   Future<void> test_hasTypedList() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -80,7 +86,6 @@
   }
 
   Future<void> test_listNotWidget() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -98,7 +103,6 @@
   }
 
   Future<void> test_multiLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
@@ -130,7 +134,6 @@
   }
 
   Future<void> test_widgetVariable() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 build() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
index 8f71ef6..36d89c5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
@@ -19,8 +19,15 @@
   @override
   FixKind get kind => DartFixKind.CONVERT_FLUTTER_CHILDREN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_undefinedParameter_multiLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -48,7 +55,6 @@
   }
 
   Future<void> test_undefinedParameter_notWidget() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -63,7 +69,6 @@
   }
 
   Future<void> test_undefinedParameter_singleLine() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
@@ -85,7 +90,6 @@
   }
 
   Future<void> test_undefinedParameter_singleLine2() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 build() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
index 4c0a8d0..1b587fa 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS;
 
   Future<void> test_flutter() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_flutter_childLast() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_flutter_childrenLast() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';
 
@@ -139,11 +139,8 @@
 }
 
 @reflectiveTest
-class CreateConstructorForFinalFieldsWithNullSafetyTest
-    extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class CreateConstructorForFinalFieldsWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
index a57a686..06132ad 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
@@ -147,13 +147,13 @@
   }
 
   Future<void> test_withImport() async {
-    addPackageFile('pkg', 'a/a.dart', '''
+    newFile('$workspaceRootPath/pkg/lib/a/a.dart', content: '''
 class A {}
 ''');
-    addPackageFile('pkg', 'b/b.dart', '''
+    newFile('$workspaceRootPath/pkg/lib/b/b.dart', content: '''
 class B {}
 ''');
-    addPackageFile('pkg', 'c/c.dart', '''
+    newFile('$workspaceRootPath/pkg/lib/c/c.dart', content: '''
 import 'package:pkg/a/a.dart';
 import 'package:pkg/b/b.dart';
 
@@ -162,6 +162,11 @@
 }
 ''');
 
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await resolveTestUnit('''
 import 'package:pkg/a/a.dart';
 import 'package:pkg/c/c.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
index 7335380..8cafbac 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -611,10 +611,8 @@
 }
 
 @reflectiveTest
-class CreateMissingOverridesWithNullSafetyTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class CreateMissingOverridesWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.CREATE_MISSING_OVERRIDES;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
index fe452ec..55525ff 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 import '../fix_processor.dart';
@@ -26,7 +27,8 @@
   /// Add the file containing the data used by the data-driven fix with the
   /// given [content].
   void addPackageDataFile(String content) {
-    addPackageFile('p', TransformSetManager.dataFileName, content);
+    newFile('$workspaceRootPath/p/lib/${TransformSetManager.dataFileName}',
+        content: content);
   }
 
   /// Return a code template that will produce the given [text].
@@ -42,7 +44,15 @@
   /// Set the content of the library that defines the element referenced by the
   /// data on which this test is based.
   void setPackageContent(String content) {
-    addPackageFile('p', 'lib.dart', content);
+    newFile('$workspaceRootPath/p/lib/lib.dart', content: content);
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(
+          name: 'p',
+          rootPath: '$workspaceRootPath/p',
+          languageVersion: '2.9',
+        ),
+    );
   }
 
   /// Set the data on which this test is based.
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
index 1e29672..98bd8db 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
@@ -8,6 +8,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../../../abstract_context.dart';
+import '../../../../../services/refactoring/abstract_rename.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -22,6 +23,13 @@
   void test_twoFiles() async {
     _addDataFile('p1');
     _addDataFile('p2');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'p1', rootPath: '$workspaceRootPath/p1')
+        ..add(name: 'p2', rootPath: '$workspaceRootPath/p2'),
+    );
+
     addSource('/home/test/pubspec.yaml', '');
     var testSource = addSource('/home/test/lib/test.dart', '');
     var result = await session.getResolvedLibrary(testSource.fullName);
@@ -30,8 +38,8 @@
   }
 
   void test_zeroFiles() async {
-    addTestPackageDependency('p1', '/.pub-cache/p1');
-    addTestPackageDependency('p2', '/.pub-cache/p2');
+    // addTestPackageDependency('p1', '/.pub-cache/p1');
+    // addTestPackageDependency('p2', '/.pub-cache/p2');
     addSource('/home/test/pubspec.yaml', '');
     var testSource = addSource('/home/test/lib/test.dart', '');
     var result = await session.getResolvedLibrary(testSource.fullName);
@@ -40,7 +48,7 @@
   }
 
   void _addDataFile(String packageName) {
-    addPackageFile(packageName, 'fix_data.yaml', '''
+    newFile('$workspaceRootPath/$packageName/lib/fix_data.yaml', content: '''
 version: 1
 transforms:
 - title: 'Rename A'
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index ca983e6..27092f2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -7,8 +7,10 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/test_utilities/platform.dart';
@@ -16,10 +18,14 @@
     hide AnalysisError;
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
+import '../../../../abstract_context.dart';
 import '../../../../abstract_single_unit.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 /// A base class defining support for writing fix processor tests that are
 /// specific to fixes associated with lints that use the FixKind.
 abstract class FixProcessorLintTest extends FixProcessorTest {
@@ -283,8 +289,10 @@
 
   /// Computes fixes for the given [error] in [testUnit].
   Future<List<Fix>> _computeFixes(AnalysisError error) async {
+    var analysisContext = contextFor(testFile);
+
     var tracker = DeclarationsTracker(MemoryByteStore(), resourceProvider);
-    tracker.addContext(driver.analysisContext);
+    tracker.addContext(analysisContext);
 
     var context = DartFixContextImpl(
       workspace,
@@ -293,7 +301,7 @@
       (name) {
         var provider = TopLevelDeclarationsProvider(tracker);
         provider.doTrackerWork();
-        return provider.get(driver.analysisContext, testFile, name);
+        return provider.get(analysisContext, testFile, name);
       },
     );
     return await DartFixContributor().computeFixes(context);
@@ -351,3 +359,22 @@
     return positions;
   }
 }
+
+mixin WithNullSafetyLintMixin on AbstractContextTest {
+  /// Return the lint code being tested.
+  String get lintCode;
+
+  @override
+  String get testPackageLanguageVersion =>
+      Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
+
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+  /// Remove when Null Safety is enabled by default.
+  @nonVirtual
+  @override
+  void setUp() {
+    super.setUp();
+    createAnalysisOptionsFile(
+        experiments: [EnableString.non_nullable], lints: [lintCode]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
index 86dce04..856bb00e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../services/refactoring/abstract_rename.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -65,7 +66,13 @@
   }
 
   Future<void> test_lib() async {
-    addPackageFile('my_pkg', 'a.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
@@ -89,11 +96,17 @@
   }
 
   Future<void> test_lib_extension() async {
-    addPackageFile('my_pkg', 'a.dart', '''
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: '''
 extension E on int {
   static String m() => '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
@@ -115,7 +128,13 @@
   }
 
   Future<void> test_lib_src() async {
-    addPackageFile('my_pkg', 'src/a.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/src/a.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
@@ -594,8 +613,14 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2;
 
   Future<void> test_lib() async {
-    addPackageFile('my_pkg', 'a.dart', "export 'b.dart';");
-    addPackageFile('my_pkg', 'b.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'b.dart';");
+    newFile('/.pub-cache/my_pkg/lib/b.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
@@ -617,8 +642,14 @@
   }
 
   Future<void> test_lib_src() async {
-    addPackageFile('my_pkg', 'a.dart', "export 'src/b.dart';");
-    addPackageFile('my_pkg', 'src/b.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'src/b.dart';");
+    newFile('/.pub-cache/my_pkg/lib/src/b.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
@@ -640,12 +671,18 @@
   }
 
   Future<void> test_lib_src_extension() async {
-    addPackageFile('my_pkg', 'a.dart', "export 'src/b.dart';");
-    addPackageFile('my_pkg', 'src/b.dart', '''
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'src/b.dart';");
+    newFile('/.pub-cache/my_pkg/lib/src/b.dart', content: '''
 extension E on int {
   static String m() => '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
@@ -671,11 +708,17 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3;
 
   Future<void> test_inLibSrc_differentContextRoot() async {
-    addPackageFile('bbb', 'b1.dart', r'''
+    newFile('/.pub-cache/bbb/lib/b1.dart', content: r'''
 import 'src/b2.dart';
 class A {}
 ''');
-    addPackageFile('bbb', 'src/b2.dart', 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'bbb', rootPath: '/.pub-cache/bbb'),
+    );
+
+    newFile('/.pub-cache/bbb/lib/src/b2.dart', content: 'class Test {}');
     await resolveTestUnit('''
 import 'package:bbb/b1.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart b/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
index 3eeb26c..e94ab21 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -137,10 +136,8 @@
 }
 
 @reflectiveTest
-class InlineTypedefWithNullSafetyTest extends InlineTypedefTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class InlineTypedefWithNullSafetyTest extends InlineTypedefTest
+    with WithNullSafetyLintMixin {
   Future<void> test_generic_parameter_requiredNamed() async {
     await resolveTestUnit('''
 typedef _F = Function({required int i});
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
index 7486e14..01e9935 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -58,10 +57,8 @@
 }
 
 @reflectiveTest
-class PreferFinalFieldsWithNullSafetyTest extends FixProcessorLintTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class PreferFinalFieldsWithNullSafetyTest extends FixProcessorLintTest
+    with WithNullSafetyLintMixin {
   @override
   FixKind get kind => DartFixKind.MAKE_FINAL;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
index 6181ed4..ff7d59e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,10 +16,8 @@
 }
 
 @reflectiveTest
-class MakeReturnTypeNullableTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class MakeReturnTypeNullableTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.MAKE_RETURN_TYPE_NULLABLE;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart
index b38dd55..9d475df 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,10 +16,8 @@
 }
 
 @reflectiveTest
-class MakeVariableNullableTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class MakeVariableNullableTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.MAKE_VARIABLE_NULLABLE;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart
index f69c58b..126dd33 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart
@@ -22,7 +22,7 @@
   @override
   void setUp() {
     super.setUp();
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
   }
 
   Future<void> test_factory() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
index 67590ce..89a631b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,10 +16,7 @@
 }
 
 @reflectiveTest
-class RemoveComparisonTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class RemoveComparisonTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REMOVE_COMPARISON;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart
index 32b927a..b9b4921 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart
@@ -4,10 +4,10 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -18,10 +18,8 @@
 }
 
 @reflectiveTest
-class DeadNullAwareExpressionTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class DeadNullAwareExpressionTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REMOVE_IF_NULL_OPERATOR;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
index 77b371d..6b673ad 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
@@ -92,7 +92,6 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/1997')
   Future<void> test_method_nullSafety_optIn_fromOptOut() async {
     createAnalysisOptionsFile(
       experiments: [EnableString.non_nullable],
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart
index 69573a2..71ed805 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,10 +16,7 @@
 }
 
 @reflectiveTest
-class RemoveQuestionMarkTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class RemoveQuestionMarkTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REMOVE_QUESTION_MARK;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart
index 907e168..0429ffa 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -119,11 +118,8 @@
 }
 
 @reflectiveTest
-class ReplaceCascadeWithDotWithNullSafetyTest
-    extends ReplaceCascadeWithDotTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class ReplaceCascadeWithDotWithNullSafetyTest extends ReplaceCascadeWithDotTest
+    with WithNullSafetyLintMixin {
   Future<void> test_assignment_index_nullAwareCascade() async {
     await resolveTestUnit('''
 void f(List<int>? l) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart
index 5003102..cc0af18 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,10 +16,7 @@
 }
 
 @reflectiveTest
-class ReplaceWithFilledTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class ReplaceWithFilledTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REPLACE_WITH_FILLED;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
index 64b71ef..2ddd88c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -15,10 +16,8 @@
 }
 
 @reflectiveTest
-class ReplaceWithNotNullAwareTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => ['non-nullable'];
-
+class ReplaceWithNotNullAwareTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REPLACE_WITH_NOT_NULL_AWARE;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
index 48d2b28..ad2dd11 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
@@ -23,9 +23,16 @@
   @override
   String get lintCode => LintNames.sort_child_properties_last;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   /// More coverage in the `sort_child_properties_last_test.dart` assist test.
   Future<void> test_sort() async {
-    addFlutterPackage();
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
index 9576a29..5fc9bb4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
@@ -64,6 +64,7 @@
   }
 
   Future<void> test_gtGtGtOperator() async {
+    writeTestPackageConfig(languageVersion: latestLanguageVersion);
     createAnalysisOptionsFile(experiments: [EnableString.triple_shift]);
     await testUpdate(content: '''
 class C {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
index d3b0b24..7c67cbd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
@@ -22,7 +22,9 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   Future<void> test_literal() async {
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_description.dart b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
index da82d9c..012b925 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_description.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
@@ -88,7 +88,9 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   void _removeNotInterestingElements(Map<String, dynamic> json) {
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index b7d9636..446b4dd 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -22,7 +22,9 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   Future<void> test_getWidgetPresentationText_icon() async {
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index e67947e..4fb7696 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 0.40.5-dev
+## 0.40.5
 * Deprecated `GenericTypeAliasElement`. Use `FunctionTypeAliasElement`.
 * Read imports, exports, and parts on demand in `AnalysisDriver`.
   Specifically, `parseFileSync` will not read any referenced files.
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 462daf1..6177894 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -2347,7 +2347,7 @@
     while (timer.elapsedMilliseconds < _MS_WORK_INTERVAL) {
       // Prepare files to check.
       if (filesToCheck.isEmpty) {
-        Set<String> newFiles = driver.addedFiles.difference(checkedFiles);
+        Set<String> newFiles = driver.knownFiles.difference(checkedFiles);
         filesToCheck.addAll(newFiles);
       }
 
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 2122a7e..bd53e0e 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.40.5-dev
+version: 0.40.5
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
@@ -7,7 +7,7 @@
   sdk: '>=2.7.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^11.0.0
+  _fe_analyzer_shared: ^12.0.0
   args: ^1.0.0
   cli_util: '>=0.1.4 <0.3.0'
   collection: ^1.10.1
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 7af21bf..3458a33 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1003,6 +1003,12 @@
   if (cls.is_type_finalized()) {
     return;
   }
+
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+  if (cls.is_type_finalized()) {
+    return;
+  }
+
   if (FLAG_trace_class_finalization) {
     THR_Print("Finalize types in %s\n", cls.ToCString());
   }
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index b047850..d1b5da2 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2052,6 +2052,7 @@
   auto& retained_constants = GrowableObjectArray::Handle(Z);
   auto& constant = Instance::Handle(Z);
 
+  SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
     lib ^= libraries_.At(i);
     ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 10b3e76..005a2e9 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -857,9 +857,13 @@
     // ValidateReload mutates the direct subclass information and does
     // not remove dead subclasses.  Rebuild the direct subclass
     // information from scratch.
-    ForEachIsolate([&](Isolate* isolate) {
-      isolate->reload_context()->RebuildDirectSubclasses();
-    });
+    {
+      SafepointWriteRwLocker ml(thread,
+                                thread->isolate_group()->program_lock());
+      ForEachIsolate([&](Isolate* isolate) {
+        isolate->reload_context()->RebuildDirectSubclasses();
+      });
+    }
     const intptr_t final_library_count =
         GrowableObjectArray::Handle(Z,
                                     first_isolate_->object_store()->libraries())
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 175b1f0..eaf97ca 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -2926,8 +2926,7 @@
   StorePointer(&raw_ptr()->constants_, Object::null_array().raw());
   set_functions(Object::empty_array());
   set_fields(Object::empty_array());
-  StorePointer(&raw_ptr()->invocation_dispatcher_cache_,
-               Object::empty_array().raw());
+  set_invocation_dispatcher_cache(Object::empty_array());
 }
 
 ArrayPtr Class::OffsetToFieldMap(bool original_classes) const {
@@ -3184,6 +3183,13 @@
                                                     value.raw());
 }
 
+void Class::set_invocation_dispatcher_cache(const Array& cache) const {
+  // Ensure all writes to the cache are visible by the time the array
+  // is visible.
+  StorePointer<ArrayPtr, std::memory_order_release>(
+      &raw_ptr()->invocation_dispatcher_cache_, cache.raw());
+}
+
 intptr_t Class::NumTypeParameters(Thread* thread) const {
   if (!is_declaration_loaded()) {
     ASSERT(is_prefinalized());
@@ -3493,7 +3499,11 @@
 void Class::AddInvocationDispatcher(const String& target_name,
                                     const Array& args_desc,
                                     const Function& dispatcher) const {
-  auto& cache = Array::Handle(invocation_dispatcher_cache());
+  auto thread = Thread::Current();
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadWriter());
+
+  auto zone = thread->zone();
+  auto& cache = Array::Handle(zone, invocation_dispatcher_cache());
   InvocationDispatcherTable dispatchers(cache);
   intptr_t i = 0;
   for (auto dispatcher : dispatchers) {
@@ -3510,10 +3520,12 @@
     cache = Array::Grow(cache, new_len);
     set_invocation_dispatcher_cache(cache);
   }
+  // Ensure all stores are visible at the point the name is visible.
   auto entry = dispatchers[i];
-  entry.Set<Class::kInvocationDispatcherName>(target_name);
   entry.Set<Class::kInvocationDispatcherArgsDesc>(args_desc);
   entry.Set<Class::kInvocationDispatcherFunction>(dispatcher);
+  entry.Set<Class::kInvocationDispatcherName, std::memory_order_release>(
+      target_name);
 }
 
 FunctionPtr Class::GetInvocationDispatcher(const String& target_name,
@@ -3523,30 +3535,49 @@
   ASSERT(kind == FunctionLayout::kNoSuchMethodDispatcher ||
          kind == FunctionLayout::kInvokeFieldDispatcher ||
          kind == FunctionLayout::kDynamicInvocationForwarder);
-  auto Z = Thread::Current()->zone();
+  auto thread = Thread::Current();
+  auto Z = thread->zone();
   auto& function = Function::Handle(Z);
   auto& name = String::Handle(Z);
   auto& desc = Array::Handle(Z);
-  auto& cache = Array::Handle(Z, invocation_dispatcher_cache());
-  ASSERT(!cache.IsNull());
+  auto& cache = Array::Handle(Z);
 
-  InvocationDispatcherTable dispatchers(cache);
-  for (auto dispatcher : dispatchers) {
-    name = dispatcher.Get<Class::kInvocationDispatcherName>();
-    if (name.IsNull()) break;  // Reached last entry.
-    if (!name.Equals(target_name)) continue;
-    desc = dispatcher.Get<Class::kInvocationDispatcherArgsDesc>();
-    if (desc.raw() != args_desc.raw()) continue;
-    function = dispatcher.Get<Class::kInvocationDispatcherFunction>();
-    if (function.kind() == kind) {
-      break;  // Found match.
+  auto find_entry = [&]() {
+    cache = invocation_dispatcher_cache();
+    ASSERT(!cache.IsNull());
+    InvocationDispatcherTable dispatchers(cache);
+    for (auto dispatcher : dispatchers) {
+      // Ensure all loads are done after loading the name.
+      name = dispatcher.Get<Class::kInvocationDispatcherName,
+                            std::memory_order_acquire>();
+      if (name.IsNull()) break;  // Reached last entry.
+      if (!name.Equals(target_name)) continue;
+      desc = dispatcher.Get<Class::kInvocationDispatcherArgsDesc>();
+      if (desc.raw() != args_desc.raw()) continue;
+      function = dispatcher.Get<Class::kInvocationDispatcherFunction>();
+      if (function.kind() == kind) {
+        return function.raw();
+      }
     }
+    return Function::null();
+  };
+
+  // First we'll try to find it without using locks.
+  function = find_entry();
+  if (!function.IsNull() || !create_if_absent) {
+    return function.raw();
   }
 
-  if (function.IsNull() && create_if_absent) {
-    function = CreateInvocationDispatcher(target_name, args_desc, kind);
-    AddInvocationDispatcher(target_name, args_desc, function);
-  }
+  // If we failed to find it and possibly need to create it, use a write lock.
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+
+  // Try to find it again & return if it was added in the meantime.
+  function = find_entry();
+  if (!function.IsNull()) return function.raw();
+
+  // Otherwise create it & add it.
+  function = CreateInvocationDispatcher(target_name, args_desc, kind);
+  AddInvocationDispatcher(target_name, args_desc, function);
   return function.raw();
 }
 
@@ -3802,30 +3833,40 @@
 
 FunctionPtr Function::GetDynamicInvocationForwarder(
     const String& mangled_name,
-    bool allow_add /* = true */) const {
+    bool allow_add /*=true*/) const {
   ASSERT(IsDynamicInvocationForwarderName(mangled_name));
-  auto zone = Thread::Current()->zone();
+  auto thread = Thread::Current();
+  auto zone = thread->zone();
   const Class& owner = Class::Handle(zone, Owner());
-  Function& result = Function::Handle(
-      zone,
+  Function& result = Function::Handle(zone);
+
+  // First we'll try to find it without using locks.
+  result =
       owner.GetInvocationDispatcher(mangled_name, Array::null_array(),
                                     FunctionLayout::kDynamicInvocationForwarder,
-                                    /*create_if_absent=*/false));
+                                    /*create_if_absent=*/false);
+  if (!result.IsNull()) return result.raw();
 
-  if (!result.IsNull()) {
-    return result.raw();
+  const bool needs_dyn_forwarder =
+      kernel::NeedsDynamicInvocationForwarder(*this);
+  if (!allow_add) {
+    return needs_dyn_forwarder ? Function::null() : raw();
   }
 
-  // Check if function actually needs a dynamic invocation forwarder.
-  if (!kernel::NeedsDynamicInvocationForwarder(*this)) {
-    result = raw();
-  } else if (allow_add) {
-    result = CreateDynamicInvocationForwarder(mangled_name);
-  }
+  // If we failed to find it and possibly need to create it, use a write lock.
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
 
-  if (allow_add) {
-    owner.AddInvocationDispatcher(mangled_name, Array::null_array(), result);
-  }
+  // Try to find it again & return if it was added in the mean time.
+  result =
+      owner.GetInvocationDispatcher(mangled_name, Array::null_array(),
+                                    FunctionLayout::kDynamicInvocationForwarder,
+                                    /*create_if_absent=*/false);
+  if (!result.IsNull()) return result.raw();
+
+  // Otherwise create it & add it.
+  result = needs_dyn_forwarder ? CreateDynamicInvocationForwarder(mangled_name)
+                               : raw();
+  owner.AddInvocationDispatcher(mangled_name, Array::null_array(), result);
 
   return result.raw();
 }
@@ -3852,10 +3893,6 @@
   return raw_ptr()->invocation_dispatcher_cache_;
 }
 
-void Class::set_invocation_dispatcher_cache(const Array& cache) const {
-  StorePointer(&raw_ptr()->invocation_dispatcher_cache_, cache.raw());
-}
-
 void Class::Finalize() const {
   auto thread = Thread::Current();
   Isolate* isolate = thread->isolate();
@@ -4993,6 +5030,7 @@
 
 void Class::AddDirectImplementor(const Class& implementor,
                                  bool is_mixin) const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   ASSERT(is_implemented());
   ASSERT(!implementor.IsNull());
   GrowableObjectArray& direct_implementors =
@@ -5017,10 +5055,12 @@
 }
 
 void Class::ClearDirectImplementors() const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   StorePointer(&raw_ptr()->direct_implementors_, GrowableObjectArray::null());
 }
 
 void Class::AddDirectSubclass(const Class& subclass) const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   ASSERT(!subclass.IsNull());
   ASSERT(subclass.SuperClass() == raw());
   // Do not keep track of the direct subclasses of class Object.
@@ -5041,6 +5081,7 @@
 }
 
 void Class::ClearDirectSubclasses() const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   StorePointer(&raw_ptr()->direct_subclasses_, GrowableObjectArray::null());
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ceffe2f..01d448d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1717,8 +1717,6 @@
   const char* GenerateUserVisibleName() const;
   void set_state_bits(intptr_t bits) const;
 
-  ArrayPtr invocation_dispatcher_cache() const;
-  void set_invocation_dispatcher_cache(const Array& cache) const;
   FunctionPtr CreateInvocationDispatcher(const String& target_name,
                                          const Array& args_desc,
                                          FunctionLayout::Kind kind) const;
@@ -1750,6 +1748,9 @@
  private:
   void set_functions(const Array& value) const;
   void set_fields(const Array& value) const;
+  void set_invocation_dispatcher_cache(const Array& cache) const;
+
+  ArrayPtr invocation_dispatcher_cache() const;
 
   // Calculates number of type arguments of this class.
   // This includes type arguments of a superclass and takes overlapping
diff --git a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
index 6e2b934..a36132b 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
@@ -392,9 +392,9 @@
   /// If the length is not specified, it defaults to null, which indicates
   /// that the view extends to the end of the byte buffer.
   ///
-  /// Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-  /// if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-  /// the length of [buffer].
+  /// The [offsetInBytes] and [length] must be non-negative, and
+  /// [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+  /// equal to the length of [buffer].
   factory NativeByteData.view(
       ByteBuffer buffer, int offsetInBytes, int? length) {
     _checkViewArguments(buffer, offsetInBytes, length);
@@ -411,8 +411,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// single-precision binary floating-point format (binary32).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   double getFloat32(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat32(byteOffset, Endian.little == endian);
 
@@ -424,8 +424,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// double-precision binary floating-point format (binary64).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   double getFloat64(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat64(byteOffset, Endian.little == endian);
 
@@ -439,8 +439,8 @@
   /// The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getInt16(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt16(byteOffset, Endian.little == endian);
 
@@ -454,8 +454,8 @@
   /// The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getInt32(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt32(byteOffset, Endian.little == endian);
 
@@ -469,8 +469,8 @@
   /// The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getInt64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -479,8 +479,8 @@
   /// specified [byteOffset] in this object, in two's complement binary
   /// representation. The return value will be between -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getInt8(int byteOffset) native;
 
   /// Returns the positive integer represented by the two bytes starting
@@ -488,8 +488,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getUint16(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint16(byteOffset, Endian.little == endian);
 
@@ -502,8 +502,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getUint32(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint32(byteOffset, Endian.little == endian);
 
@@ -516,8 +516,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getUint64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -526,8 +526,8 @@
   /// [byteOffset] in this object, in unsigned binary form. The
   /// return value will be between 0 and 255, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getUint8(int byteOffset) native;
 
   /// Sets the four bytes starting at the specified [byteOffset] in this
@@ -543,8 +543,8 @@
   /// Note that finite (but large) values can be converted to infinity, and
   /// small non-zero values can be converted to zero.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setFloat32(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat32(byteOffset, value, Endian.little == endian);
 
@@ -555,8 +555,8 @@
   /// object to the IEEE 754 double-precision binary floating-point
   /// (binary64) representation of the specified [value].
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setFloat64(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat64(byteOffset, value, Endian.little == endian);
 
@@ -568,8 +568,8 @@
   /// [value], which must fit in two bytes. In other words, [value] must lie
   /// between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt16(byteOffset, value, Endian.little == endian);
 
@@ -581,8 +581,8 @@
   /// [value], which must fit in four bytes. In other words, [value] must lie
   /// between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt32(byteOffset, value, Endian.little == endian);
 
@@ -594,8 +594,8 @@
   /// [value], which must fit in eight bytes. In other words, [value] must lie
   /// between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -605,8 +605,8 @@
   /// must fit in a single byte. In other words, [value] must be between
   /// -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setInt8(int byteOffset, int value) native;
 
   /// Sets the two bytes starting at the specified [byteOffset] in this object
@@ -614,8 +614,8 @@
   /// which must fit in two bytes. in other words, [value] must be between
   /// 0 and 2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint16(byteOffset, value, Endian.little == endian);
 
@@ -627,8 +627,8 @@
   /// which must fit in four bytes. in other words, [value] must be between
   /// 0 and 2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint32(byteOffset, value, Endian.little == endian);
 
@@ -640,8 +640,8 @@
   /// which must fit in eight bytes. in other words, [value] must be between
   /// 0 and 2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -651,8 +651,8 @@
   /// in a single byte. in other words, [value] must be between 0 and 255,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative,
-  /// or greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setUint8(int byteOffset, int value) native;
 
   static NativeByteData _create1(arg) =>
diff --git a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
index 6a7b7b3..2b66dfc 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -393,9 +393,9 @@
   /// If the length is not specified, it defaults to null, which indicates
   /// that the view extends to the end of the byte buffer.
   ///
-  /// Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-  /// if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-  /// the length of [buffer].
+  /// The [offsetInBytes] and [length] must be non-negative, and
+  /// [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+  /// equal to the length of [buffer].
   factory NativeByteData.view(
       ByteBuffer buffer, int offsetInBytes, int? length) {
     _checkViewArguments(buffer, offsetInBytes, length);
@@ -412,8 +412,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// single-precision binary floating-point format (binary32).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   double getFloat32(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat32(byteOffset, Endian.little == endian);
 
@@ -425,8 +425,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// double-precision binary floating-point format (binary64).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   double getFloat64(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat64(byteOffset, Endian.little == endian);
 
@@ -440,8 +440,8 @@
   /// The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getInt16(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt16(byteOffset, Endian.little == endian);
 
@@ -455,8 +455,8 @@
   /// The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getInt32(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt32(byteOffset, Endian.little == endian);
 
@@ -470,8 +470,8 @@
   /// The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getInt64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -480,8 +480,8 @@
   /// specified [byteOffset] in this object, in two's complement binary
   /// representation. The return value will be between -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getInt8(int byteOffset) native;
 
   /// Returns the positive integer represented by the two bytes starting
@@ -489,8 +489,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getUint16(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint16(byteOffset, Endian.little == endian);
 
@@ -503,8 +503,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getUint32(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint32(byteOffset, Endian.little == endian);
 
@@ -517,8 +517,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getUint64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -527,8 +527,8 @@
   /// [byteOffset] in this object, in unsigned binary form. The
   /// return value will be between 0 and 255, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getUint8(int byteOffset) native;
 
   /// Sets the four bytes starting at the specified [byteOffset] in this
@@ -544,8 +544,8 @@
   /// Note that finite (but large) values can be converted to infinity, and
   /// small non-zero values can be converted to zero.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setFloat32(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat32(byteOffset, value, Endian.little == endian);
 
@@ -556,8 +556,8 @@
   /// object to the IEEE 754 double-precision binary floating-point
   /// (binary64) representation of the specified [value].
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setFloat64(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat64(byteOffset, value, Endian.little == endian);
 
@@ -569,8 +569,8 @@
   /// [value], which must fit in two bytes. In other words, [value] must lie
   /// between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt16(byteOffset, value, Endian.little == endian);
 
@@ -582,8 +582,8 @@
   /// [value], which must fit in four bytes. In other words, [value] must lie
   /// between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt32(byteOffset, value, Endian.little == endian);
 
@@ -595,8 +595,8 @@
   /// [value], which must fit in eight bytes. In other words, [value] must lie
   /// between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -606,8 +606,8 @@
   /// must fit in a single byte. In other words, [value] must be between
   /// -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setInt8(int byteOffset, int value) native;
 
   /// Sets the two bytes starting at the specified [byteOffset] in this object
@@ -615,8 +615,8 @@
   /// which must fit in two bytes. in other words, [value] must be between
   /// 0 and 2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint16(byteOffset, value, Endian.little == endian);
 
@@ -628,8 +628,8 @@
   /// which must fit in four bytes. in other words, [value] must be between
   /// 0 and 2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint32(byteOffset, value, Endian.little == endian);
 
@@ -641,8 +641,8 @@
   /// which must fit in eight bytes. in other words, [value] must be between
   /// 0 and 2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -652,8 +652,8 @@
   /// in a single byte. in other words, [value] must be between 0 and 255,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative,
-  /// or greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setUint8(int byteOffset, int value) native;
 
   static NativeByteData _create1(arg) =>
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index eeafdc6..c796465 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -483,9 +483,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -545,8 +545,8 @@
    *
    * The return value will be between -128 and 127, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   int getInt8(int byteOffset);
 
@@ -557,8 +557,8 @@
    *
    * In other words, [value] must be between -128 and 127, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   void setInt8(int byteOffset, int value);
 
@@ -568,8 +568,8 @@
    *
    * The return value will be between 0 and 255, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   int getUint8(int byteOffset);
 
@@ -580,8 +580,8 @@
    *
    * In other words, [value] must be between 0 and 255, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative,
-   * or greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   void setUint8(int byteOffset, int value);
 
@@ -593,8 +593,8 @@
    * The return value will be between -2<sup>15</sup> and 2<sup>15</sup> - 1,
    * inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   int getInt16(int byteOffset, [Endian endian = Endian.big]);
 
@@ -606,8 +606,8 @@
    * In other words, [value] must lie
    * between -2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -618,8 +618,8 @@
    *
    * The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   int getUint16(int byteOffset, [Endian endian = Endian.big]);
 
@@ -631,8 +631,8 @@
    * In other words, [value] must be between
    * 0 and 2<sup>16</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -644,8 +644,8 @@
    * The return value will be between -2<sup>31</sup> and 2<sup>31</sup> - 1,
    * inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   int getInt32(int byteOffset, [Endian endian = Endian.big]);
 
@@ -657,8 +657,8 @@
    * In other words, [value] must lie
    * between -2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -669,8 +669,8 @@
    *
    * The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   int getUint32(int byteOffset, [Endian endian = Endian.big]);
 
@@ -682,8 +682,8 @@
    * In other words, [value] must be between
    * 0 and 2<sup>32</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -695,8 +695,8 @@
    * The return value will be between -2<sup>63</sup> and 2<sup>63</sup> - 1,
    * inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   int getInt64(int byteOffset, [Endian endian = Endian.big]);
 
@@ -708,8 +708,8 @@
    * In other words, [value] must lie
    * between -2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -720,8 +720,8 @@
    *
    * The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   int getUint64(int byteOffset, [Endian endian = Endian.big]);
 
@@ -733,8 +733,8 @@
    * In other words, [value] must be between
    * 0 and 2<sup>64</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -743,8 +743,8 @@
    * the specified [byteOffset] in this object, in IEEE 754
    * single-precision binary floating-point format (binary32).
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   double getFloat32(int byteOffset, [Endian endian = Endian.big]);
 
@@ -762,8 +762,8 @@
    * Note that finite (but large) values can be converted to infinity, and
    * small non-zero values can be converted to zero.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   void setFloat32(int byteOffset, double value, [Endian endian = Endian.big]);
 
@@ -772,8 +772,8 @@
    * the specified [byteOffset] in this object, in IEEE 754
    * double-precision binary floating-point format (binary64).
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   double getFloat64(int byteOffset, [Endian endian = Endian.big]);
 
@@ -782,8 +782,8 @@
    * object to the IEEE 754 double-precision binary floating-point
    * (binary64) representation of the specified [value].
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   void setFloat64(int byteOffset, double value, [Endian endian = Endian.big]);
 }
@@ -829,9 +829,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -952,9 +952,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1085,9 +1085,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1211,12 +1211,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1348,12 +1347,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1484,12 +1482,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1621,12 +1618,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1757,12 +1753,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1894,12 +1889,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2031,12 +2025,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2161,12 +2154,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2290,12 +2282,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2427,12 +2418,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2572,12 +2562,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
diff --git a/tools/VERSION b/tools/VERSION
index 958db32..3ad189b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 268
+PRERELEASE 269
 PRERELEASE_PATCH 0
\ No newline at end of file
