Fix for filtering name argument suggestions for Cider. R=brianwilkerson@google.com, keertip@google.com Bug: https://buganizer.corp.google.com/issues/157673517 Change-Id: If7b39b9986963f5936a77556d5ac528b71d365e6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149884 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Keerti Parthasarathy <keertip@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart index b6e249d..2e2ec51 100644 --- a/pkg/analysis_server/lib/src/cider/completion.dart +++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -293,7 +293,18 @@ return ''; } - double _score(CompletionSuggestion e) => _matcher.score(e.completion); + double _score(CompletionSuggestion e) { + var suggestionTextToMatch = e.completion; + + if (e.kind == CompletionSuggestionKind.NAMED_ARGUMENT) { + var index = suggestionTextToMatch.indexOf(':'); + if (index != -1) { + suggestionTextToMatch = suggestionTextToMatch.substring(0, index); + } + } + + return _matcher.score(suggestionTextToMatch); + } } /// [CompletionSuggestion] scored using [FuzzyMatcher].
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart index 0ab4c89..a1d3a4a 100644 --- a/pkg/analysis_server/test/src/cider/completion_test.dart +++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -5,7 +5,7 @@ import 'package:analysis_server/src/cider/completion.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer_plugin/protocol/protocol_common.dart' - show CompletionSuggestion, ElementKind; + show CompletionSuggestion, CompletionSuggestionKind, ElementKind; import 'package:meta/meta.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; @@ -214,6 +214,32 @@ ]); } + Future<void> test_filterSort_namedArgument_hasPrefix() async { + await _compute(r''' +void foo({int aaa, int bbb}); + +void f() { + foo(a^); +} +'''); + + _assertHasNamedArgument(name: 'aaa'); + _assertNoNamedArgument(name: 'bbb'); + } + + Future<void> test_filterSort_namedArgument_noPrefix() async { + await _compute(r''' +void foo({int aaa, int bbb}); + +void f() { + foo(^); +} +'''); + + _assertHasNamedArgument(name: 'aaa'); + _assertHasNamedArgument(name: 'bbb'); + } + Future<void> test_filterSort_preferLocal() async { await _compute(r''' var a = 0; @@ -288,6 +314,12 @@ return matching.single; } + CompletionSuggestion _assertHasNamedArgument({@required String name}) { + var matching = _matchingNamedArgumentSuggestions(name: name); + expect(matching, hasLength(1), reason: 'Expected exactly one completion'); + return matching.single; + } + CompletionSuggestion _assertHasTopLevelVariable({@required String text}) { var matching = _matchingCompletions( text: text, @@ -309,6 +341,11 @@ expect(matching, isEmpty, reason: 'Expected zero completions'); } + void _assertNoNamedArgument({@required String name}) { + var matching = _matchingNamedArgumentSuggestions(name: name); + expect(matching, isEmpty, reason: 'Expected zero completions'); + } + void _assertOrder(List<CompletionSuggestion> suggestions) { var lastIndex = -2; for (var suggestion in suggestions) { @@ -352,6 +389,22 @@ }).toList(); } + List<CompletionSuggestion> _matchingNamedArgumentSuggestions({ + @required String name, + }) { + return _suggestions.where((e) { + if (e.kind != CompletionSuggestionKind.NAMED_ARGUMENT) { + return false; + } + + if (!e.completion.startsWith('$name:')) { + return false; + } + + return true; + }).toList(); + } + CiderCompletionComputer _newComputer() { return _computer = CiderCompletionComputer( logger,