@@ -182,6 +182,15 @@ Future<lsp.CompletionItem?> toLspCompletionItem(
182182 label = filterText;
183183 }
184184
185+ // If this suggestion is an override, we always want to include "override" at
186+ // the start of the label even if it's not there (which may be because the
187+ // user has already typed it). We set this _after_ setting filterText because
188+ // in that case, we do not want the client to rank this item badly because
189+ // it starts "override" and the user is typing something different.
190+ if (suggestion is OverrideSuggestion && ! label.startsWith ('override ' )) {
191+ label = 'override $label ' ;
192+ }
193+
185194 // Trim any trailing comma from the (displayed) label.
186195 if (label.endsWith (',' )) {
187196 label = label.substring (0 , label.length - 1 );
@@ -528,15 +537,25 @@ CompletionDetail _getCompletionDetail(
528537 ? (suggestion as ElementBasedSuggestion ).element
529538 : null ;
530539
540+ // Usually getter/setters look the same in completion because they insert the
541+ // same text. This is not the case for overrides because they will insert
542+ // getter or setter stub code. To make this clear, we'll include get/set in
543+ // the signature.
544+ bool isGetterOverride = false , isSetterOverride = false ;
545+ if (suggestion is OverrideSuggestion ) {
546+ isGetterOverride = element is GetterElement ;
547+ isSetterOverride = element is SetterElement ;
548+ }
549+
531550 if (suggestion is NamedArgumentSuggestion ) {
532551 element = suggestion.parameter;
533552 }
534553 String ? parameters;
535554 if (element != null ) {
536555 parameters = getParametersString2 (element);
537556 // Prefer the element return type (because it may be more specific
538- // for overrides) and fall back to the parameter type or return type from the
539- // suggestion (handles records).
557+ // for overrides) and fall back to the parameter type or return type from
558+ // the suggestion (handles records).
540559 String ? parameterType;
541560 if (element is FormalParameterElement ) {
542561 parameterType = element.type.getDisplayString ();
@@ -558,19 +577,31 @@ CompletionDetail _getCompletionDetail(
558577 '()' => '()' ,
559578 _ => '(…)' ,
560579 };
561- var fullSignature = switch ((parameters, returnType)) {
562- (null , _) => returnType ?? '' ,
563- (var parameters? , null ) => parameters,
564- (var parameters? , '' ) => parameters,
565- (var parameters? , _) => '$parameters → $returnType ' ,
580+ var fullSignature = switch ((
581+ parameters,
582+ returnType,
583+ isGetterOverride,
584+ isSetterOverride,
585+ )) {
586+ (_, var returnType? , true , _) => '$returnType get' ,
587+ (_, var returnType? , _, true ) => 'set ($returnType )' ,
588+ (null , _, _, _) => returnType ?? '' ,
589+ (var parameters? , null || '' , _, _) => parameters,
590+ (var parameters? , var returnType? , _, _) => '$parameters → $returnType ' ,
566591 };
567- var truncatedSignature = switch ((parameters, returnType)) {
568- (null , null ) => '' ,
592+ var truncatedSignature = switch ((
593+ parameters,
594+ returnType,
595+ isGetterOverride,
596+ isSetterOverride,
597+ )) {
569598 // Include a leading space when no parameters so return type isn't right
570599 // against the completion label.
571- (null , var returnType? ) => ' $returnType ' ,
572- (_, null ) || (_, '' ) => truncatedParameters,
573- (_, var returnType? ) => '$truncatedParameters → $returnType ' ,
600+ (_, var returnType? , true , _) => ' $returnType get' ,
601+ (_, var returnType? , _, true ) => ' set ($returnType )' ,
602+ (null , var returnType? , _, _) => ' $returnType ' ,
603+ (_, null || '' , _, _) => truncatedParameters,
604+ (_, var returnType? , _, _) => '$truncatedParameters → $returnType ' ,
574605 };
575606
576607 // Use the full signature in the details popup.
0 commit comments