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,