Use ChangeWorkspace to limit where DartChangeBuilder(s) can edit.

R=brianwilkerson@google.com

Bug: https://github.com/dart-lang/sdk/issues/35402
Change-Id: If5f78b44b69f01d9ddc235401f70cc4aefd3ca37
Reviewed-on: https://dart-review.googlesource.com/c/87382
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
index f338cc5..08fe4f3 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
 /**
  * An object used to provide context information for Dart assist contributors.
@@ -24,4 +25,9 @@
    * The start of the selection.
    */
   int get selectionOffset;
+
+  /**
+   * The workspace in which the fix contributor operates.
+   */
+  ChangeWorkspace get workspace;
 }
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
index 2ac36c5..1d115fa 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
 /**
  * An object used to provide context information for [DartFixContributor]s.
@@ -15,4 +16,9 @@
    * The resolution result in which fix operates.
    */
   ResolvedUnitResult get resolveResult;
+
+  /**
+   * The workspace in which the fix contributor operates.
+   */
+  ChangeWorkspace get workspace;
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 247d137..8a5b5fd 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/search/element_visitors.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/exception/exception.dart';
@@ -73,6 +74,11 @@
     return _analyzedFilesGlobs;
   }
 
+  /// The list of current analysis sessions in all contexts.
+  List<AnalysisSession> get currentSessions {
+    return driverMap.values.map((driver) => driver.currentSession).toList();
+  }
+
   /// A table mapping [Folder]s to the [AnalysisDriver]s associated with them.
   Map<Folder, nd.AnalysisDriver> get driverMap => contextManager.driverMap;
 
diff --git a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
index b53afae..073e434 100644
--- a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/edit/fix/prefer_int_literals_fix.dart';
 import 'package:analysis_server/src/edit/fix/prefer_mixin_fix.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analyzer/dart/analysis/results.dart';
@@ -212,7 +213,8 @@
       return false;
     }
 
-    final dartContext = new DartFixContextImpl(result, error);
+    final workspace = DartChangeWorkspace(server.currentSessions);
+    final dartContext = new DartFixContextImpl(workspace, result, error);
     final processor = new FixProcessor(dartContext);
     Fix fix = await processor.computeFix();
     final location = locationFor(result, error.offset, error.length);
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index fbf18b4..730c071 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -19,6 +19,7 @@
 import 'package:analysis_server/src/services/completion/statement/statement_completion.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analysis_server/src/services/correction/organize_directives.dart';
