Version 2.11.0-271.0.dev

Merge commit '7d764a6b3ab8fd732c7020c95a1950de644c2ae5' into 'dev'
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 0ba93d6..f763f70 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -16,6 +16,7 @@
   analysis_tool:
     path: ../analysis_tool
   html: '>=0.13.1 <0.15.0'
+  meta: '^1.1.8'
   path: '^1.4.1'
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 3ff7be2..6d37cfe 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart'
     show DartLinkedEditBuilderImpl;
@@ -20,7 +21,8 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(DartEditBuilderImplTest);
+    defineReflectiveTests(DartEditBuilderImpl_PreNullSafetyTest);
+    defineReflectiveTests(DartEditBuilderImpl_WithNullSafetyTest);
     defineReflectiveTests(DartFileEditBuilderImplTest);
     defineReflectiveTests(DartLinkedEditBuilderImplTest);
     defineReflectiveTests(ImportLibraryTest);
@@ -29,10 +31,96 @@
 }
 
 @reflectiveTest
+class DartEditBuilderImpl_PreNullSafetyTest extends DartEditBuilderImplTest {
+  Future<void> test_writeParameter_covariantAndRequired() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = 'class A {}';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isCovariant: true, isRequiredNamed: true);
+      });
+    });
+    var edits = getEdits(builder);
+    expect(edits, hasLength(2));
+    expect(edits[0].replacement,
+        equalsIgnoringWhitespace('covariant @required a'));
+    expect(edits[1].replacement,
+        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
+  }
+
+  Future<void> test_writeParameter_required_addImport() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = 'class A {}';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isRequiredNamed: true);
+      });
+    });
+    var edits = getEdits(builder);
+    expect(edits, hasLength(2));
+    expect(edits[0].replacement, equalsIgnoringWhitespace('@required a'));
+    expect(edits[1].replacement,
+        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
+  }
+
+  Future<void> test_writeParameter_required_existingImport() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = '''
+import 'package:meta/meta.dart';
+
+class A {}
+''';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isRequiredNamed: true);
+      });
+    });
+    var edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('@required a'));
+  }
+}
+
+@reflectiveTest
+class DartEditBuilderImpl_WithNullSafetyTest extends DartEditBuilderImplTest
+    with WithNullSafetyMixin {
+  Future<void> test_writeParameter_required_keyword() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = 'class A {}';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isRequiredNamed: true);
+      });
+    });
+    var edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('required a'));
+  }
+}
+
 class DartEditBuilderImplTest extends AbstractContextTest
     with DartChangeBuilderMixin {
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder(),
+      meta: true,
+    );
+  }
+
   Future<void> test_writeClassDeclaration_interfaces() async {
-    var path = convertPath('/home/test/lib/test.dart');
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
@@ -604,7 +692,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -625,7 +713,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -651,7 +739,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -671,7 +759,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -691,7 +779,7 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var A = unit.declarations[1] as ClassDeclaration;
 
@@ -722,7 +810,7 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var A = unit.declarations[1] as ClassDeclaration;
 
@@ -758,7 +846,7 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var A = unit.declarations[1] as ClassDeclaration;
 
@@ -902,79 +990,6 @@
     expect(edit.replacement, equalsIgnoringWhitespace('covariant a'));
   }
 
