Skip to content

Commit 6b16fab

Browse files
pqCommit Queue
authored and
Commit Queue
committed
[wildcards] completion suggestion support
See: #56361 To follow, a bunch of tests to make sure `__`, `___`, etc are not incorrectly getting special cased. Change-Id: I3d35a5344e09011460c074fdd43eccdac452a8ad Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/378623 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent a96a8a7 commit 6b16fab

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:analyzer/dart/element/element.dart';
1515
import 'package:analyzer/dart/element/type.dart';
1616
import 'package:analyzer/src/dart/ast/extensions.dart';
1717
import 'package:analyzer/src/dart/element/element.dart';
18+
import 'package:analyzer/src/dart/element/extensions.dart';
1819
import 'package:analyzer/src/dart/element/member.dart';
1920
import 'package:analyzer/src/dart/element/type_algebra.dart';
2021
import 'package:analyzer/src/dart/resolver/applicable_extensions.dart';
@@ -318,6 +319,10 @@ class DeclarationHelper {
318319
continue;
319320
}
320321

322+
if (prefixElement.isWildcardVariable) {
323+
continue;
324+
}
325+
321326
var importedLibrary = element.importedLibrary;
322327
if (importedLibrary == null) {
323328
continue;
@@ -661,6 +666,9 @@ class DeclarationHelper {
661666
required Namespace namespace,
662667
required String? prefix,
663668
}) {
669+
// Don't suggest declarations in wildcard prefixed namespaces.
670+
if (prefix == '_') return;
671+
664672
var importData = ImportData(
665673
libraryUri: library.source.uri,
666674
prefix: prefix,
@@ -1622,6 +1630,8 @@ class DeclarationHelper {
16221630
(mustBeNonVoid && element.returnType is VoidType)) {
16231631
return;
16241632
}
1633+
// Don't suggest wildcard local functions.
1634+
if (element.name == '_') return;
16251635
var matcherScore = state.matcher.score(element.displayName);
16261636
if (matcherScore != -1) {
16271637
var suggestion = LocalFunctionSuggestion(
@@ -1918,6 +1928,7 @@ class DeclarationHelper {
19181928

19191929
/// Adds a suggestion for the local variable represented by the [element].
19201930
void _suggestVariable(LocalVariableElement element) {
1931+
if (element.isWildcardVariable) return;
19211932
if (visibilityTracker.isVisible(element: element, importData: null)) {
19221933
if (mustBeConstant && !element.isConst) {
19231934
return;

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

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import '../../../../client/completion_driver_test.dart';
99
void main() {
1010
defineReflectiveSuite(() {
1111
defineReflectiveTests(WildcardFieldTest);
12+
defineReflectiveTests(WildcardForLoopTest);
1213
defineReflectiveTests(WildcardImportPrefixTest);
1314
defineReflectiveTests(WildcardLocalVariableTest);
1415
defineReflectiveTests(WildcardParameterTest);
@@ -42,7 +43,6 @@ suggestions
4243
''');
4344
}
4445

45-
@FailingTest(reason: "the local '_' is shadowing the field")
4646
Future<void> test_argumentList_withLocal() async {
4747
await computeSuggestions('''
4848
void p(Object o) {}
@@ -62,6 +62,45 @@ suggestions
6262
}
6363
}
6464

65+
@reflectiveTest
66+
class WildcardForLoopTest extends AbstractCompletionDriverTest {
67+
@override
68+
Set<String> allowedIdentifiers = {'_'};
69+
70+
@override
71+
bool get includeKeywords => false;
72+
73+
Future<void> test_forEach_argumentList() async {
74+
await computeSuggestions('''
75+
void p(Object o) {}
76+
77+
void f() {
78+
for (var _ in []) {
79+
p(^);
80+
}
81+
}
82+
''');
83+
assertResponse('''
84+
suggestions
85+
''');
86+
}
87+
88+
Future<void> test_forParts_argumentList() async {
89+
await computeSuggestions('''
90+
void p(Object o) {}
91+
92+
void f() {
93+
for (var _ = 0; ;) {
94+
p(^);
95+
}
96+
}
97+
''');
98+
assertResponse('''
99+
suggestions
100+
''');
101+
}
102+
}
103+
65104
@reflectiveTest
66105
class WildcardImportPrefixTest extends AbstractCompletionDriverTest {
67106
@override
@@ -70,7 +109,6 @@ class WildcardImportPrefixTest extends AbstractCompletionDriverTest {
70109
@override
71110
bool get includeKeywords => false;
72111

73-
@FailingTest(reason: "'_' shouldn't be suggested")
74112
Future<void> test_argumentList() async {
75113
newFile('$testPackageLibPath/ext.dart', '''
76114
extension ES on String {
@@ -125,7 +163,6 @@ class WildcardLocalVariableTest extends AbstractCompletionDriverTest {
125163
@override
126164
bool get includeKeywords => false;
127165

128-
@FailingTest(reason: "'_' shouldn't be suggested")
129166
Future<void> test_argumentList() async {
130167
await computeSuggestions('''
131168
void p(Object o) {}
@@ -136,9 +173,23 @@ void f() {
136173
}
137174
''');
138175
assertResponse(r'''
139-
suggestions
176+
suggestions
140177
b
141178
kind: localVariable
179+
''');
180+
}
181+
182+
Future<void> test_argumentList_function() async {
183+
await computeSuggestions('''
184+
void p(Object o) {}
185+
186+
void f() {
187+
_() {}
188+
p(^);
189+
}
190+
''');
191+
assertResponse(r'''
192+
suggestions
142193
''');
143194
}
144195
}

0 commit comments

Comments
 (0)