Skip to content

Commit 91c05b2

Browse files
DanTupCommit Queue
authored andcommitted
[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 Dart-Code/Dart-Code#5350 Change-Id: Ifcbe64dadb88cc0fd9b4fa3637045bcdc343f3f7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/397900 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 35a07b2 commit 91c05b2

File tree

2 files changed

+56
-5
lines changed

2 files changed

+56
-5
lines changed

pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,14 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl
353353
sb.write(' ');
354354
}
355355
}
356-
// name
357-
sb.write(parameter.name);
358356
// optional function-typed parameter parameters
359357
if (parameter.parameters != null) {
358+
sb.write('Function');
360359
sb.write(parameter.parameters);
360+
sb.write(' ');
361361
}
362+
// name
363+
sb.write(parameter.name);
362364
}
363365
sb.write(')');
364366
}
@@ -1849,8 +1851,10 @@ extension on LibraryElement {
18491851
parametersBuffer.write(', ');
18501852
}
18511853
parametersBuffer.write(parameterType);
1852-
parametersBuffer.write(' ');
1853-
parametersBuffer.write(parameter.name);
1854+
if (parameter.name.isNotEmpty) {
1855+
parametersBuffer.write(' ');
1856+
parametersBuffer.write(parameter.name);
1857+
}
18541858
}
18551859
parametersBuffer.write(')');
18561860
return getTypeSource(type.returnType, librariesToImport);

pkg/analysis_server/test/services/refactoring/legacy/extract_method_test.dart

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3377,7 +3377,7 @@ class C {
33773377
return d;
33783378
}
33793379
3380-
int res(int callback(int x, int y), int b) {
3380+
int res(int Function(int x, int y) callback, int b) {
33813381
int c = callback(b, 2);
33823382
return c;
33833383
}
@@ -3604,6 +3604,53 @@ int res() {
36043604
''');
36053605
}
36063606

3607+
Future<void> test_statements_topFunction_parameters_function() async {
3608+
await indexTestUnit('''
3609+
Future<void> f(void f(String x), String a) async {
3610+
// start
3611+
f(a);
3612+
// end
3613+
}
3614+
''');
3615+
_createRefactoringForStartEndComments();
3616+
// apply refactoring
3617+
return _assertSuccessfulRefactoring('''
3618+
Future<void> f(void f(String x), String a) async {
3619+
// start
3620+
res(f, a);
3621+
// end
3622+
}
3623+
3624+
void res(void Function(String x) f, String a) {
3625+
f(a);
3626+
}
3627+
''');
3628+
}
3629+
3630+
Future<void>
3631+
test_statements_topFunction_parameters_function_functionSyntax() async {
3632+
await indexTestUnit('''
3633+
Future<void> f(void Function(String) f, String a) async {
3634+
// start
3635+
f(a);
3636+
// end
3637+
}
3638+
''');
3639+
_createRefactoringForStartEndComments();
3640+
// apply refactoring
3641+
return _assertSuccessfulRefactoring('''
3642+
Future<void> f(void Function(String) f, String a) async {
3643+
// start
3644+
res(f, a);
3645+
// end
3646+
}
3647+
3648+
void res(void Function(String) f, String a) {
3649+
f(a);
3650+
}
3651+
''');
3652+
}
3653+
36073654
Future<void> test_statements_topFunction_parameters_recordType() async {
36083655
await indexTestUnit('''
36093656
void f((int, String) r) {

0 commit comments

Comments
 (0)