Skip to content

Commit 5e6a681

Browse files
FMorschelCommit Queue
authored andcommitted
Fix hover import prefix
Fixes #32735 Change-Id: I6830b61fe554065f9ec6e87f2ac24dfaffd67f35 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/390960 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]> Auto-Submit: Felipe Morschel <[email protected]>
1 parent d746c5f commit 5e6a681

File tree

4 files changed

+138
-11
lines changed

4 files changed

+138
-11
lines changed

pkg/analysis_server/lib/src/computer/computer_hover.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ class DartUnitHoverComputer {
5757
node is VariablePattern ||
5858
node is PatternFieldName ||
5959
node is DartPattern ||
60-
(node is LibraryDirective && node.name2 == null)) {
60+
(node is LibraryDirective && node.name2 == null) ||
61+
(node is SimpleIdentifier && node.parent is ImportDirective) ||
62+
node is ImportPrefixReference) {
6163
var range = _hoverRange(node, locationEntity);
6264
var hover = HoverInformation(range.offset, range.length);
6365
// element
@@ -198,6 +200,7 @@ class DartUnitHoverComputer {
198200
PatternFieldName() => node.name,
199201
WildcardPattern() => node.name,
200202
LibraryDirective() => node.libraryKeyword,
203+
ImportPrefixReference() => node.name,
201204
_ => null,
202205
};
203206
}

pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,6 @@ class HoverHandler
5959
return null;
6060
}
6161

62-
// Import prefix tooltips are not useful currently.
63-
// https://github.com/dart-lang/sdk/issues/32735
64-
if (hover.elementKind == 'import prefix') {
65-
return null;
66-
}
67-
6862
var content = StringBuffer();
6963
const divider = '---';
7064

pkg/analysis_server/test/lsp/hover_test.dart

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,99 @@ Type: `String`''';
276276
);
277277
}
278278

279+
Future<void> test_import_alias_dart() async {
280+
var content = '''
281+
import 'dart:core' as [!l^ib!];
282+
''';
283+
var expected = '''
284+
```dart
285+
'lib' is an import prefix for 'dart:core'
286+
```
287+
*package:test/main.dart*''';
288+
await assertStringContents(content, equals(expected));
289+
}
290+
291+
Future<void> test_import_alias_interpolation() async {
292+
var content = '''
293+
// ignore: uri_with_interpolation
294+
import '\$bug.dart' as [!l^ib!];
295+
const bug = 'bug';
296+
''';
297+
var expected = '''
298+
```dart
299+
'lib' is an import prefix for '<no-relative-uri>'
300+
```
301+
*package:test/main.dart*''';
302+
await assertStringContents(content, equals(expected));
303+
}
304+
305+
Future<void> test_import_alias_multiple_equal() async {
306+
newFile('/home/my_project/lib/lib.dart', '''
307+
/// This is a string.
308+
library my.lib;
309+
''');
310+
var content = '''
311+
import 'dart:math' as lib;
312+
import 'lib.dart' as [!l^ib!];
313+
''';
314+
var expected = '''
315+
```dart
316+
'lib' is an import prefix for:
317+
- 'dart:math'
318+
- 'lib.dart'
319+
```
320+
*package:test/main.dart*''';
321+
await assertStringContents(content, equals(expected));
322+
}
323+
324+
Future<void> test_import_alias_package() async {
325+
newFile('/home/my_project/lib/lib.dart', '''
326+
/// This is a string.
327+
library my.lib;
328+
''');
329+
var content = '''
330+
import 'package:test/lib.dart' as [!l^ib!];
331+
''';
332+
var expected = '''
333+
```dart
334+
'lib' is an import prefix for 'package:test/lib.dart'
335+
```
336+
*package:test/main.dart*''';
337+
await assertStringContents(content, equals(expected));
338+
}
339+
340+
Future<void> test_import_alias_project() async {
341+
newFile('/home/my_project/lib/lib.dart', '''
342+
''');
343+
var content = '''
344+
import 'lib.dart' as [!l^ib!];
345+
''';
346+
var expected = '''
347+
```dart
348+
'lib' is an import prefix for 'lib.dart'
349+
```
350+
*package:test/main.dart*''';
351+
await assertStringContents(content, equals(expected));
352+
}
353+
354+
Future<void> test_import_prefix() async {
355+
newFile('/home/my_project/lib/lib.dart', '''
356+
/// This is a string.
357+
library my.lib;
358+
class C {}
359+
''');
360+
var content = '''
361+
import 'lib.dart' as lib;
362+
[!li^b!].C? c;
363+
''';
364+
var expected = '''
365+
```dart
366+
'lib' is an import prefix for 'lib.dart'
367+
```
368+
*package:test/main.dart*''';
369+
await assertStringContents(content, equals(expected));
370+
}
371+
279372
Future<void> test_localVariable_wildcard() async {
280373
var content = '''
281374
f() {

pkg/analyzer/lib/src/dart/element/display_string_builder.dart

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,13 +252,41 @@ class ElementDisplayStringBuilder {
252252
}
253253

254254
void writePrefixElement(PrefixElementImpl element) {
255-
_write('as ');
256-
_write(element.displayName);
255+
var libraryImports = element.imports;
256+
if (libraryImports.isEmpty) {
257+
_write('as ');
258+
_write(element.displayName);
259+
return;
260+
}
261+
_write("'${element.displayName}'");
262+
_write(' is an import prefix for');
263+
if (libraryImports case List(length: 1, :var first)) {
264+
_write(" '${first.libraryName}'");
265+
return;
266+
}
267+
_write(':');
268+
for (var libraryImport in libraryImports) {
269+
_write("\n- '${libraryImport.libraryName}'");
270+
}
257271
}
258272

259273
void writePrefixElement2(PrefixElementImpl2 element) {
260-
_write('as ');
261-
_write(element.displayName);
274+
var libraryImports = element.imports;
275+
if (element.imports.isEmpty) {
276+
_write('as ');
277+
_write(element.displayName);
278+
return;
279+
}
280+
_write("'${element.displayName}'");
281+
_write(' is an import prefix for');
282+
if (libraryImports case List(length: 1, :var first)) {
283+
_write(" '${first.libraryName}'");
284+
return;
285+
}
286+
_write(':');
287+
for (var libraryImport in libraryImports) {
288+
_write("\n- '${libraryImport.libraryName}'");
289+
}
262290
}
263291

264292
void writeRecordType(RecordType type) {
@@ -609,3 +637,12 @@ class ElementDisplayStringBuilder {
609637
}
610638

611639
enum _WriteFormalParameterKind { requiredPositional, optionalPositional, named }
640+
641+
extension on LibraryImportElement {
642+
String get libraryName {
643+
if (uri case DirectiveUriWithRelativeUriString uri) {
644+
return uri.relativeUriString;
645+
}
646+
return '<no-relative-uri>';
647+
}
648+
}

0 commit comments

Comments
 (0)