Version 2.12.0-91.0.dev

Merge commit '9296c0cbdf67a847d87250b980bb1108f1fdc563' into 'dev'
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 3cd4538..49dcb3d 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -214,7 +214,6 @@
       return;
     }
 
-    var changes = <SourceChange>[];
     //
     // Allow plugins to start computing assists.
     //
@@ -227,35 +226,12 @@
       pluginFutures = server.pluginManager
           .broadcastRequest(requestParams, contextRoot: driver.contextRoot);
     }
+
     //
     // Compute fixes associated with server-generated errors.
     //
-    var result = await server.getResolvedUnit(file);
-    server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
-    if (result != null) {
-      var context = DartAssistContextImpl(
-        server.instrumentationService,
-        DartChangeWorkspace(server.currentSessions),
-        result,
-        offset,
-        length,
-      );
-      try {
-        List<Assist> assists;
-        try {
-          var processor = AssistProcessor(context);
-          assists = await processor.compute();
-        } on InconsistentAnalysisException {
-          assists = [];
-        }
+    var changes = await _computeServerAssists(request, file, offset, length);
 
-        assists.sort(Assist.SORT_BY_RELEVANCE);
-        for (var assist in assists) {
-          changes.add(assist.change);
-        }
-        server.requestStatistics?.addItemTimeNow(request, 'computedAssists');
-      } catch (_) {}
-    }
     //
     // Add the fixes produced by plugins to the server-generated fixes.
     //
@@ -271,6 +247,7 @@
     pluginChanges
         .sort((first, second) => first.priority.compareTo(second.priority));
     changes.addAll(pluginChanges.map(converter.convertPrioritizedSourceChange));
+
     //
     // Send the response.
     //
@@ -765,6 +742,52 @@
     return errorFixesList;
   }
 
+  Future<List<SourceChange>> _computeServerAssists(
+      Request request, String file, int offset, int length) async {
+    var changes = <SourceChange>[];
+
+    var result = await server.getResolvedUnit(file);
+    server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
+
+    if (result != null) {
+      var context = DartAssistContextImpl(
+        server.instrumentationService,
+        DartChangeWorkspace(server.currentSessions),
+        result,
+        offset,
+        length,
+      );
+
+      try {
+        List<Assist> assists;
+        try {
+          var processor = AssistProcessor(context);
+          assists = await processor.compute();
+        } on InconsistentAnalysisException {
+          assists = [];
+        } catch (exception, stackTrace) {
+          var parametersFile = '''
+offset: $offset
+length: $length
+      ''';
+          throw CaughtExceptionWithFiles(exception, stackTrace, {
+            file: result.content,
+            'parameters': parametersFile,
+          });
+        }
+
+        assists.sort(Assist.SORT_BY_RELEVANCE);
+        for (var assist in assists) {
+          changes.add(assist.change);
+        }
+
+        server.requestStatistics?.addItemTimeNow(request, 'computedAssists');
+      } catch (_) {}
+    }
+
+    return changes;
+  }
+
   /// Compute and return the fixes associated with server-generated errors.
   Future<List<AnalysisErrorFixes>> _computeServerErrorFixes(
       Request request, String file, int offset) async {
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 8f23b6e..1bf44e0 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -7,9 +7,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:args/args.dart';
-import 'package:cli_util/cli_util.dart';
 
 const String analysisOptionsFileOption = 'options';
 const String defineVariableOption = 'D';
@@ -116,16 +114,6 @@
   return builderOptions;
 }
 
-/// Use the given [resourceProvider] and command-line [args] to create a Dart
-/// SDK manager. The manager will use summary information if [useSummaries] is
-/// `true` and if the summary information exists.
-DartSdkManager createDartSdkManager(
-    ResourceProvider resourceProvider, ArgResults args) {
-  String sdkPath = args[sdkPathOption] ?? getSdkPath();
-
-  return DartSdkManager(sdkPath);
-}
-
 /// Add the standard flags and options to the given [parser]. The standard flags
 /// are those that are typically used to control the way in which the code is
 /// analyzed.
diff --git a/pkg/analyzer/lib/src/util/sdk.dart b/pkg/analyzer/lib/src/util/sdk.dart
index 7f6bdea..e1dd259 100644
--- a/pkg/analyzer/lib/src/util/sdk.dart
+++ b/pkg/analyzer/lib/src/util/sdk.dart
@@ -6,23 +6,6 @@
 
 import 'package:path/path.dart' as path;
 
