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