-  Future<void> test_writeParameter_covariantAndRequired() async {
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = 'class A {}';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isCovariant: true, isRequiredNamed: true);
-      });
-    });
-    var edits = getEdits(builder);
-    expect(edits, hasLength(2));
-    expect(edits[0].replacement,
-        equalsIgnoringWhitespace('covariant @required a'));
-    expect(edits[1].replacement,
-        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
-  }
-
-  Future<void> test_writeParameter_required_addImport() async {
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = 'class A {}';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isRequiredNamed: true);
-      });
-    });
-    var edits = getEdits(builder);
-    expect(edits, hasLength(2));
-    expect(edits[0].replacement, equalsIgnoringWhitespace('@required a'));
-    expect(edits[1].replacement,
-        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
-  }
-
-  Future<void> test_writeParameter_required_existingImport() async {
-    addMetaPackage();
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = '''
-import 'package:meta/meta.dart';
-
-class A {}
-''';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isRequiredNamed: true);
-      });
-    });
-    var edit = getEdit(builder);
-    expect(edit.replacement, equalsIgnoringWhitespace('@required a'));
-  }
-
-  Future<void> test_writeParameter_required_keyword() async {
-    createAnalysisOptionsFile(experiments: ['non-nullable']);
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = 'class A {}';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isRequiredNamed: true);
-      });
-    });
-    var edit = getEdit(builder);
-    expect(edit.replacement, equalsIgnoringWhitespace('required a'));
-  }
-
   Future<void> test_writeParameter_type() async {
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
@@ -1001,7 +1016,7 @@
 class A {}
 ''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var g = unit.declarations[1] as FunctionDeclaration;
     var body = g.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
@@ -1023,7 +1038,7 @@
     var content = 'f(int a, {bool b = false, String c}) {}';
     addSource(path, content);
 
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1043,7 +1058,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'f(int a, [bool b = false, String c]) {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1063,7 +1078,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'f(int i, String s) {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1085,7 +1100,7 @@
   g(s, index: i);
 }''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
@@ -1108,7 +1123,7 @@
   g(s, i);
 }''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