-/// Return `true` if the given [sdkPath] is valid, i.e. has all required
-/// artifacts.
-String computePlatformBinariesPath(String sdkPath) {
-  // Try the given SDK path.
-  {
-    String location = path.join(sdkPath, 'lib', '_internal');
-    if (File(path.join(location, 'vm_platform_strong.dill')).existsSync()) {
-      return location;
-    }
-  }
-
-  // The given SDK path does not work.
-  // Then we're probably running on bots, in 'xcodebuild/ReleaseX64'.
-  // In this case 'vm_platform_strong.dill' is next to the 'dart'.
-  return path.dirname(Platform.resolvedExecutable);
-}
-
 String getSdkPath([List<String> args]) {
   // Look for --dart-sdk on the command line.
   if (args != null) {
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index e3d502f..4f8ada1 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -5,10 +5,8 @@
 import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:args/args.dart';
-import 'package:cli_util/cli_util.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -82,26 +80,6 @@
     expect(defaultOptions.implicitDynamic, true);
   }
 
-  void test_createDartSdkManager_noPath() {
-    ArgParser parser = ArgParser();
-    defineAnalysisArguments(parser);
-    List<String> args = [];
-    ArgResults result = parse(resourceProvider, parser, args);
-    DartSdkManager manager = createDartSdkManager(resourceProvider, result);
-    expect(manager, isNotNull);
-    expect(manager.defaultSdkDirectory, getSdkPath());
-  }
-
-  void test_createDartSdkManager_path() {
-    ArgParser parser = ArgParser();
-    defineAnalysisArguments(parser);
-    List<String> args = ['--dart-sdk=x'];
-    ArgResults result = parse(resourceProvider, parser, args);
-    DartSdkManager manager = createDartSdkManager(resourceProvider, result);
-    expect(manager, isNotNull);
-    expect(manager.defaultSdkDirectory, 'x');
-  }
-
   void test_defineAnalysisArguments() {
     ArgParser parser = ArgParser();
     defineAnalysisArguments(parser);
diff --git a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
index d477df0..a54fa1a 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io' as io;
-
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/dart/analysis/declared_variables.dart';
@@ -36,7 +34,6 @@
   }
 
   void setUp() {
-    newFile(io.Platform.resolvedExecutable); // create folders
     var folder = newFolder('/home/test');
     contextBuilder = ContextBuilderImpl(resourceProvider: resourceProvider);
     contextRoot = ContextRootImpl(resourceProvider, folder);
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index a648c3f..a634551 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -9,12 +9,12 @@
 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' 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';
@@ -64,10 +64,8 @@
 
   String get workspaceRootPath => convertPath('/home');
 
-  Source addSource(String path, String content, [Uri uri]) {
-    var file = newFile(path, content: content);
-    var source = file.createSource(uri);
-    return source;
+  void addSource(String path, String content) {
+    newFile(path, content: content);
   }
 
   AnalysisContext contextFor(String path) {
@@ -104,6 +102,15 @@
         .single;
   }
 
+  @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);
   }
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index 4a8ea64..03082d7 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:test/test.dart';
 
 import 'abstract_context.dart';
@@ -19,14 +18,13 @@
 
   String testCode;
   String testFile;
-  Source testSource;
   CompilationUnit testUnit;
   CompilationUnitElement testUnitElement;
   LibraryElement testLibraryElement;
 
-  void addTestSource(String code, [Uri uri]) {
+  void addTestSource(String code) {
     testCode = code;
-    testSource = addSource(testFile, code, uri);
+    addSource(testFile, code);
   }
 
   Element findElement(String name, [ElementKind kind]) {
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 b1992c4..2697933 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -4,7 +4,6 @@
 
 import 'dart:async';
 
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
@@ -23,7 +22,6 @@
 abstract class DartCompletionContributorTest extends AbstractContextTest {
   static const String _UNCHECKED = '__UNCHECKED__';
   String testFile;
-  Source testSource;
   int completionOffset;
   int replacementOffset;
   int replacementLength;
@@ -46,7 +44,7 @@
     expect(nextOffset, equals(-1), reason: 'too many ^');
     content = content.substring(0, completionOffset) +
         content.substring(completionOffset + 1);
-    testSource = addSource(testFile, content);
+    addSource(testFile, content);
   }
 
   void assertHasNoParameterInfo(CompletionSuggestion suggestion) {
@@ -414,7 +412,6 @@
 
   Future computeSuggestions() async {
     var result = await resolveFile(testFile);
-    testSource = result.unit.declaredElement.source;
     request =
         DartCompletionRequestImpl(resourceProvider, completionOffset, result);
 
diff --git a/tools/VERSION b/tools/VERSION
index 16ff566..1f087df 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 90
+PRERELEASE 91
 PRERELEASE_PATCH 0
\ No newline at end of file