Skip to content

Commit d9c681e

Browse files
bwilkersonCommit Queue
authored andcommitted
Provide better hovers for super formal parameters
Change-Id: I9131eb0ee516e79580f530e6279ec1da08dde7e6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/434220 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 1bf83ec commit d9c681e

File tree

2 files changed

+74
-5
lines changed

2 files changed

+74
-5
lines changed

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

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ class DartDocumentationComputer {
1717
Element elementBeingDocumented, {
1818
bool includeSummary = false,
1919
}) {
20-
var element = switch (elementBeingDocumented) {
21-
FieldFormalParameterElement() => elementBeingDocumented.field2,
22-
FormalParameterElement() => elementBeingDocumented.enclosingElement,
23-
_ => elementBeingDocumented,
24-
};
20+
var element = elementBeingDocumented.elementWithDocumentation;
2521
if (element == null) {
2622
// This can happen when the code is invalid, such as having an
2723
// initializing formal parameter for a field that does not exist.
@@ -100,3 +96,29 @@ class DartDocumentationComputer {
10096
/// The type of documentation the user prefers to see in hovers and other
10197
/// related displays in their editor.
10298
enum DocumentationPreference { none, summary, full }
99+
100+
extension on Element {
101+
/// The element whose documentation should be used when showing documentation
102+
/// for this element.
103+
Element? get elementWithDocumentation {
104+
var self = this;
105+
if (self is FieldFormalParameterElement) {
106+
return self.field2;
107+
} else if (self is SuperFormalParameterElement) {
108+
// Treat a super formal parameter like a field formal parameter if it's
109+
// eventually assigned to a field, but as any other formal parameter if it
110+
// isn't.
111+
var superParameter = self.superConstructorParameter2;
112+
while (superParameter is SuperFormalParameterElement) {
113+
superParameter = superParameter.superConstructorParameter2;
114+
}
115+
if (superParameter is FieldFormalParameterElement) {
116+
return superParameter.field2;
117+
}
118+
return self.enclosingElement;
119+
} else if (self is FormalParameterElement) {
120+
return self.enclosingElement;
121+
}
122+
return this;
123+
}
124+
}

pkg/analysis_server/test/lsp/hover_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,6 +1120,53 @@ This is a string.''';
11201120
await assertStringContents(content, equals(expected));
11211121
}
11221122

1123+
Future<void> test_superFormalParameter_fromField() async {
1124+
var content = '''
1125+
class A {
1126+
/// The field a.
1127+
int a;
1128+
1129+
A(this.a);
1130+
}
1131+
1132+
class B extends A {
1133+
B(super.a);
1134+
}
1135+
1136+
class C extends B {
1137+
C(super.[!^a!]);
1138+
}
1139+
''';
1140+
var expected = '''
1141+
```dart
1142+
int a
1143+
```
1144+
Type: `int`
1145+
1146+
---
1147+
The field a.''';
1148+
await assertStringContents(content, equals(expected));
1149+
}
1150+
1151+
Future<void> test_superFormalParameter_notFromChainedConstructor() async {
1152+
var content = '''
1153+
class A {
1154+
/// The constructor a.
1155+
A(int a);
1156+
}
1157+
1158+
class B extends A {
1159+
B(super.[!^a!]);
1160+
}
1161+
''';
1162+
var expected = '''
1163+
```dart
1164+
int a
1165+
```
1166+
Type: `int`''';
1167+
await assertStringContents(content, equals(expected));
1168+
}
1169+
11231170
Future<void> test_topLevelFunction_underscore() async {
11241171
var content = '''
11251172
int _() => 1;

0 commit comments

Comments
 (0)