Skip to content

Commit 6c3da17

Browse files
FMorschelCommit Queue
authored andcommitted
[DAS] Fixes values suggestion without enum name
Fixes: #61161 Change-Id: I6938d0ce60aaf50e71e4f1df644217f0344a89d6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/444441 Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Auto-Submit: Felipe Morschel <[email protected]>
1 parent 0d2bbcb commit 6c3da17

File tree

5 files changed

+111
-2
lines changed

5 files changed

+111
-2
lines changed

pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,7 +1349,8 @@ class DeclarationHelper {
13491349
var referencingInterface = _referencingInterfaceFor(element);
13501350

13511351
for (var accessor in element.getters) {
1352-
if (!accessor.isSynthetic && (!mustBeStatic || accessor.isStatic)) {
1352+
if ((!accessor.isSynthetic || accessor.isEnumValues) &&
1353+
(!mustBeStatic || accessor.isStatic)) {
13531354
_suggestProperty(
13541355
accessor: accessor,
13551356
referencingInterface: referencingInterface,
@@ -2253,7 +2254,8 @@ class DeclarationHelper {
22532254
void _suggestStaticField(FieldElement element, ImportData? importData) {
22542255
if (!element.isStatic ||
22552256
(mustBeAssignable && !(element.isFinal || element.isConst)) ||
2256-
(mustBeConstant && !element.isConst)) {
2257+
(mustBeConstant && !element.isConst) ||
2258+
(!element.isEnumConstant && element.enclosingElement is EnumElement)) {
22572259
return;
22582260
}
22592261
var contextType = request.contextType;
@@ -2724,6 +2726,18 @@ class DeclarationHelper {
27242726
}
27252727
}
27262728

2729+
extension on GetterElement {
2730+
/// Whether this getter is the `values` getter for an enum.
2731+
///
2732+
/// Since we have `values_declaration_in_enum` this is a special case that
2733+
/// will always be valid.
2734+
bool get isEnumValues =>
2735+
name == 'values' &&
2736+
isStatic &&
2737+
isSynthetic &&
2738+
enclosingElement is EnumElement;
2739+
}
2740+
27272741
extension on Element {
27282742
/// Whether this element is visible within the [referencingLibrary].
27292743
///

pkg/analysis_server/test/lsp/completion_dart_test.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ $lintsYaml
105105

106106
@reflectiveTest
107107
class CompletionDocumentationResolutionTest extends AbstractCompletionTest {
108+
Future<void> assertNoCompletionItem(String label) async {
109+
var completions = await getCompletion(mainFileUri, code.position.position);
110+
expect(completions.where((c) => c.label == label), isEmpty);
111+
}
112+
108113
Future<CompletionItem> getCompletionItem(String label) async {
109114
var completions = await getCompletion(mainFileUri, code.position.position);
110115
return completions.singleWhere((c) => c.label == label);
@@ -274,6 +279,47 @@ void f() {
274279
expectDocumentation(resolved, contains('Enum Member.'));
275280
}
276281

282+
Future<void> test_enum_values() async {
283+
content = '''
284+
void f() {
285+
print(va^)
286+
}
287+
288+
enum MyEnum {
289+
value,
290+
}
291+
''';
292+
293+
await initializeServer();
294+
295+
await getCompletionItem('MyEnum.value');
296+
await assertNoCompletionItem('MyEnum.values');
297+
await assertNoCompletionItem('values');
298+
}
299+
300+
Future<void> test_enum_values_insideEnum() async {
301+
content = '''
302+
enum E {value}
303+
enum MyEnum {
304+
value;
305+
306+
void f() {
307+
print(^);
308+
}
309+
}
310+
''';
311+
312+
await initializeServer();
313+
314+
await getCompletionItem('index');
315+
await getCompletionItem('name');
316+
await getCompletionItem('value');
317+
await getCompletionItem('values');
318+
await getCompletionItem('E.value');
319+
await assertNoCompletionItem('MyEnum.values');
320+
await assertNoCompletionItem('E.values');
321+
}
322+
277323
Future<void> test_innerPatternKeyword() async {
278324
content = '''
279325
class A {

pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ enum E {
2929
replacement
3030
left: 1
3131
suggestions
32+
values
33+
kind: field
3234
a1
3335
kind: enumConstant
3436
a2
@@ -54,6 +56,8 @@ replacement
5456
suggestions
5557
a1
5658
kind: getter
59+
values
60+
kind: field
5761
''');
5862
}
5963

@@ -73,6 +77,8 @@ enum E {
7377
replacement
7478
left: 1
7579
suggestions
80+
values
81+
kind: field
7682
a1
7783
kind: methodInvocation
7884
''');

pkg/analysis_server/test/services/completion/dart/location/dot_shorthand_property_access_test.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,27 @@ suggestions
165165
''');
166166
}
167167

168+
Future<void> test_enum_static() async {
169+
allowedIdentifiers = {'red', 'other'};
170+
await computeSuggestions('''
171+
enum E {
172+
red;
173+
174+
static const other = red;
175+
}
176+
void f() {
177+
E e = .^
178+
}
179+
''');
180+
assertResponse(r'''
181+
suggestions
182+
other
183+
kind: field
184+
red
185+
kind: enumConstant
186+
''');
187+
}
188+
168189
Future<void> test_enum_withPrefix() async {
169190
allowedIdentifiers = {'red', 'blue', 'yellow', 'black'};
170191
await computeSuggestions('''

pkg/analysis_server/test/services/completion/dart/location/enum_declaration_test.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,28 @@ suggestions
378378
''');
379379
}
380380

381+
Future<void> test_static() async {
382+
allowedIdentifiers = {'other'};
383+
await computeSuggestions('''
384+
enum E {
385+
constant;
386+
387+
static const other = constant;
388+
389+
void foo() {
390+
ot^;
391+
}
392+
}
393+
''');
394+
assertResponse(r'''
395+
replacement
396+
left: 2
397+
suggestions
398+
other
399+
kind: field
400+
''');
401+
}
402+
381403
Future<void> test_values() async {
382404
allowedIdentifiers = {'first', 'last'};
383405
includeKeywords = false;

0 commit comments

Comments
 (0)