@@ -183,7 +184,12 @@
     //
     ResolvedUnitResult result = await server.getResolvedUnit(file);
     if (result != null) {
-      var context = new DartAssistContextImpl(result, offset, length);
+      var context = new DartAssistContextImpl(
+        DartChangeWorkspace(server.currentSessions),
+        result,
+        offset,
+        length,
+      );
       try {
         AssistProcessor processor = new AssistProcessor(context);
         List<Assist> assists = await processor.compute();
@@ -528,7 +534,8 @@
       for (engine.AnalysisError error in result.errors) {
         int errorLine = lineInfo.getLocation(error.offset).lineNumber;
         if (errorLine == requestLine) {
-          var context = new DartFixContextImpl(result, error);
+          var workspace = DartChangeWorkspace(server.currentSessions);
+          var context = new DartFixContextImpl(workspace, result, error);
           List<Fix> fixes =
               await new DartFixContributor().computeFixes(context);
           if (fixes.isNotEmpty) {
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
index fa2ba99..619cad3 100644
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/src/edit/edit_dartfix.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
@@ -20,7 +21,12 @@
     while (literalsToConvert.isNotEmpty) {
       DoubleLiteral literal = literalsToConvert.removeLast();
       AssistProcessor processor = new AssistProcessor(
-        new DartAssistContextImpl(result, literal.offset, 0),
+        new DartAssistContextImpl(
+          DartChangeWorkspace(dartFix.server.currentSessions),
+          result,
+          literal.offset,
+          0,
+        ),
       );
       List<Assist> assists =
           await processor.computeAssist(DartAssistKind.CONVERT_TO_INT_LITERAL);
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
index c929ff1..7f66a47 100644
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/src/edit/edit_dartfix.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -37,7 +38,11 @@
       if (declaration is ClassOrMixinDeclaration &&
           declaration.name.name == elem.name) {
         AssistProcessor processor = new AssistProcessor(
-          new DartAssistContextImpl(result, declaration.name.offset, 0),
+          new DartAssistContextImpl(
+              DartChangeWorkspace(dartFix.server.currentSessions),
+              result,
+              declaration.name.offset,
+              0),
         );
         List<Assist> assists = await processor
             .computeAssist(DartAssistKind.CONVERT_CLASS_TO_MIXIN);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
index b4b5dc0..7b00028 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
@@ -17,6 +17,7 @@
 import 'package:analysis_server/src/protocol_server.dart' show SourceChange;
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analyzer/dart/analysis/results.dart';
@@ -128,7 +129,12 @@
     }
 
     try {
-      var context = new DartAssistContextImpl(unit, offset, length);
+      var context = new DartAssistContextImpl(
+        DartChangeWorkspace(server.currentSessions),
+        unit,
+        offset,
+        length,
+      );
       final processor = new AssistProcessor(context);
       final assists = await processor.compute();
       assists.sort(Assist.SORT_BY_RELEVANCE);
@@ -184,7 +190,8 @@
         // Server lineNumber is one-based so subtract one.
         int errorLine = lineInfo.getLocation(error.offset).lineNumber - 1;
         if (errorLine >= range.start.line && errorLine <= range.end.line) {
-          var context = new DartFixContextImpl(unit, error);
+          var workspace = DartChangeWorkspace(server.currentSessions);
+          var context = new DartFixContextImpl(workspace, unit, error);
           final fixes = await fixContributor.computeFixes(context);
           if (fixes.isNotEmpty) {
             fixes.sort(Fix.SORT_BY_RELEVANCE);
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 0d09721..08a56a1 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -5,12 +5,16 @@
 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
 /**
  * The implementation of [DartAssistContext].
  */
 class DartAssistContextImpl implements DartAssistContext {
   @override
+  final ChangeWorkspace workspace;
+
+  @override
   final ResolvedUnitResult resolveResult;
 
   @override
@@ -19,8 +23,8 @@
   @override
   final int selectionLength;
 
-  DartAssistContextImpl(
-      this.resolveResult, this.selectionOffset, this.selectionLength);
+  DartAssistContextImpl(this.workspace, this.resolveResult,
+      this.selectionOffset, this.selectionLength);
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 0f9124d..05e9455 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -27,6 +27,7 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
+import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart'
     hide AssistContributor;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -3353,8 +3354,7 @@
   }
 
   DartChangeBuilder _newDartChangeBuilder() {
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
-    return changeBuilder;
+    return new DartChangeBuilderImpl.forWorkspace(context.workspace);
   }
 
   bool _setupCompute() {
diff --git a/pkg/analysis_server/lib/src/services/correction/change_workspace.dart b/pkg/analysis_server/lib/src/services/correction/change_workspace.dart
new file mode 100644
index 0000000..b7a2a23
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/change_workspace.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, 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:analyzer/dart/analysis/session.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
+
+/// [ChangeWorkspace] based on sessions.
+class DartChangeWorkspace implements ChangeWorkspace {
+  final List<AnalysisSession> sessions;
+
+  DartChangeWorkspace(this.sessions);
+
+  @override
+  bool containsFile(String path) {
+    for (var session in sessions) {
+      if (session.analysisContext.contextRoot.isAnalyzed(path)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  AnalysisSession getSession(String path) {
+    for (var session in sessions) {
+      if (session.analysisContext.contextRoot.isAnalyzed(path)) {
+        return session;
+      }
+    }
+    throw StateError('Not in a context root: $path');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 796ae49..4487fbc 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 /**
@@ -88,16 +89,15 @@
  */
 class DartFixContextImpl implements DartFixContext {
   @override
+  final ChangeWorkspace workspace;
+
+  @override
   final ResolvedUnitResult resolveResult;
 
   @override
   final AnalysisError error;
 
-  DartFixContextImpl(this.resolveResult, this.error);
-
-  DartFixContextImpl.from(DartFixContext other)
-      : resolveResult = other.resolveResult,
-        error = other.error;
+  DartFixContextImpl(this.workspace, this.resolveResult, this.error);
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 55c429c..150fb99 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -43,6 +43,7 @@
 import 'package:analyzer/src/hint/sdk_constraint_extractor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError, Element, ElementKind;
+import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart' hide FixContributor;
@@ -101,8 +102,8 @@
     // one.
     // For each fix, put the fix into the HashMap.
     for (int i = 0; i < allAnalysisErrors.length; i++) {
-      final FixContext fixContextI =
-          new DartFixContextImpl(context.resolveResult, allAnalysisErrors[i]);
+      final FixContext fixContextI = new DartFixContextImpl(
+          context.workspace, context.resolveResult, allAnalysisErrors[i]);
       final FixProcessor processorI = new FixProcessor(fixContextI);
       final List<Fix> fixesListI = await processorI.compute();
       for (Fix f in fixesListI) {
@@ -3964,8 +3965,7 @@
   }
 
   DartChangeBuilder _newDartChangeBuilder() {
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
-    return changeBuilder;
+    return new DartChangeBuilderImpl.forWorkspace(context.workspace);
   }
 
   /**
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 29146c6..2d94d63 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -4,6 +4,8 @@
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -13,7 +15,7 @@
 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/file_state.dart';
-import 'package:analyzer/src/generated/engine.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/resource_provider_mixin.dart';
@@ -44,6 +46,8 @@
 
 class AbstractContextTest with ResourceProviderMixin {
   FileContentOverlay fileContentOverlay = new FileContentOverlay();
+
+  AnalysisContextCollection _analysisContextCollection;
   AnalysisDriver _driver;
 
   AnalysisDriver get driver => _driver;
@@ -56,7 +60,7 @@
   void addFlutterPackage() {
     addMetaPackage();
     Folder libFolder = configureFlutterPackage(resourceProvider);
-    _addTestPackageDependency('flutter', libFolder.parent.path);
+    addTestPackageDependency('flutter', libFolder.parent.path);
   }
 
   void addMetaPackage() {
@@ -89,7 +93,7 @@
   /// [packageName].
   File addPackageFile(String packageName, String pathInLib, String content) {
     var packagePath = '/.pub-cache/$packageName';
-    _addTestPackageDependency(packageName, packagePath);
+    addTestPackageDependency(packageName, packagePath);
     return newFile('$packagePath/lib/$pathInLib', content: content);
   }
 
@@ -101,6 +105,53 @@
     return source;
   }
 
+  void addTestPackageDependency(String name, String rootPath) {
+    var packagesFile = getFile('/home/test/.packages');
+    var packagesContent = packagesFile.readAsStringSync();
+
+    // Ignore if there is already the same package dependency.
+    if (packagesContent.contains('$name:file://')) {
+      return;
+    }
+
+    rootPath = convertPath(rootPath);
+    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
+
+    packagesFile.writeAsStringSync(packagesContent);
+
+    createAnalysisContexts();
+  }
+
+  /// Create all analysis contexts in `/home`.
+  void createAnalysisContexts() {
+    _analysisContextCollection = AnalysisContextCollectionImpl(
+      includedPaths: [convertPath('/home')],
+      enableIndex: true,
+      fileContentOverlay: fileContentOverlay,
+      resourceProvider: resourceProvider,
+      sdkPath: convertPath('/sdk'),
+    );
+
+    var testPath = convertPath('/home/test');
+    _driver = getDriver(testPath);
+  }
+
+  /// Return the existing analysis context that should be used to analyze the
+  /// given [path], or throw [StateError] if the [path] is not analyzed in any
+  /// of the created analysis contexts.
+  AnalysisContext getContext(String path) {
+    path = convertPath(path);
+    return _analysisContextCollection.contextFor(path);
+  }
+
+  /// Return the existing analysis driver that should be used to analyze the
+  /// given [path], or throw [StateError] if the [path] is not analyzed in any
+  /// of the created analysis contexts.
+  AnalysisDriver getDriver(String path) {
+    DriverBasedAnalysisContext context = getContext(path);
+    return context.driver;
+  }
+
   Future<CompilationUnit> resolveLibraryUnit(Source source) async {
     var resolveResult = await session.getResolvedUnit(source.fullName);
     return resolveResult.unit;
@@ -116,7 +167,7 @@
 test:file:///home/test/lib
 ''');
 
-    _createDriver();
+    createAnalysisContexts();
   }
 
   void setupResourceProvider() {}
@@ -129,38 +180,7 @@
   /// Update `/home/test/pubspec.yaml` and create the driver.
   void updateTestPubspecFile(String content) {
     newFile(testPubspecPath, content: content);
-    _createDriver();
-  }
-
-  void _addTestPackageDependency(String name, String rootPath) {
-    var packagesFile = getFile('/home/test/.packages');
-    var packagesContent = packagesFile.readAsStringSync();
-
-    // Ignore if there is already the same package dependency.
-    if (packagesContent.contains('$name:file://')) {
-      return;
-    }
-
-    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
-
-    packagesFile.writeAsStringSync(packagesContent);
-
-    _createDriver();
-  }
-
-  void _createDriver() {
-    var collection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath('/home')],
-      enableIndex: true,
-      fileContentOverlay: fileContentOverlay,
-      resourceProvider: resourceProvider,
-      sdkPath: convertPath('/sdk'),
-    );
-
-    var testPath = convertPath('/home/test');
-    DriverBasedAnalysisContext context = collection.contextFor(testPath);
-
-    _driver = context.driver;
+    createAnalysisContexts();
   }
 }
 
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 450bc7e..1ff780c 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
@@ -7,10 +7,12 @@
 import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:test/test.dart';
 
 import '../../../../abstract_single_unit.dart';
@@ -26,6 +28,11 @@
   /// Return the kind of assist expected by this class.
   AssistKind get kind;
 
+  /// The workspace in which fixes contributor operates.
+  ChangeWorkspace get workspace {
+    return DartChangeWorkspace([session]);
+  }
+
   void assertExitPosition({String before, String after}) {
     Position exitPosition = _change.selection;
     expect(exitPosition, isNotNull);
@@ -142,6 +149,7 @@
 
   Future<List<Assist>> _computeAssists() async {
     var context = new DartAssistContextImpl(
+      workspace,
       testAnalysisResult,
       _offset,
       _length,
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 381e803..0dc747a 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
@@ -20,11 +20,11 @@
   AssistKind get kind => DartAssistKind.CONVERT_PART_OF_TO_URI;
 
   test_nonSibling() async {
-    addSource('/pkg/lib/foo.dart', '''
+    addSource('/home/test/lib/foo.dart', '''
 library foo;
 part 'src/bar.dart';
 ''');
-    testFile = convertPath('/pkg/lib/src/bar.dart');
+    testFile = convertPath('/home/test/lib/src/bar.dart');
     await resolveTestUnit('''
 part of foo;
 ''');
@@ -34,11 +34,11 @@
   }
 
   test_sibling() async {
-    addSource('/pkg/foo.dart', '''
+    addSource('/home/test/lib/foo.dart', '''
 library foo;
 part 'bar.dart';
 ''');
-    testFile = convertPath('/pkg/bar.dart');
+    testFile = convertPath('/home/test/lib/bar.dart');
     await resolveTestUnit('''
 part of foo;
 ''');
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 7e4dbdf..b66930d 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
@@ -2,7 +2,9 @@
 // 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:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -11,6 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AddMissingParameterRequiredTest);
+    defineReflectiveTests(AddMissingParameterRequiredTest_Workspace);
   });
 }
 
@@ -140,3 +143,59 @@
 ''');
   }
 }
+
+@reflectiveTest
+class AddMissingParameterRequiredTest_Workspace
+    extends AddMissingParameterRequiredTest {
+  ChangeWorkspace _workspace;
+
+  @override
+  ChangeWorkspace get workspace {
+    return _workspace ?? super.workspace;
+  }
+
+  test_function_inPackage_inWorkspace() async {
+    newFile('/home/aaa/lib/a.dart', content: 'void test() {}');
+    addTestPackageDependency('aaa', '/home/aaa');
+
+    _workspace = DartChangeWorkspace([
+      session,
+      getContext('/home/aaa').currentSession,
+    ]);
+
+    await resolveTestUnit('''
+import 'package:aaa/a.dart';
+
+main() {
+  test(42);
+}
+''');
+
+    await assertHasFix(
+      'void test(int i) {}',
+      target: '/home/aaa/lib/a.dart',
+    );
+  }
+
+  test_function_inPackage_outsideWorkspace() async {
+    addPackageFile('bbb', 'b.dart', 'void test() {}');
+
+    await resolveTestUnit('''
+import 'package:bbb/b.dart';
+
+main() {
+  test(42);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_method_inSdk() async {
+    await resolveTestUnit('''
+main() {
+  42.abs(true);
+}
+''');
+    await assertNoFix();
+  }
+}
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 76cc4ce..e9b5fa2 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
@@ -5,12 +5,14 @@
 import 'dart:async';
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError;
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test/test.dart';
 
@@ -54,6 +56,11 @@
   /// Return the kind of fixes being tested by this test class.
   FixKind get kind;
 
+  /// The workspace in which fixes contributor operates.
+  ChangeWorkspace get workspace {
+    return DartChangeWorkspace([session]);
+  }
+
   Future<void> assertHasFix(String expected,
       {bool Function(AnalysisError) errorFilter,
       int length,
@@ -213,7 +220,7 @@
 
   /// Computes fixes for the given [error] in [testUnit].
   Future<List<Fix>> _computeFixes(AnalysisError error) async {
-    var context = new DartFixContextImpl(testAnalysisResult, error);
+    var context = new DartFixContextImpl(workspace, testAnalysisResult, error);
     return await new DartFixContributor().computeFixes(context);
   }
 
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 2b61d17..298c22c 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -66,6 +66,10 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     FileEditBuilderImpl builder = await createFileEditBuilder(path);
+    if (builder == null) {
+      return;
+    }
+
     buildFileEdit(builder);
     if (builder.hasEdits) {
       _change.addFileEdit(builder.fileEdit);
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 8a9eba3..d1ab672 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -21,6 +21,7 @@
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:charcode/ascii.dart';
 
@@ -30,14 +31,17 @@
 class DartChangeBuilderImpl extends ChangeBuilderImpl
     implements DartChangeBuilder {
   /**
-   * The analysis session in which the files being edited were analyzed.
+   * The analysis session in which the files are analyzed and edited.
    */
-  final AnalysisSession session;
+  final ChangeWorkspace workspace;
 
   /**
    * Initialize a newly created change builder.
    */
-  DartChangeBuilderImpl(this.session);
+  DartChangeBuilderImpl(AnalysisSession session)
+      : this.forWorkspace(_SingleSessionWorkspace(session));
+
+  DartChangeBuilderImpl.forWorkspace(this.workspace);
 
   @override
   Future<void> addFileEdit(
@@ -54,13 +58,19 @@
   Future<DartFileEditBuilderImpl> createFileEditBuilder(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
+
+    if (!workspace.containsFile(path)) {
+      return null;
+    }
+
+    var session = workspace.getSession(path);
     ResolvedUnitResult result = await session.getResolvedUnit(path);
     ResultState state = result?.state ?? ResultState.INVALID_FILE_TYPE;
     if (state == ResultState.INVALID_FILE_TYPE) {
       throw new AnalysisException('Cannot analyze "$path"');
     }
     int timeStamp = state == ResultState.VALID ? 0 : -1;
-    return new DartFileEditBuilderImpl(this, path, timeStamp, result.unit);
+    return DartFileEditBuilderImpl(this, path, timeStamp, session, result.unit);
   }
 }
 
@@ -1096,6 +1106,11 @@
 class DartFileEditBuilderImpl extends FileEditBuilderImpl
     implements DartFileEditBuilder {
   /**
+   * The session that analyzed this file.
+   */
+  final AnalysisSession session;
+
+  /**
    * The compilation unit to which the code will be added.
    */
   final CompilationUnit unit;
@@ -1122,7 +1137,7 @@
    * the given [path] and [timeStamp], and the given fully resolved [unit].
    */
   DartFileEditBuilderImpl(DartChangeBuilderImpl changeBuilder, String path,
-      int timeStamp, this.unit)
+      int timeStamp, this.session, this.unit)
       : libraryElement = unit.declaredElement.library,
         super(changeBuilder, path, timeStamp);
 
@@ -1404,7 +1419,6 @@
    */
   String _getLibraryUriText(Uri what) {
     if (what.scheme == 'file') {
-      var session = (changeBuilder as DartChangeBuilderImpl).session;
       var pathContext = session.resourceProvider.pathContext;
       String whatPath = pathContext.fromUri(what);
       String libraryPath = libraryElement.source.fullName;
@@ -1539,3 +1553,24 @@
         other.prefix == prefix;
   }
 }
+
+/// Workspace that wraps a single [AnalysisSession].
+class _SingleSessionWorkspace extends ChangeWorkspace {
+  final AnalysisSession session;
+
+  _SingleSessionWorkspace(this.session);
+
+  @override
+  bool containsFile(String path) {
+    var analysisContext = session.analysisContext;
+    return analysisContext.contextRoot.isAnalyzed(path);
+  }
+
+  @override
+  AnalysisSession getSession(String path) {
+    if (containsFile(path)) {
+      return session;
+    }
+    throw StateError('Not in a context root: $path');
+  }
+}
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 90b4794..25932c0 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -26,6 +26,8 @@
 abstract class DartChangeBuilder implements ChangeBuilder {
   /**
    * Initialize a newly created change builder.
+   *
+   * TODO(scheglov) Replace this constructor with using workspace.
    */
   factory DartChangeBuilder(AnalysisSession session) = DartChangeBuilderImpl;
 
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart
new file mode 100644
index 0000000..a0f4469
--- /dev/null
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, 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:analyzer/dart/analysis/session.dart';
+
+/// Information about the workspace in which change builders operate.
+abstract class ChangeWorkspace {
+  /// Return `true` if the file with the given [path] is in a context root.
+  bool containsFile(String path);
+
+  /// Return the session that should analyze the given [path], or throw
+  /// [StateError] if the [path] does not belong to a context root.
+  AnalysisSession getSession(String path);
+}
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 34ec98d..1ed1d1d 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
@@ -63,7 +63,7 @@
 class DartChangeBuilderImplTest extends AbstractContextTest
     with BuilderTestMixin {
   test_createFileEditBuilder() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'library test;');
     DartChangeBuilderImpl builder = newBuilder();
     DartFileEditBuilderImpl fileEditBuilder =
@@ -390,7 +390,7 @@
   }
 
   test_writeClassDeclaration_interfaces() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
@@ -407,7 +407,7 @@
   }
 
   test_writeClassDeclaration_isAbstract() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -422,7 +422,7 @@
   }
 
   test_writeClassDeclaration_memberWriter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -439,7 +439,7 @@
   }
 
   test_writeClassDeclaration_mixins_noSuperclass() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
@@ -456,7 +456,7 @@
   }
 
   test_writeClassDeclaration_mixins_superclass() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {} class B {}');
     DartType typeA = await _getType(path, 'A');
     DartType typeB = await _getType(path, 'B');
@@ -474,7 +474,7 @@
   }
 
   test_writeClassDeclaration_nameGroupName() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -496,7 +496,7 @@
   }
 
   test_writeClassDeclaration_superclass() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class B {}');
     DartType typeB = await _getType(path, 'B');
 
@@ -519,7 +519,7 @@
   }
 
   test_writeConstructorDeclaration_bodyWriter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class C {}');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -535,7 +535,7 @@
   }
 
   test_writeConstructorDeclaration_fieldNames() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, r'''
 class C {
   final int a;
@@ -554,7 +554,7 @@
   }
 
   test_writeConstructorDeclaration_initializerWriter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class C {}');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -570,7 +570,7 @@
   }
 
   test_writeConstructorDeclaration_parameterWriter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class C {}');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -586,7 +586,7 @@
   }
 
   test_writeFieldDeclaration_initializerWriter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -604,7 +604,7 @@
   }
 
   test_writeFieldDeclaration_isConst() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -619,7 +619,7 @@
   }
 
   test_writeFieldDeclaration_isConst_isFinal() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -635,7 +635,7 @@
   }
 
   test_writeFieldDeclaration_isConst_type() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -652,7 +652,7 @@
   }
 
   test_writeFieldDeclaration_isFinal() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -667,7 +667,7 @@
   }
 
   test_writeFieldDeclaration_isFinal_type() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -684,7 +684,7 @@
   }
 
   test_writeFieldDeclaration_isStatic() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -699,7 +699,7 @@
   }
 
   test_writeFieldDeclaration_nameGroupName() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -724,7 +724,7 @@
   }
 
   test_writeFieldDeclaration_type_typeGroupName() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -750,7 +750,7 @@
   }
 
   test_writeFunctionDeclaration_noReturnType_noParams_body() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
@@ -768,7 +768,7 @@
   }
 
   test_writeFunctionDeclaration_noReturnType_noParams_noBody() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
@@ -791,7 +791,7 @@
   }
 
   test_writeFunctionDeclaration_noReturnType_params_noBody() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
@@ -809,7 +809,7 @@
   }
 
   test_writeFunctionDeclaration_returnType_noParams_noBody() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -834,7 +834,7 @@
   }
 
   test_writeGetterDeclaration_bodyWriter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -852,7 +852,7 @@
   }
 
   test_writeGetterDeclaration_isStatic() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -868,7 +868,7 @@
   }
 
   test_writeGetterDeclaration_nameGroupName() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -893,7 +893,7 @@
   }
 
   test_writeGetterDeclaration_returnType() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -919,7 +919,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_initializer() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -941,7 +941,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_noInitializer() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -968,7 +968,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_noInitializer_const() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -988,7 +988,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_noInitializer_final() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -1008,7 +1008,7 @@
   }
 
   test_writeLocalVariableDeclaration_type_initializer() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -1033,7 +1033,7 @@
   }
 
   test_writeLocalVariableDeclaration_type_noInitializer() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -1063,7 +1063,7 @@
   }
 
   test_writeLocalVariableDeclaration_type_noInitializer_final() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -1093,7 +1093,7 @@
   }
 
   test_writeMixinDeclaration_interfaces() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
@@ -1110,7 +1110,7 @@
   }
 
   test_writeMixinDeclaration_interfacesAndSuperclassConstraints() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {} class B {}');
     DartType typeA = await _getType(path, 'A');
     DartType typeB = await _getType(path, 'B');
@@ -1128,7 +1128,7 @@
   }
 
   test_writeMixinDeclaration_memberWriter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -1145,7 +1145,7 @@
   }
 
   test_writeMixinDeclaration_nameGroupName() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
     DartChangeBuilderImpl builder = newBuilder();
@@ -1167,7 +1167,7 @@
   }
 
   test_writeMixinDeclaration_superclassConstraints() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
@@ -1641,7 +1641,7 @@
   }
 
   test_writeParameter() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -1656,7 +1656,7 @@
   }
 
   test_writeParameter_type() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -1672,7 +1672,7 @@
   }
 
   test_writeParameterMatchingArgument() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 f() {}
 g() {
@@ -1701,7 +1701,7 @@
   }
 
   test_writeParameters_named() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'f(int a, {bool b = false, String c}) {}';
     addSource(path, content);
 
@@ -1723,7 +1723,7 @@
   }
 
   test_writeParameters_positional() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'f(int a, [bool b = false, String c]) {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
@@ -1744,7 +1744,7 @@
   }
 
   test_writeParameters_required() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'f(int i, String s) {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
@@ -1764,7 +1764,7 @@
   }
 
   test_writeParametersMatchingArguments_named() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 f(int i, String s) {
   g(s, index: i);
@@ -1789,7 +1789,7 @@
   }
 
   test_writeParametersMatchingArguments_required() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 f(int i, String s) {
   g(s, i);
@@ -1821,7 +1821,7 @@
 }
 ''');
 
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 import 'a.dart';
 ''';
@@ -1841,10 +1841,10 @@
   }
 
   test_writeReference_topLevel_hasImport_noPrefix() async {
-    String aPath = convertPath('/a.dart');
+    String aPath = convertPath('/home/test/lib/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 import 'a.dart';
 ''';
@@ -1863,10 +1863,10 @@
   }
 
   test_writeReference_topLevel_hasImport_prefix() async {
-    String aPath = convertPath('/a.dart');
+    String aPath = convertPath('/home/test/lib/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 import 'a.dart' as p;
 ''';
@@ -1885,10 +1885,10 @@
   }
 
   test_writeReference_topLevel_noImport() async {
-    String aPath = convertPath('/a.dart');
+    String aPath = convertPath('/home/test/bin/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/bin/test.dart');
     String content = '';
     addSource(path, content);
 
@@ -1907,7 +1907,7 @@
   }
 
   test_writeType_dynamic() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
@@ -1953,7 +1953,7 @@
   }
 
   test_writeType_genericType() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B<E> {}';
     addSource(path, content);
     InterfaceType typeA = await _getType(path, 'A');
@@ -1970,7 +1970,7 @@
   }
 
   test_writeType_groupName() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B extends A {} class C extends B {}';
     addSource(path, content);
     DartType typeC = await _getType(path, 'C');
@@ -1992,7 +1992,7 @@
   }
 
   test_writeType_groupName_addSupertypeProposals() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B extends A {} class C extends B {}';
     addSource(path, content);
     DartType typeC = await _getType(path, 'C');
@@ -2025,7 +2025,7 @@
   }
 
   test_writeType_groupName_invalidType() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A<T> {}';
     addSource(path, content);
 
@@ -2052,7 +2052,7 @@
   }
 
   test_writeType_null() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -2067,8 +2067,8 @@
   }
 
   test_writeType_prefixGenerator() async {
-    String aPath = convertPath('/a.dart');
-    String bPath = convertPath('/b.dart');
+    String aPath = convertPath('/home/test/lib/a.dart');
+    String bPath = convertPath('/home/test/lib/b.dart');
 
     addSource(aPath, r'''
 class A1 {}
@@ -2078,7 +2078,7 @@
 class B {}
 ''');
 
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
@@ -2108,8 +2108,8 @@
     expect(edits, hasLength(2));
     expect(
         edits[0].replacement,
-        equalsIgnoringWhitespace(
-            "import 'a.dart' as _prefix0; import 'b.dart' as _prefix1;"));
+        equalsIgnoringWhitespace("import 'package:test/a.dart' as _prefix0; "
+            "import 'package:test/b.dart' as _prefix1;"));
     expect(
         edits[1].replacement,
         equalsIgnoringWhitespace(
@@ -2117,7 +2117,7 @@
   }
 
   test_writeType_required_dynamic() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
@@ -2139,7 +2139,7 @@
   }
 
   test_writeType_required_notNull() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -2155,7 +2155,7 @@
   }
 
   test_writeType_required_null() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -2170,7 +2170,7 @@
   }
 
   test_writeType_simpleType() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -2195,7 +2195,7 @@
   }
 
   test_writeTypes_empty() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -2210,7 +2210,7 @@
   }
 
   test_writeTypes_noPrefix() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -2227,7 +2227,7 @@
   }
 
   test_writeTypes_null() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
@@ -2242,7 +2242,7 @@
   }
 
   test_writeTypes_prefix() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
@@ -2261,7 +2261,7 @@
 
   Future<void> _assertImportLibrary(
       String initialCode, List<String> newUris, String expectedCode) async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, initialCode);
     DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
@@ -2294,7 +2294,7 @@
     String displayText,
     SourceRange selection,
   }) async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, content);
 
     TypeSystem typeSystem = await session.typeSystem;
@@ -2327,7 +2327,7 @@
   }
 
   Future<void> _assertWriteType(String typeCode, {String declarations}) async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = (declarations ?? '') + '$typeCode v;';
     addSource(path, content);
 
@@ -2368,7 +2368,7 @@
   }
 
   test_convertFunctionFromSyncToAsync_closure() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '''var f = () {}''');
 
     CompilationUnit unit = (await driver.getResult(path))?.unit;
@@ -2389,7 +2389,7 @@
   }
 
   test_convertFunctionFromSyncToAsync_topLevelFunction() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
     CompilationUnit unit = (await driver.getResult(path))?.unit;
@@ -2408,7 +2408,7 @@
   }
 
   test_createEditBuilder() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'library test;');
     DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
@@ -2425,7 +2425,7 @@
   }
 
   test_replaceTypeWithFuture() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
     CompilationUnit unit = (await driver.getResult(path))?.unit;
@@ -2446,7 +2446,7 @@
 @reflectiveTest
 class DartLinkedEditBuilderImplTest extends AbstractContextTest {
   test_addSuperTypesAsSuggestions() async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '''
 class A {}
 class B extends A {}