MOVE_FILE refactor review tweaks
- Use the correct driver that contains this file
- Return a fatal error if we don't have exactly one driver
- Add a workspace method to filter drivers
Bug: https://github.com/dart-lang/sdk/issues/33605
Change-Id: I4ae3249616d1788283c29bb3777fe819d55b50e5
Reviewed-on: https://dart-review.googlesource.com/63948
Commit-Queue: Danny Tuppeny <dantup@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 58adda3..7b871e0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -11,6 +11,7 @@
import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -25,6 +26,7 @@
final pathos.Context pathContext;
final RefactoringWorkspace workspace;
final Source source;
+ AnalysisDriver driver;
String oldFile;
String newFile;
@@ -42,39 +44,33 @@
String get refactoringName => 'Move File';
@override
- Future<RefactoringStatus> checkFinalConditions() {
- RefactoringStatus result = new RefactoringStatus();
- return new Future.value(result);
+ Future<RefactoringStatus> checkFinalConditions() async {
+ final drivers = workspace.driversContaining(newFile);
+ if (drivers.length != 1) {
+ return new RefactoringStatus.fatal(
+ 'Unable to find a single driver for $newFile.');
+ }
+ driver = drivers.first;
+ return new RefactoringStatus();
}
@override
- Future<RefactoringStatus> checkInitialConditions() {
- RefactoringStatus result = new RefactoringStatus();
- return new Future.value(result);
+ Future<RefactoringStatus> checkInitialConditions() async {
+ return new RefactoringStatus();
}
@override
Future<SourceChange> createChange() async {
- var changeBuilder =
- new DartChangeBuilder(workspace.drivers.first.currentSession);
-
- final drivers =
- workspace.drivers.where((d) => d.contextRoot.containsFile(newFile));
- if (drivers.length != 1) {
- // TODO(dantup): What to do in this case? Should we throw?
- return changeBuilder.sourceChange;
- }
-
- final driver = drivers.first; // The above guarantees there's exactly one.
- final result = await driver.getResult(oldFile);
- final element = result?.unit?.element;
+ var changeBuilder = new DartChangeBuilder(driver.currentSession);
+ final result = await driver.getUnitElement(oldFile);
+ final element = result?.element;
if (element == null) {
return changeBuilder.sourceChange;
}
final library = element.library;
// If this element is a library, update outgoing references inside the file.
- if (library != null && element == library.definingCompilationUnit) {
+ if (element == library.definingCompilationUnit) {
await changeBuilder.addFileEdit(library.source.fullName, (builder) {
final oldDir = pathContext.dirname(oldFile);
final newDir = pathContext.dirname(newFile);
@@ -86,7 +82,7 @@
// Update incoming references to this file
List<SearchMatch> matches =
- await workspace.searchEngine.searchReferences(result.unit.element);
+ await workspace.searchEngine.searchReferences(element);
List<SourceReference> references = getSourceReferences(matches);
for (SourceReference reference in references) {
await changeBuilder.addFileEdit(reference.file, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 6b5c4904..5c14cf7 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -427,6 +427,15 @@
return driver.contextRoot.containsFile(path);
});
}
+
+ /**
+ * Returns the drivers that have [path] in a context root.
+ */
+ Iterable<AnalysisDriver> driversContaining(String path) {
+ return drivers.where((driver) {
+ return driver.contextRoot.containsFile(path);
+ });
+ }
}
/**