@@ -12,6 +12,7 @@ import 'package:analysis_server/src/services/completion/dart/utilities.dart';
1212import 'package:analysis_server/src/utilities/extensions/ast.dart' ;
1313import 'package:analysis_server/src/utilities/extensions/element.dart' ;
1414import 'package:analyzer/dart/element/element.dart' as e;
15+ import 'package:analyzer/dart/element/type.dart' ;
1516import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart' ;
1617import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart' ;
1718import 'package:analyzer_plugin/utilities/completion/relevance.dart' ;
@@ -81,7 +82,7 @@ Future<CompletionSuggestion?> candidateToCompletionSuggestion(
8182 false ,
8283 displayText: data? .displayText ?? candidate.displayText,
8384 ),
84-
85+ FunctionCall functionCall => _getFunctionCallSuggestion (functionCall),
8586 MethodSuggestion (kind: var suggestionKind) =>
8687 // TODO(brianwilkerson): Correctly set the kind of suggestion in cases
8788 // where `isFunctionalArgument` would return `true` so we can stop
@@ -196,23 +197,6 @@ Future<CompletionSuggestion?> candidateToCompletionSuggestion(
196197 libraryUriStr,
197198 requiredImports,
198199 );
199- case FunctionCall ():
200- return CompletionSuggestion (
201- CompletionSuggestionKind .INVOCATION ,
202- candidate.relevanceScore,
203- e.MethodElement .CALL_METHOD_NAME ,
204- e.MethodElement .CALL_METHOD_NAME .length,
205- 0 ,
206- false ,
207- false ,
208- displayText: candidate.completion,
209- element: _getElementForFunctionCall (),
210- returnType: 'void' ,
211- parameterNames: [],
212- parameterTypes: [],
213- requiredParameterCount: 0 ,
214- hasNamedParameters: false ,
215- );
216200 case IdentifierSuggestion ():
217201 return CompletionSuggestion (
218202 CompletionSuggestionKind .IDENTIFIER ,
@@ -447,36 +431,63 @@ Future<CompletionSuggestion?> candidateToCompletionSuggestion(
447431 }
448432}
449433
434+ ({
435+ List <String > parameterNames,
436+ List <String > parameterTypes,
437+ int requiredParameterCount,
438+ bool hasNamedParameters,
439+ CompletionDefaultArgumentList defaultArgumentList,
440+ })
441+ createParametersCompletionData (
442+ List <e.FormalParameterElement > formalParameters,
443+ ) {
444+ var parameterNames = formalParameters.map ((parameter) {
445+ return parameter.displayName;
446+ }).toList ();
447+ var parameterTypes = formalParameters.map ((
448+ e.FormalParameterElement parameter,
449+ ) {
450+ return parameter.type.getDisplayString ();
451+ }).toList ();
452+
453+ var requiredParameters = formalParameters.where (
454+ (e.FormalParameterElement param) => param.isRequiredPositional,
455+ );
456+ var requiredParameterCount = requiredParameters.length;
457+
458+ var namedParameters = formalParameters.where (
459+ (e.FormalParameterElement param) => param.isNamed,
460+ );
461+ var hasNamedParameters = namedParameters.isNotEmpty;
462+
463+ var defaultArgumentList = computeCompletionDefaultArgumentList (
464+ requiredParameters,
465+ namedParameters,
466+ );
467+ return (
468+ parameterNames: parameterNames,
469+ parameterTypes: parameterTypes,
470+ requiredParameterCount: requiredParameterCount,
471+ hasNamedParameters: hasNamedParameters,
472+ defaultArgumentList: defaultArgumentList,
473+ );
474+ }
475+
450476_ParameterData _createParameterData (e.Element element) {
451477 List <String >? parameterNames;
452478 List <String >? parameterTypes;
453479 int ? requiredParameterCount;
454480 bool ? hasNamedParameters;
455481 CompletionDefaultArgumentList ? defaultArgumentList;
456482 if (element is e.ExecutableElement && element is ! e.PropertyAccessorElement ) {
457- parameterNames = element.formalParameters.map ((parameter) {
458- return parameter.displayName;
459- }).toList ();
460- parameterTypes = element.formalParameters.map ((
461- e.FormalParameterElement parameter,
462- ) {
463- return parameter.type.getDisplayString ();
464- }).toList ();
465-
466- var requiredParameters = element.formalParameters.where (
467- (e.FormalParameterElement param) => param.isRequiredPositional,
468- );
469- requiredParameterCount = requiredParameters.length;
470-
471- var namedParameters = element.formalParameters.where (
472- (e.FormalParameterElement param) => param.isNamed,
473- );
474- hasNamedParameters = namedParameters.isNotEmpty;
475-
476- defaultArgumentList = computeCompletionDefaultArgumentList (
477- element,
478- requiredParameters,
479- namedParameters,
483+ (
484+ : parameterNames,
485+ : parameterTypes,
486+ : requiredParameterCount,
487+ : hasNamedParameters,
488+ : defaultArgumentList,
489+ ) = createParametersCompletionData (
490+ element.formalParameters,
480491 );
481492 }
482493 return _ParameterData (
@@ -592,13 +603,44 @@ String? _getDeclaringType(e.Element element) {
592603 return declaringType;
593604}
594605
595- Element _getElementForFunctionCall () {
606+ Element _getElementForFunctionCall (
607+ FunctionType type,
608+ String parameters,
609+ String ? typeParameters,
610+ ) {
596611 return Element (
597612 ElementKind .METHOD ,
598613 e.MethodElement .CALL_METHOD_NAME ,
599614 Element .makeFlags (),
600- parameters: '()' ,
601- returnType: 'void' ,
615+ parameters: parameters,
616+ typeParameters: typeParameters,
617+ returnType: type.returnType.getDisplayString (),
618+ );
619+ }
620+
621+ DartCompletionSuggestion _getFunctionCallSuggestion (FunctionCall functionCall) {
622+ var FunctionCall (: kind, : relevanceScore, : completion, : type) = functionCall;
623+ var record = createParametersCompletionData (type.formalParameters);
624+ return DartCompletionSuggestion (
625+ kind,
626+ relevanceScore,
627+ completion,
628+ completion.length,
629+ 0 ,
630+ false ,
631+ false ,
632+ displayText: completion,
633+ element: _getElementForFunctionCall (
634+ type,
635+ '(${record .parameterNames .join (',' )})' ,
636+ record.parameterTypes.joinWithCommaAndSurroundWithAngle (),
637+ ),
638+ returnType: type.returnType.getDisplayString (),
639+ parameterNames: record.parameterNames,
640+ parameterTypes: record.parameterTypes,
641+ requiredParameterCount: record.requiredParameterCount,
642+ hasNamedParameters: record.hasNamedParameters,
643+ defaultArgumentListString: record.defaultArgumentList.text,
602644 );
603645}
604646
@@ -771,3 +813,12 @@ class _ParameterData {
771813 this .defaultArgumentList,
772814 );
773815}
816+
817+ extension on List <String > {
818+ String ? joinWithCommaAndSurroundWithAngle () {
819+ if (isEmpty) {
820+ return null ;
821+ }
822+ return '<${join (', ' )}>' ;
823+ }
824+ }
0 commit comments