@@ -1125,14 +1140,14 @@
   }
 
   Future<void> test_writeReference_method() async {
-    var aPath = convertPath('/a.dart');
+    var aPath = convertPath('$testPackageRootPath/a.dart');
     addSource(aPath, r'''
 class A {
   void foo() {}
 }
 ''');
 
-    var path = convertPath('/home/test/lib/test.dart');
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
     var content = r'''
 import 'a.dart';
 ''';
@@ -1152,10 +1167,10 @@
   }
 
   Future<void> test_writeReference_topLevel_hasImport_noPrefix() async {
-    var aPath = convertPath('/home/test/lib/a.dart');
+    var aPath = convertPath('$testPackageRootPath/lib/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    var path = convertPath('/home/test/lib/test.dart');
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
     var content = r'''
 import 'a.dart';
 ''';
@@ -1301,7 +1316,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -1514,7 +1529,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -1665,14 +1680,14 @@
   }
 
   Future<ClassElement> _getClassElement(String path, String name) async {
-    var result = await driver.getUnitElement(path);
-    return result.element.getType(name);
+    var result = (await resolveFile(path))?.unit;
+    return result.declaredElement.getType(name);
   }
 
   Future<PropertyAccessorElement> _getTopLevelAccessorElement(
       String path, String name) async {
-    var result = await driver.getUnitElement(path);
-    return result.element.accessors.firstWhere((v) => v.name == name);
+    var result = (await resolveFile(path))?.unit;
+    return result.declaredElement.accessors.firstWhere((v) => v.name == name);
   }
 
   Future<InterfaceType> _getType(
@@ -1695,7 +1710,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, '''var f = () {}''');
 
-    var resolvedUnit = await driver.getResult(path);
+    var resolvedUnit = await resolveFile(path);
     var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var body = findNode.functionBody('{}');
 
@@ -1712,7 +1727,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
-    var resolvedUnit = await driver.getResult(path);
+    var resolvedUnit = await resolveFile(path);
     var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var body = findNode.functionBody('{}');
 
@@ -1825,7 +1840,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
-    var resolvedUnit = await driver.getResult(path);
+    var resolvedUnit = await resolveFile(path);
     var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var type = findNode.typeAnnotation('String');
 
@@ -1848,7 +1863,7 @@
 class B extends A {}
 class C extends B {}
 ''');
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var classC = unit.declarations[2] as ClassDeclaration;
     var builder = DartLinkedEditBuilderImpl(null);
     builder.addSuperTypesAsSuggestions(
@@ -2869,12 +2884,12 @@
 
     ClassElement targetElement;
     {
-      var unitResult = await driver.getUnitElement(path);
+      var unitResult = (await resolveFile(path))?.unit;
       if (targetMixinName != null) {
-        targetElement = unitResult.element.mixins
+        targetElement = unitResult.declaredElement.mixins
             .firstWhere((e) => e.name == targetMixinName);
       } else {
-        targetElement = unitResult.element.types
+        targetElement = unitResult.declaredElement.types
             .firstWhere((e) => e.name == targetClassName);
       }
     }
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index 8b94108..6970a80 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -676,9 +676,9 @@
 
   Future<void> test_MapLiteral_expression() async {
     super.setUp();
-    final experimentStatus =
-        (driver.analysisOptions as analyzer.AnalysisOptionsImpl)
-            .experimentStatus;
+    final experimentStatus = (driverFor(testPackageRootPath).analysisOptions
+            as analyzer.AnalysisOptionsImpl)
+        .experimentStatus;
     if (experimentStatus.control_flow_collections ||
         experimentStatus.spread_collections) {
       // SimpleIdentifier  MapLiteral  VariableDeclaration
@@ -974,7 +974,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     newFile(path, content: content);
 
-    var result = await driver.getResult(path);
+    var result = await resolveFile(path);
     findElement = FindElement(result.unit);
 
     target = CompletionTarget.forOffset(result.unit, offset);
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
index 7fc0527..4703fda 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
@@ -48,7 +48,7 @@
     //
     // Compute the OpType.
     //
-    var resolvedUnit = await driver.getResult(testPath);
+    var resolvedUnit = await resolveFile(testPath);
     var completionTarget =
         CompletionTarget.forOffset(resolvedUnit.unit, completionOffset);
     var opType = OpType.forCompletion(completionTarget, completionOffset);
@@ -102,7 +102,7 @@
   @override
   void setUp() {
     super.setUp();
-    testPath = convertPath('/completionTest.dart');
+    testPath = convertPath('$testPackageRootPath/completionTest.dart');
   }
 }
 
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index 4421f8c..e2e289b 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -2,19 +2,27 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/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/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/generated/engine.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/generated/testing/element_search.dart';
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:meta/meta.dart';
 
 /// Finds an [Element] with the given [name].
 Element findChildElement(Element root, String name, [ElementKind kind]) {
@@ -35,49 +43,43 @@
 typedef _ElementVisitorFunction = void Function(Element element);
 
 class AbstractContextTest with ResourceProviderMixin {
-  AnalysisDriver _driver;
+  final ByteStore _byteStore = MemoryByteStore();
 
-  /// The file system specific `/home/test/analysis_options.yaml` path.
-  String get analysisOptionsPath =>
-      convertPath('/home/test/analysis_options.yaml');
+  final Map<String, String> _declaredVariables = {};
 
-  AnalysisDriver get driver => _driver;
+  AnalysisContextCollection _analysisContextCollection;
 
-  AnalysisSession get session => driver.currentSession;
+  List<String> get collectionIncludedPaths => [workspaceRootPath];
 
-  /// The file system specific `/home/test/pubspec.yaml` path.
-  String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
+  AnalysisSession get session => contextFor(testPackageRootPath).currentSession;
 
-  void addMetaPackage() {
-    addPackageFile('meta', 'meta.dart', r'''
-library meta;
+  /// The file system-specific `analysis_options.yaml` path.
+  String get testPackageAnalysisOptionsPath =>
+      convertPath('$testPackageRootPath/analysis_options.yaml');
 
-const Required required = const Required();
+  String get testPackageLanguageVersion => '2.9';
 
-class Required {
-  final String reason;
-  const Required([this.reason]);
-}
-''');
-  }
+  /// The file system-specific `pubspec.yaml` path.
+  String get testPackagePubspecPath =>
+      convertPath('$testPackageRootPath/pubspec.yaml');
 
-  /// 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 testPackageRootPath => convertPath('/home/test');
+
+  String get workspaceRootPath => convertPath('/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;
   }
 
+  AnalysisContext contextFor(String path) {
+    _createAnalysisContexts();
+
+    path = convertPath(path);
+    return _analysisContextCollection.contextFor(path);
+  }
+
   /// Create an analysis options file based on the given arguments.
   void createAnalysisOptionsFile({List<String> experiments}) {
     var buffer = StringBuffer();
@@ -90,11 +92,12 @@
       }
     }
 
-    newFile(analysisOptionsPath, content: buffer.toString());
+    newFile(testPackageAnalysisOptionsPath, content: buffer.toString());
+  }
 
-    if (_driver != null) {
-      _createDriver();
-    }
+  AnalysisDriver driverFor(String path) {
+    var context = contextFor(path) as DriverBasedAnalysisContext;
+    return context.driver;
   }
 
   Element findElementInUnit(CompilationUnit unit, String name,
@@ -104,53 +107,89 @@
         .single;
   }
 
-  Future<CompilationUnit> resolveLibraryUnit(Source source) async {
-    return (await driver.getResult(source.fullName))?.unit;
+  Future<ResolvedUnitResult> resolveFile(String path) async {
+    return contextFor(path).currentSession.getResolvedUnit(path);
   }
 
   void setUp() {
     MockSdk(resourceProvider: resourceProvider);
 
-    newFolder('/home/test');
-    newFile('/home/test/.packages', content: '''
-test:${toUriStr('/home/test/lib')}
-''');
-
-    _createDriver();
+    newFolder(testPackageRootPath);
+    writeTestPackageConfig();
   }
 
   void tearDown() {
     AnalysisEngine.instance.clearCaches();
   }
 
-  void _addTestPackageDependency(String name, String rootPath) {
-    var packagesFile = getFile('/home/test/.packages');
-    var packagesContent = packagesFile.readAsStringSync();
+  void writePackageConfig(String path, PackageConfigFileBuilder config) {
+    newFile(path, content: config.toContent(toUriStr: toUriStr));
+  }
 
-    // Ignore if there is already the same package dependency.
-    if (packagesContent.contains('$name:file://')) {
+  void writeTestPackageConfig({
+    PackageConfigFileBuilder config,
+    String languageVersion,
+    bool meta = false,
+  }) {
+    if (config == null) {
+      config = PackageConfigFileBuilder();
+    } else {
+      config = config.copy();
+    }
+
+    config.add(
+      name: 'test',
+      rootPath: testPackageRootPath,
+      languageVersion: languageVersion ?? testPackageLanguageVersion,
+    );
+
+    if (meta) {
+      var metaPath = '/packages/meta';
+      MockPackages.addMetaPackageFiles(
+        getFolder(metaPath),
+      );
+      config.add(name: 'meta', rootPath: metaPath);
+    }
+
+    var path = '$testPackageRootPath/.dart_tool/package_config.json';
+    writePackageConfig(path, config);
+  }
+
+  /// Create all analysis contexts in [collectionIncludedPaths].
+  void _createAnalysisContexts() {
+    if (_analysisContextCollection != null) {
       return;
     }
 
-    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
-
-    packagesFile.writeAsStringSync(packagesContent);
-
-    _createDriver();
-  }
-
-  void _createDriver() {
-    var collection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath('/home')],
+    _analysisContextCollection = AnalysisContextCollectionImpl(
+      byteStore: _byteStore,
+      declaredVariables: _declaredVariables,
       enableIndex: true,
+      includedPaths: collectionIncludedPaths.map(convertPath).toList(),
       resourceProvider: resourceProvider,
       sdkPath: convertPath('/sdk'),
     );
+  }
+}
 
-    var testPath = convertPath('/home/test');
-    var context = collection.contextFor(testPath) as DriverBasedAnalysisContext;
+mixin WithNullSafetyMixin on AbstractContextTest {
+  @override
+  String get testPackageLanguageVersion =>
+      Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
 
-    _driver = context.driver;
+  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/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index 94560b0..4a8ea64 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -94,7 +94,7 @@
 
   Future<void> resolveTestUnit(String code) async {
     addTestSource(code);
-    var result = await driver.getResult(testFile);
+    var result = await resolveFile(testFile);
     testUnit = (result).unit;
     if (verifyNoTestUnitErrors) {
       expect(result.errors.where((AnalysisError error) {
@@ -114,6 +114,6 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = convertPath('/test.dart');
+    testFile = convertPath('$testPackageRootPath/test.dart');
   }
 }
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 681f5a4..5d75ed1 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -72,7 +72,7 @@
   void setUp() {
     super.setUp();
     source = newFile('/foo/bar.dart').createSource();
-    testFile = convertPath('/test.dart');
+    testFile = convertPath('$testPackageRootPath/lib/test.dart');
   }
 
   void test_convertAnalysisError_contextMessages() {
@@ -200,11 +200,11 @@
   }
 
   Future<void> test_convertElement_class() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 @deprecated
 abstract class _A {}
 class B<K, V> {}''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     {
       var engineElement =
           findElementInUnit(unit, '_A') as analyzer.ClassElement;
@@ -240,11 +240,11 @@
   }
 
   Future<void> test_convertElement_constructor() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   const A.myConstructor(int a, [String b]);
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myConstructor') as analyzer.ConstructorElement;
     // create notification Element
@@ -278,11 +278,11 @@
   }
 
   Future<void> test_convertElement_enum() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     {
       var engineElement =
           findElementInUnit(unit, '_E1') as analyzer.ClassElement;
@@ -319,11 +319,11 @@
   }
 
   Future<void> test_convertElement_enumConstant() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     {
       var engineElement =
           findElementInUnit(unit, 'one') as analyzer.FieldElement;
@@ -410,11 +410,11 @@
   }
 
   Future<void> test_convertElement_field() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   static const myField = 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myField') as analyzer.FieldElement;
     // create notification Element
@@ -436,10 +436,10 @@
   }
 
   Future<void> test_convertElement_functionTypeAlias() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 typedef int F<T>(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
     // create notification Element
@@ -461,10 +461,10 @@
   }
 
   Future<void> test_convertElement_genericTypeAlias_function() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 typedef F<T> = int Function(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
     // create notification Element
@@ -486,11 +486,11 @@
   }
 
   Future<void> test_convertElement_getter() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   String get myGetter => 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myGetter', analyzer.ElementKind.GETTER)
             as analyzer.PropertyAccessorElement;
@@ -512,13 +512,13 @@
   }
 
   Future<void> test_convertElement_method() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   static List<String> myMethod(int a, {String b, int c}) {
     return null;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myMethod') as analyzer.MethodElement;
     // create notification Element
@@ -539,11 +539,11 @@
   }
 
   Future<void> test_convertElement_setter() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   set mySetter(String x) {}
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'mySetter', analyzer.ElementKind.SETTER)
             as analyzer.PropertyAccessorElement;
@@ -615,14 +615,14 @@
   }
 
   Future<void> test_fromElement_LABEL() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 main() {
 myLabel:
   while (true) {
     break myLabel;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myLabel') as analyzer.LabelElement;
     // create notification Element
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index f780177..b1992c4 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -409,11 +409,11 @@
   }
 
   Future<void> computeLibrariesContaining() {
-    return driver.getResult(testFile).then((result) => null);
+    return resolveFile(testFile).then((result) => null);
   }
 
   Future computeSuggestions() async {
-    var result = await driver.getResult(testFile);
+    var result = await resolveFile(testFile);
     testSource = result.unit.declaredElement.source;
     request =
         DartCompletionRequestImpl(resourceProvider, completionOffset, result);
diff --git a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
index 927b5b3..49d103d 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/utilities/completion/inherited_reference_contributor.dart';
 import 'package:test/test.dart';
@@ -25,9 +26,17 @@
     return InheritedReferenceContributor();
   }
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder(),
+      meta: true,
+    );
+  }
+
   /// Sanity check. Permutations tested in local_ref_contributor.
   Future<void> test_ArgDefaults_inherited_method_with_required_named() async {
-    addMetaPackage();
     resolveSource('/home/test/lib/b.dart', '''
 import 'package:meta/meta.dart';
 
diff --git a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
index 186ce86..c268c4e 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/utilities/completion/relevance.dart';
@@ -53,6 +54,16 @@
     return TypeMemberContributor();
   }
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'myBar', rootPath: '$workspaceRootPath/myBar'),
+      meta: true,
+    );
+  }
+
   Future<void> test_ArgDefaults_method() async {
     addTestSource('''
 class A {
@@ -78,7 +89,6 @@
   }
 
   Future<void> test_ArgDefaults_method_with_optional_positional() async {
-    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -93,7 +103,6 @@
   }
 
   Future<void> test_ArgDefaults_method_with_required_named() async {
-    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -1075,10 +1084,10 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
+    newFile('$workspaceRootPath/myBar/bar.dart',
+        content: 'class Foo2 { Foo2() { } }');
     addSource(
         '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = convertPath('/proj/completionTest.dart');
     addTestSource('class C {foo(){F^}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
diff --git a/tools/VERSION b/tools/VERSION
index fb8bbdd..c74d0b4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 270
+PRERELEASE 271
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 4490eea..e78a878 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -510,6 +510,12 @@
         "use-sdk": true
       }
     },
+    "dart2js-(linux|mac|win)-chrome-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-weak-(linux|mac|win)-x64-d8": {
       "options": {
         "builder-tag": "dart2js-weak",
@@ -521,22 +527,47 @@
         "use-sdk": true
       }
     },
+    "dart2js-(linux|win)-firefox-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-win-ie11": {
       "options": {
         "use-sdk": true,
         "babel": "{\"presets\":[\"es2015\"]}"
       }
     },
+    "dart2js-win-ie11-unsound": {
+      "options": {
+        "use-sdk": true,
+        "babel": "{\"presets\":[\"es2015\"]}",
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-win-edge": {
       "options": {
         "use-sdk": true
       }
     },
+    "dart2js-win-edge-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-mac-safari": {
       "options": {
         "use-sdk": true
       }
     },
+    "dart2js-mac-safari-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-minified-csp-(linux|mac|win)-chrome": {
       "options": {
         "minified": true,
@@ -544,12 +575,27 @@
         "use-sdk": true
       }
     },
+    "dart2js-minified-csp-(linux|mac|win)-chrome-unsound": {
+      "options": {
+        "minified": true,
+        "csp": true,
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-minified-(linux|mac|win)-d8": {
       "options": {
         "minified": true,
         "use-sdk": true
       }
     },
+    "dart2js-minified-(linux|mac|win)-d8-unsound": {
+      "options": {
+        "minified": true,
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-production-(linux|mac|win)-d8": {
       "options": {
         "builder-tag": "dart2js_production",
@@ -564,6 +610,12 @@
         "host-checked": true
       }
     },
+    "dart2js-hostasserts-(linux|mac|win)-(ia32|x64)-d8-unsound": {
+      "options": {
+        "host-checked": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-hostasserts-weak-(linux|win)-x64-(d8|chrome)": {
       "options": {
         "builder-tag": "dart2js-weak",
@@ -2139,10 +2191,9 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-hostasserts-linux-ia32-d8",
+            "-ndart2js-hostasserts-linux-ia32-d8-unsound",
             "--dart2js-batch",
             "--enable-experiment=non-nullable",
-            "--dart2js-options=--no-sound-null-safety",
             "observatory_ui"
           ]
         },
@@ -2212,11 +2263,10 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-${system}-${runtime}",
+            "-ndart2js-${system}-${runtime}-unsound",
             "--dart2js-batch",
             "--reset-browser-configuration",
             "--enable-experiment=non-nullable",
-            "--dart2js-options=--no-sound-null-safety",
             "observatory_ui"
           ]
         },
@@ -2267,10 +2317,9 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-minified-linux-d8",
+            "-ndart2js-minified-linux-d8-unsound",
             "--dart2js-batch",
             "--enable-experiment=non-nullable",
-            "--dart2js-options=--no-sound-null-safety",
             "observatory_ui"
           ]
         },
@@ -2340,11 +2389,10 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-minified-csp-linux-chrome",
+            "-ndart2js-minified-csp-linux-chrome-unsound",
             "--dart2js-batch",
             "--reset-browser-configuration",
             "--enable-experiment=non-nullable",
-            "--dart2js-options=--no-sound-null-safety",
             "observatory_ui"
           ]
         },