From 91c05b2bbbc22753e548e528f20f90e1e7b6afb4 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Mon, 2 Dec 2024 18:26:34 +0000 Subject: [PATCH] [analysis_server] Use generic function syntax for function parameters in "Extract Method" This fixes an issue where parameters that used the new function syntax and had no parameter names would produce code like `void f(String )` where the type would be interpreted as a parameter name and typed `dynamic`. Fixes https://github.com/Dart-Code/Dart-Code/issues/5350 Change-Id: Ifcbe64dadb88cc0fd9b4fa3637045bcdc343f3f7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/397900 Reviewed-by: Brian Wilkerson Reviewed-by: Samuel Rawlins Commit-Queue: Brian Wilkerson --- .../refactoring/legacy/extract_method.dart | 12 +++-- .../legacy/extract_method_test.dart | 49 ++++++++++++++++++- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart index 1b5ca5cebea9..d7c2e17213b6 100644 --- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart +++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart @@ -353,12 +353,14 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl sb.write(' '); } } - // name - sb.write(parameter.name); // optional function-typed parameter parameters if (parameter.parameters != null) { + sb.write('Function'); sb.write(parameter.parameters); + sb.write(' '); } + // name + sb.write(parameter.name); } sb.write(')'); } @@ -1849,8 +1851,10 @@ extension on LibraryElement { parametersBuffer.write(', '); } parametersBuffer.write(parameterType); - parametersBuffer.write(' '); - parametersBuffer.write(parameter.name); + if (parameter.name.isNotEmpty) { + parametersBuffer.write(' '); + parametersBuffer.write(parameter.name); + } } parametersBuffer.write(')'); return getTypeSource(type.returnType, librariesToImport); diff --git a/pkg/analysis_server/test/services/refactoring/legacy/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/legacy/extract_method_test.dart index cfa809a5ca4d..95ee7323b85c 100644 --- a/pkg/analysis_server/test/services/refactoring/legacy/extract_method_test.dart +++ b/pkg/analysis_server/test/services/refactoring/legacy/extract_method_test.dart @@ -3377,7 +3377,7 @@ class C { return d; } - int res(int callback(int x, int y), int b) { + int res(int Function(int x, int y) callback, int b) { int c = callback(b, 2); return c; } @@ -3604,6 +3604,53 @@ int res() { '''); } + Future test_statements_topFunction_parameters_function() async { + await indexTestUnit(''' +Future f(void f(String x), String a) async { +// start + f(a); +// end +} +'''); + _createRefactoringForStartEndComments(); + // apply refactoring + return _assertSuccessfulRefactoring(''' +Future f(void f(String x), String a) async { +// start + res(f, a); +// end +} + +void res(void Function(String x) f, String a) { + f(a); +} +'''); + } + + Future + test_statements_topFunction_parameters_function_functionSyntax() async { + await indexTestUnit(''' +Future f(void Function(String) f, String a) async { +// start + f(a); +// end +} +'''); + _createRefactoringForStartEndComments(); + // apply refactoring + return _assertSuccessfulRefactoring(''' +Future f(void Function(String) f, String a) async { +// start + res(f, a); +// end +} + +void res(void Function(String) f, String a) { + f(a); +} +'''); + } + Future test_statements_topFunction_parameters_recordType() async { await indexTestUnit(''' void f((int, String) r) {