Add test and implementation for package: uris
Change-Id: Ibf114d83cade42ced7601befafec8a7e7c9f4bc7
Reviewed-on: https://dart-review.googlesource.com/c/78985
Commit-Queue: Danny Tuppeny <dantup@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@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 d5d1853..d2e3c69 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -127,19 +127,27 @@
*/
String _computeNewUri(SourceReference reference) {
String refDir = pathContext.dirname(reference.file);
- // try to keep package: URI
- // if (_isPackageReference(reference)) {
- // Source newSource = new NonExistingSource(
- // newFile, pathos.toUri(newFile), UriKind.FILE_URI);
- // Uri restoredUri = context.sourceFactory.restoreUri(newSource);
- // if (restoredUri != null) {
- // return restoredUri.toString();
- // }
- // }
- // if no package: URI, prepare relative
+ // Try to keep package: URI
+ if (_isPackageReference(reference)) {
+ Source newSource = new NonExistingSource(
+ newFile, pathos.toUri(newFile), UriKind.FILE_URI);
+ Uri restoredUri = driver.sourceFactory.restoreUri(newSource);
+ if (restoredUri != null) {
+ return restoredUri.toString();
+ }
+ }
return _getRelativeUri(newFile, refDir);
}
+ final packagePrefixedStringPattern = new RegExp(r'''^r?['"]+package:''');
+ bool _isPackageReference(SourceReference reference) {
+ final Source source = reference.element.source;
+ final String quotedImportUri = source.contents.data.substring(
+ reference.range.offset,
+ reference.range.offset + reference.range.length);
+ return packagePrefixedStringPattern.hasMatch(quotedImportUri);
+ }
+
String _getRelativeUri(String path, String from) {
String uri = pathContext.relative(path, from: from);
List<String> parts = pathContext.split(uri);
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 41d498f..56e4078 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -7,6 +7,7 @@
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/correction/status.dart';
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analyzer/file_system/file_system.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -22,13 +23,6 @@
class MoveFileTest extends RefactoringTest {
MoveFileRefactoring refactoring;
- @failingTest
- test_dart_uris_are_unmodified() async {
- // TODO(dantup): See _computeNewUri implementation which currently only
- // handles relative + package: urls (package url handling is also incomplete)
- fail('Not yet implemented/tested');
- }
-
test_file_containing_imports_exports_parts() async {
String pathA = '/project/000/1111/a.dart';
String pathB = '/project/000/1111/b.dart';
@@ -110,6 +104,26 @@
assertNoFileChange(testFile);
}
+ test_file_imported_with_package_uri() async {
+ // Set up package uri resolution for local package.
+ packageMap['my_package'] = [getFolder('/project/lib')];
+ configureDriver();
+
+ String pathA = '/project/000/1111/a.dart';
+ testFile = '/project/lib/test.dart';
+ addSource(pathA, '''
+ import 'package:my_package/test.dart';
+ ''');
+ addTestSource('');
+ // perform refactoring
+ _createRefactoring('/project/lib/222/new_name.dart');
+ await _assertSuccessfulRefactoring();
+ assertFileChangeResult(pathA, '''
+ import 'package:my_package/222/new_name.dart';
+ ''');
+ assertNoFileChange(testFile);
+ }
+
@failingTest
test_file_referenced_by_multiple_libraries() async {
// This test fails because the search index doesn't support multiple uris for