Skip to content

Commit 04e21a2

Browse files
author
danrubel
committed
Completions with exact prefix should be prioritized - fixes #23099
[email protected] Review URL: https://codereview.chromium.org//1369033002 .
1 parent 6e441f6 commit 04e21a2

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,20 @@ class _LabelVisitor extends LocalDeclarationVisitor {
351351
class _LocalVisitor extends LocalDeclarationVisitor {
352352
final DartCompletionRequest request;
353353
final OpType optype;
354+
int privateMemberRelevance = DART_RELEVANCE_DEFAULT;
354355

355356
_LocalVisitor(this.request, int offset, this.optype) : super(offset) {
356357
includeLocalInheritedTypes = !optype.inStaticMethodBody;
358+
if (request.replacementLength > 0) {
359+
var contents = request.source.contents;
360+
if (contents != null &&
361+
contents.data != null &&
362+
contents.data.startsWith('_', request.replacementOffset)) {
363+
// If user typed identifier starting with '_'
364+
// then do not suppress the relevance of private members
365+
privateMemberRelevance = null;
366+
}
367+
}
357368
}
358369

359370
@override
@@ -554,6 +565,10 @@ class _LocalVisitor extends LocalDeclarationVisitor {
554565
id, isDeprecated, relevance, typeName,
555566
classDecl: classDecl);
556567
if (suggestion != null) {
568+
if (privateMemberRelevance != null &&
569+
suggestion.completion.startsWith('_')) {
570+
suggestion.relevance = privateMemberRelevance;
571+
}
557572
request.addSuggestion(suggestion);
558573
suggestion.element = createElement(request.source, elemKind, id,
559574
isAbstract: isAbstract,

pkg/analysis_server/test/services/completion/completion_test_util.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,7 +1357,8 @@ abstract class AbstractSelectorSuggestionTest extends AbstractCompletionTest {
13571357
//assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW);
13581358
assertNotSuggested('_T4');
13591359
assertSuggestLocalTopLevelVar('T5', 'int');
1360-
assertSuggestLocalTopLevelVar('_T6', null);
1360+
assertSuggestLocalTopLevelVar('_T6', null,
1361+
relevance: DART_RELEVANCE_DEFAULT);
13611362
assertNotSuggested('==');
13621363
assertSuggestLocalGetter('T7', 'String');
13631364
assertSuggestLocalSetter('T8');
@@ -3473,7 +3474,8 @@ abstract class AbstractSelectorSuggestionTest extends AbstractCompletionTest {
34733474
expect(getterF.element.isDeprecated, isTrue);
34743475
expect(getterF.element.isPrivate, isFalse);
34753476
}
3476-
CompletionSuggestion getterG = assertSuggestLocalGetter('_g', null);
3477+
CompletionSuggestion getterG = assertSuggestLocalGetter('_g', null,
3478+
relevance: DART_RELEVANCE_DEFAULT);
34773479
if (getterG != null) {
34783480
expect(getterG.element.isDeprecated, isFalse);
34793481
expect(getterG.element.isPrivate, isTrue);
@@ -3528,7 +3530,8 @@ abstract class AbstractSelectorSuggestionTest extends AbstractCompletionTest {
35283530
return computeFull((bool result) {
35293531
expect(request.replacementOffset, completionOffset);
35303532
expect(request.replacementLength, 0);
3531-
CompletionSuggestion methodA = assertSuggestLocalMethod('_a', 'A', 'Z');
3533+
CompletionSuggestion methodA = assertSuggestLocalMethod('_a', 'A', 'Z',
3534+
relevance: DART_RELEVANCE_DEFAULT);
35323535
if (methodA != null) {
35333536
expect(methodA.element.isDeprecated, isFalse);
35343537
expect(methodA.element.isPrivate, isTrue);

pkg/analysis_server/test/services/completion/local_reference_contributor_test.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,20 @@ class B extends A {m() {^}}
793793
assertSuggestMethod('m', 'B', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
794794
}
795795

796+
test_prioritization_private() {
797+
addTestSource('main() {var ab; var _ab; _^}');
798+
expect(computeFast(), isTrue);
799+
assertSuggestLocalVariable('ab', null);
800+
assertSuggestLocalVariable('_ab', null);
801+
}
802+
803+
test_prioritization_public() {
804+
addTestSource('main() {var ab; var _ab; a^}');
805+
expect(computeFast(), isTrue);
806+
assertSuggestLocalVariable('ab', null);
807+
assertSuggestLocalVariable('_ab', null, relevance: DART_RELEVANCE_DEFAULT);
808+
}
809+
796810
test_shadowed_name() {
797811
addTestSource('var a; class A { var a; m() { ^ } }');
798812
expect(computeFast(), isTrue);

0 commit comments

Comments
 (0)