Skip to content

Commit

Permalink
[analysis_server] Use generic function syntax for function parameters…
Browse files Browse the repository at this point in the history
… 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]>
  • Loading branch information
DanTup authored and Commit Queue committed Dec 2, 2024
1 parent 35a07b2 commit 91c05b2
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(')');
}
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -3604,6 +3604,53 @@ int res() {
''');
}

Future<void> test_statements_topFunction_parameters_function() async {
await indexTestUnit('''
Future<void> f(void f(String x), String a) async {
// start
f(a);
// end
}
''');
_createRefactoringForStartEndComments();
// apply refactoring
return _assertSuccessfulRefactoring('''
Future<void> 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<void>
test_statements_topFunction_parameters_function_functionSyntax() async {
await indexTestUnit('''
Future<void> f(void Function(String) f, String a) async {
// start
f(a);
// end
}
''');
_createRefactoringForStartEndComments();
// apply refactoring
return _assertSuccessfulRefactoring('''
Future<void> f(void Function(String) f, String a) async {
// start
res(f, a);
// end
}
void res(void Function(String) f, String a) {
f(a);
}
''');
}

Future<void> test_statements_topFunction_parameters_recordType() async {
await indexTestUnit('''
void f((int, String) r) {
Expand Down

0 comments on commit 91c05b2

Please sign in to comment.