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 {}