Skip to content

Commit 06111a5

Browse files
FMorschelCommit Queue
authored andcommitted
Fixes create method inside record literals
[email protected] Fixes #58266 Change-Id: I33e6d21099d4f6b64556b45df3fca5dbfa4d3ed2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/396561 Auto-Submit: Felipe Morschel <[email protected]> Reviewed-by: Phil Quitslund <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent f62c78b commit 06111a5

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:analyzer/dart/element/element2.dart';
1111
import 'package:analyzer/dart/element/nullability_suffix.dart';
1212
import 'package:analyzer/dart/element/type.dart';
1313
import 'package:analyzer/src/dart/element/type.dart';
14+
import 'package:analyzer/src/utilities/extensions/collection.dart';
1415
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
1516
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
1617
import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -58,17 +59,42 @@ class CreateMethodOrFunction extends ResolvedCorrectionProducer {
5859
// should be argument of some invocation
5960
// or child of an expression that is one
6061
var parameterElement = argument.correspondingParameter;
62+
int? recordFieldIndex;
6163
if (argument.parent case ConditionalExpression parent) {
6264
if (argument == parent.condition) {
6365
return;
6466
}
6567
parameterElement = parent.correspondingParameter;
68+
} else if (argument.parent case RecordLiteral record) {
69+
parameterElement = record.correspondingParameter;
70+
for (var (index, field)
71+
in record.fields.whereNotType<NamedExpression>().indexed) {
72+
if (field == argument) {
73+
recordFieldIndex = index;
74+
break;
75+
}
76+
}
6677
}
6778
if (parameterElement == null) {
6879
return;
6980
}
7081
// should be parameter of function type
7182
var parameterType = parameterElement.type;
83+
if (parameterType is RecordType) {
84+
// Finds the corresponding field for argument
85+
if (argument is NamedExpression) {
86+
var fieldName = argument.name.label.name;
87+
for (var field in parameterType.namedFields) {
88+
if (field.name == fieldName) {
89+
parameterType = field.type;
90+
break;
91+
}
92+
}
93+
} else if (recordFieldIndex != null) {
94+
var field = parameterType.positionalFields[recordFieldIndex];
95+
parameterType = field.type;
96+
}
97+
}
7298
if (parameterType is InterfaceType && parameterType.isDartCoreFunction) {
7399
parameterType = FunctionTypeImpl(
74100
typeFormals: const [],

pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,46 @@ void f2(int p) {}
433433
''');
434434
}
435435

436+
Future<void> test_functionType_inside_record_functionType() async {
437+
await resolveTestCode('''
438+
void f1(int i) {
439+
f2((0, f3));
440+
}
441+
442+
void f2((int, int Function(int)) f) {}
443+
''');
444+
await assertHasFix('''
445+
void f1(int i) {
446+
f2((0, f3));
447+
}
448+
449+
void f2((int, int Function(int)) f) {}
450+
451+
int f3(int p1) {
452+
}
453+
''');
454+
}
455+
456+
Future<void> test_functionType_inside_record_functionType_named() async {
457+
await resolveTestCode('''
458+
void f1(int i) {
459+
f2((f: f3));
460+
}
461+
462+
void f2(({int Function(int) f}) f) {}
463+
''');
464+
await assertHasFix('''
465+
void f1(int i) {
466+
f2((f: f3));
467+
}
468+
469+
void f2(({int Function(int) f}) f) {}
470+
471+
int f3(int p1) {
472+
}
473+
''');
474+
}
475+
436476
Future<void> test_functionType_notFunctionType() async {
437477
await resolveTestCode('''
438478
void f(A a) {

pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,55 @@ class C {
837837
''');
838838
}
839839

840+
Future<void> test_functionType_method_inside_record_functionType() async {
841+
await resolveTestCode('''
842+
class C {
843+
void m1(int i) {
844+
m2((m3,));
845+
}
846+
847+
void m2((int Function(int),) f) {}
848+
}
849+
''');
850+
await assertHasFix('''
851+
class C {
852+
void m1(int i) {
853+
m2((m3,));
854+
}
855+
856+
void m2((int Function(int),) f) {}
857+
858+
int m3(int p1) {
859+
}
860+
}
861+
''');
862+
}
863+
864+
Future<void>
865+
test_functionType_method_inside_record_functionType_named() async {
866+
await resolveTestCode('''
867+
class C {
868+
void m1(int i) {
869+
m2((f: m3));
870+
}
871+
872+
void m2(({int Function(int) f}) f) {}
873+
}
874+
''');
875+
await assertHasFix('''
876+
class C {
877+
void m1(int i) {
878+
m2((f: m3));
879+
}
880+
881+
void m2(({int Function(int) f}) f) {}
882+
883+
int m3(int p1) {
884+
}
885+
}
886+
''');
887+
}
888+
840889
Future<void> test_functionType_method_targetClass() async {
841890
await resolveTestCode('''
842891
void f(A a) {

0 commit comments

Comments
 (0)