Version 2.11.0-256.0.dev

Merge commit '48f3b781cec1406025c6399261cfe74c8ea13209' into 'dev'
diff --git a/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart b/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart
new file mode 100644
index 0000000..4f19b2e
--- /dev/null
+++ b/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:meta/meta.dart';
+
+/// Helper for building `.dart_tool/package_config.json` files.
+///
+/// See accepted/future-releases/language-versioning/package-config-file-v2.md
+/// in https://github.com/dart-lang/language/
+class PackageConfigFileBuilder {
+  final List<_PackageDescription> _packages = [];
+
+  /// The [rootPath] will be given to `toUriStr` of [toContent] to produce
+  /// the corresponding `file://` URI, normally a POSIX path.
+  ///
+  /// The [packageUri] is optional, a URI reference, resolved against the
+  /// file URI of the [rootPath]. The result must be inside the [rootPath].
+  void add({
+    @required String name,
+    @required String rootPath,
+    String packageUri = 'lib/',
+    String languageVersion,
+  }) {
+    if (_packages.any((e) => e.name == name)) {
+      throw StateError('Already added: $name');
+    }
+    _packages.add(
+      _PackageDescription(
+        name: name,
+        rootPath: rootPath,
+        packageUri: packageUri,
+        languageVersion: languageVersion,
+      ),
+    );
+  }
+
+  PackageConfigFileBuilder copy() {
+    var copy = PackageConfigFileBuilder();
+    copy._packages.addAll(_packages);
+    return copy;
+  }
+
+  String toContent({
+    @required String Function(String) toUriStr,
+  }) {
+    var buffer = StringBuffer();
+
+    buffer.writeln('{');
+
+    var prefix = ' ' * 2;
+    buffer.writeln('$prefix"configVersion": 2,');
+    buffer.writeln('$prefix"packages": [');
+
+    for (var i = 0; i < _packages.length; i++) {
+      var package = _packages[i];
+
+      var prefix = ' ' * 4;
+      buffer.writeln('$prefix{');
+
+      prefix = ' ' * 6;
+      buffer.writeln('$prefix"name": "${package.name}",');
+
+      var rootUri = toUriStr(package.rootPath);
+      buffer.write('$prefix"rootUri": "$rootUri"');
+
+      if (package.packageUri != null) {
+        buffer.writeln(',');
+        buffer.write('$prefix"packageUri": "${package.packageUri}"');
+      }
+
+      if (package.languageVersion != null) {
+        buffer.writeln(',');
+        buffer.write('$prefix"languageVersion": "${package.languageVersion}"');
+      }
+
+      buffer.writeln();
+
+      prefix = ' ' * 4;
+      buffer.write(prefix);
+      buffer.writeln(i < _packages.length - 1 ? '},' : '}');
+    }
+
+    buffer.writeln('  ]');
+    buffer.writeln('}');
+
+    return buffer.toString();
+  }
+}
+
+class _PackageDescription {
+  final String name;
+  final String rootPath;
+  final String packageUri;
+  final String languageVersion;
+
+  _PackageDescription({
+    @required this.name,
+    @required this.rootPath,
+    @required this.packageUri,
+    @required this.languageVersion,
+  });
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 6f7ba44..16d21b17 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 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:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
@@ -28,6 +29,8 @@
 import 'context_collection_resolution_caching.dart';
 import 'resolution.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 class AnalysisOptionsFileConfig {
   final List<String> experiments;
   final bool implicitCasts;
@@ -248,79 +251,6 @@
   }
 }
 
-class PackageConfigFileBuilder {
-  final List<_PackageDescription> _packages = [];
-
-  void add({
-    @required String name,
-    @required String rootPath,
-    String packageUri = 'lib/',
-    String languageVersion,
-  }) {
-    if (_packages.any((e) => e.name == name)) {
-      throw StateError('Already added: $name');
-    }
-    _packages.add(
-      _PackageDescription(
-        name: name,
-        rootPath: rootPath,
-        packageUri: packageUri,
-        languageVersion: languageVersion,
-      ),
-    );
-  }
-
-  String toContent(String Function(String) toUriStr) {
-    var buffer = StringBuffer();
-
-    buffer.writeln('{');
-
-    var prefix = ' ' * 2;
-    buffer.writeln('$prefix"configVersion": 2,');
-    buffer.writeln('$prefix"packages": [');
-
-    for (var i = 0; i < _packages.length; i++) {
-      var package = _packages[i];
-
-      var prefix = ' ' * 4;
-      buffer.writeln('$prefix{');
-
-      prefix = ' ' * 6;
-      buffer.writeln('$prefix"name": "${package.name}",');
-
-      var rootUri = toUriStr(package.rootPath);
-      buffer.write('$prefix"rootUri": "$rootUri"');
-
-      if (package.packageUri != null) {
-        buffer.writeln(',');
-        buffer.write('$prefix"packageUri": "${package.packageUri}"');
-      }
-
-      if (package.languageVersion != null) {
-        buffer.writeln(',');
-        buffer.write('$prefix"languageVersion": "${package.languageVersion}"');
-      }
-
-      buffer.writeln();
-
-      prefix = ' ' * 4;
-      buffer.write(prefix);
-      buffer.writeln(i < _packages.length - 1 ? '},' : '}');
-    }
-
-    buffer.writeln('  ]');
-    buffer.writeln('}');
-
-    return buffer.toString();
-  }
-
-  PackageConfigFileBuilder _copy() {
-    var copy = PackageConfigFileBuilder();
-    copy._packages.addAll(_packages);
-    return copy;
-  }
-}
-
 class PubPackageResolutionTest extends ContextResolutionTest {
   AnalysisOptionsImpl get analysisOptions {
     var path = convertPath(testPackageRootPath);
@@ -351,7 +281,12 @@
   }
 
   void writePackageConfig(String path, PackageConfigFileBuilder config) {
-    newFile(path, content: config.toContent(toUriStr));
+    newFile(
+      path,
+      content: config.toContent(
+        toUriStr: toUriStr,
+      ),
+    );
   }
 
   void writeTestPackageAnalysisOptionsFile(AnalysisOptionsFileConfig config) {
@@ -367,7 +302,7 @@
     bool js = false,
     bool meta = false,
   }) {
-    config = config._copy();
+    config = config.copy();
 
     config.add(
       name: 'test',
@@ -446,17 +381,3 @@
     );
   }
 }
-
-class _PackageDescription {
-  final String name;
-  final String rootPath;
-  final String packageUri;
-  final String languageVersion;
-
-  _PackageDescription({
-    @required this.name,
-    @required this.rootPath,
-    @required this.packageUri,
-    @required this.languageVersion,
-  });
-}
diff --git a/tools/VERSION b/tools/VERSION
index 5ab24c7..7845415 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 255
+PRERELEASE 256
 PRERELEASE_PATCH 0
\ No newline at end of file