Issue 36667. Check for unresolved URI in getLibraryByUri().

R=brianwilkerson@google.com

Bug: https://github.com/dart-lang/sdk/issues/36667
Change-Id: If35719b350c2f26edbb7cbe42f51af896aa41fe7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99713
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 3951541..ad3b6d2 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -19,6 +19,7 @@
 import 'package:analysis_server/src/services/completion/token_details/token_detail_builder.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/element/element.dart' as analyzer;
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -202,9 +203,20 @@
         var libraryPath = fileElement.element.librarySource.fullName;
 
         var resolvedLibrary = await session.getResolvedLibrary(libraryPath);
-        var requestedLibraryElement = await session.getLibraryByUri(
-          library.uriStr,
-        );
+
+        analyzer.LibraryElement requestedLibraryElement;
+        try {
+          requestedLibraryElement = await session.getLibraryByUri(
+            library.uriStr,
+          );
+        } on ArgumentError catch (e) {
+          server.sendResponse(Response.invalidParameter(
+            request,
+            'uri',
+            'Invalid URI: ${library.uriStr}\n$e',
+          ));
+          return;
+        }
 
         var requestedElement =
             requestedLibraryElement.exportNamespace.get(requestedName);
@@ -344,7 +356,7 @@
             request,
             'params.offset',
             'Expected offset between 0 and source length inclusive,'
-            ' but found $offset'));
+                ' but found $offset'));
         return;
       }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 5458c53..e7eff04 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -745,12 +745,18 @@
    * [uri], which is either resynthesized from the provided external summary
    * store, or built for a file to which the given [uri] is resolved.
    *
+   * Throw [ArgumentError] if the [uri] does not correspond to a file.
+   *
    * Throw [ArgumentError] if the [uri] corresponds to a part.
    */
   Future<LibraryElement> getLibraryByUri(String uri) async {
     var uriObj = Uri.parse(uri);
     var file = _fsState.getFileForUri(uriObj);
 
+    if (file.isUnresolved) {
+      throw ArgumentError('$uri cannot be resolved to a file.');
+    }
+
     if (file.isExternalLibrary) {
       return _createLibraryContext(file).getLibraryElement(file);
     }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 5cfbae5..64ef688 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1527,6 +1527,12 @@
     expect(coreLibrary.getType('Object'), isNotNull);
   }
 
+  test_getLibraryByUri_unresolvedUri() async {
+    expect(() async {
+      await driver.getLibraryByUri('package:foo/foo.dart');
+    }, throwsArgumentError);
+  }
+
   test_getParsedLibrary_external() async {
     var a1 = convertPath('/aaa/lib/a1.dart');
     var a2 = convertPath('/aaa/lib/a2.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 555c2ec..055a4c0 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -73,6 +73,12 @@
     expect(library.getType('C'), isNull);
   }
 
+  test_getLibraryByUri_unresolvedUri() async {
+    expect(() async {
+      await session.getLibraryByUri('package:foo/foo.dart');
+    }, throwsArgumentError);
+  }
+
   test_getParsedLibrary() async {
     newFile(testPath, content: r'''
 class A {}