Skip to content

Commit 0509f79

Browse files
committed
handle mapping labelled arg to unlabelled
1 parent 564565a commit 0509f79

File tree

7 files changed

+126
-65
lines changed

7 files changed

+126
-65
lines changed

runtime/Js_array2.res

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ Js.Array2.indexOfFrom(["a", "b", "a", "c", "a"], "b", ~from=2) == -1
678678
*/
679679
@deprecated({
680680
reason: "Use `Array.indexOfFrom` instead.",
681-
migrate: Array.indexOfFrom()
681+
migrate: Array.indexOfFrom(%insert.labelledArgument("from"))
682682
})
683683
@send
684684
external indexOfFrom: (t<'a>, 'a, ~from: int) => int = "indexOf"
@@ -742,7 +742,7 @@ Js.Array2.lastIndexOfFrom(["a", "b", "a", "c", "a", "d"], "c", ~from=2) == -1
742742
*/
743743
@deprecated({
744744
reason: "Use `Array.lastIndexOfFrom` instead.",
745-
migrate: Array.lastIndexOfFrom()
745+
migrate: Array.lastIndexOfFrom(%insert.labelledArgument("from"))
746746
})
747747
@send
748748
external lastIndexOfFrom: (t<'a>, 'a, ~from: int) => int = "lastIndexOf"

tests/tools_tests/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ build:
55

66
test: build
77
./test.sh
8+
yarn build
89

910
clean:
1011
yarn clean

tests/tools_tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@tests/tools",
33
"private": true,
44
"scripts": {
5-
"build": "rescript legacy build",
5+
"build": "rescript legacy build -warn-error -3",
66
"clean": "rescript clean",
77
"dev": "rescript -w"
88
},

tests/tools_tests/src/expected/StdlibMigration_Array.res.expected

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,17 @@ let includes2 = Array.includes([1, 2, 3], 2)
4545
let indexOf1 = [1, 2, 3]->Array.indexOf(2)
4646
let indexOf2 = Array.indexOf([1, 2, 3], 2)
4747

48-
let indexOfFrom1 = [1, 2, 1, 3]->Array.indexOfFrom(1, ~from=2)
49-
let indexOfFrom2 = Array.indexOfFrom([1, 2, 1, 3], 1, ~from=2)
48+
let indexOfFrom1 = [1, 2, 1, 3]->Array.indexOfFrom(1, 2)
49+
let indexOfFrom2 = Array.indexOfFrom([1, 2, 1, 3], 1, 2)
5050

5151
let joinWith1 = [1, 2, 3]->Array.joinUnsafe(",")
5252
let joinWith2 = Array.joinUnsafe([1, 2, 3], ",")
5353

5454
let lastIndexOf1 = [1, 2, 1, 3]->Array.lastIndexOf(1)
5555
let lastIndexOf2 = Array.lastIndexOf([1, 2, 1, 3], 1)
5656

57-
let lastIndexOfFrom1 = [1, 2, 1, 3, 1]->Array.lastIndexOfFrom(1, ~from=3)
58-
let lastIndexOfFrom2 = Array.lastIndexOfFrom([1, 2, 1, 3, 1], 1, ~from=3)
57+
let lastIndexOfFrom1 = [1, 2, 1, 3, 1]->Array.lastIndexOfFrom(1, 3)
58+
let lastIndexOfFrom2 = Array.lastIndexOfFrom([1, 2, 1, 3, 1], 1, 3)
5959

6060
let copy1 = [1, 2, 3]->Array.copy
6161
let copy2 = Array.copy([1, 2, 3])
@@ -78,20 +78,20 @@ let everyi2 = Array.everyWithIndex([0, 1, 2], (x, i) => x == i)
7878
let filter1 = [1, 2, 3, 4]->Array.filter(x => x > 2)
7979
let filter2 = Array.filter([1, 2, 3, 4], x => x > 2)
8080

81-
let filteri1 = [0, 1, 2, 3]->Array.filterWithIndex((x, i) => i > 1)
82-
let filteri2 = Array.filterWithIndex([0, 1, 2, 3], (x, i) => i > 1)
81+
let filteri1 = [0, 1, 2, 3]->Array.filterWithIndex((_x, i) => i > 1)
82+
let filteri2 = Array.filterWithIndex([0, 1, 2, 3], (_x, i) => i > 1)
8383

8484
let find1 = [1, 2, 3, 4]->Array.find(x => x > 2)
8585
let find2 = Array.find([1, 2, 3, 4], x => x > 2)
8686

87-
let findi1 = [0, 1, 2, 3]->Array.findWithIndex((x, i) => i > 1)
88-
let findi2 = Array.findWithIndex([0, 1, 2, 3], (x, i) => i > 1)
87+
let findi1 = [0, 1, 2, 3]->Array.findWithIndex((_x, i) => i > 1)
88+
let findi2 = Array.findWithIndex([0, 1, 2, 3], (_x, i) => i > 1)
8989

9090
let findIndex1 = [1, 2, 3, 4]->Array.findIndex(x => x > 2)
9191
let findIndex2 = Array.findIndex([1, 2, 3, 4], x => x > 2)
9292

93-
let findIndexi1 = [0, 1, 2, 3]->Array.findIndexWithIndex((x, i) => i > 1)
94-
let findIndexi2 = Array.findIndexWithIndex([0, 1, 2, 3], (x, i) => i > 1)
93+
let findIndexi1 = [0, 1, 2, 3]->Array.findIndexWithIndex((_x, i) => i > 1)
94+
let findIndexi2 = Array.findIndexWithIndex([0, 1, 2, 3], (_x, i) => i > 1)
9595

9696
let forEach1 = [1, 2, 3]->Array.forEach(x => ignore(x))
9797
let forEach2 = Array.forEach([1, 2, 3], x => ignore(x))
@@ -108,8 +108,8 @@ let mapi2 = Array.mapWithIndex([1, 2, 3], (x, i) => x + i)
108108
let some1 = [1, 2, 3, 4]->Array.some(x => x > 3)
109109
let some2 = Array.some([1, 2, 3, 4], x => x > 3)
110110

111-
let somei1 = [0, 1, 2, 3]->Array.someWithIndex((x, i) => i > 2)
112-
let somei2 = Array.someWithIndex([0, 1, 2, 3], (x, i) => i > 2)
111+
let somei1 = [0, 1, 2, 3]->Array.someWithIndex((_x, i) => i > 2)
112+
let somei2 = Array.someWithIndex([0, 1, 2, 3], (_x, i) => i > 2)
113113

114114
let unsafeGet1 = [1, 2, 3]->Array.getUnsafe(1)
115115
let unsafeGet2 = Array.getUnsafe([1, 2, 3], 1)

tests/tools_tests/src/migrate/StdlibMigration_Array.res

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,20 @@ let everyi2 = Js.Array2.everyi([0, 1, 2], (x, i) => x == i)
7878
let filter1 = [1, 2, 3, 4]->Js.Array2.filter(x => x > 2)
7979
let filter2 = Js.Array2.filter([1, 2, 3, 4], x => x > 2)
8080

81-
let filteri1 = [0, 1, 2, 3]->Js.Array2.filteri((x, i) => i > 1)
82-
let filteri2 = Js.Array2.filteri([0, 1, 2, 3], (x, i) => i > 1)
81+
let filteri1 = [0, 1, 2, 3]->Js.Array2.filteri((_x, i) => i > 1)
82+
let filteri2 = Js.Array2.filteri([0, 1, 2, 3], (_x, i) => i > 1)
8383

8484
let find1 = [1, 2, 3, 4]->Js.Array2.find(x => x > 2)
8585
let find2 = Js.Array2.find([1, 2, 3, 4], x => x > 2)
8686

87-
let findi1 = [0, 1, 2, 3]->Js.Array2.findi((x, i) => i > 1)
88-
let findi2 = Js.Array2.findi([0, 1, 2, 3], (x, i) => i > 1)
87+
let findi1 = [0, 1, 2, 3]->Js.Array2.findi((_x, i) => i > 1)
88+
let findi2 = Js.Array2.findi([0, 1, 2, 3], (_x, i) => i > 1)
8989

9090
let findIndex1 = [1, 2, 3, 4]->Js.Array2.findIndex(x => x > 2)
9191
let findIndex2 = Js.Array2.findIndex([1, 2, 3, 4], x => x > 2)
9292

93-
let findIndexi1 = [0, 1, 2, 3]->Js.Array2.findIndexi((x, i) => i > 1)
94-
let findIndexi2 = Js.Array2.findIndexi([0, 1, 2, 3], (x, i) => i > 1)
93+
let findIndexi1 = [0, 1, 2, 3]->Js.Array2.findIndexi((_x, i) => i > 1)
94+
let findIndexi2 = Js.Array2.findIndexi([0, 1, 2, 3], (_x, i) => i > 1)
9595

9696
let forEach1 = [1, 2, 3]->Js.Array2.forEach(x => ignore(x))
9797
let forEach2 = Js.Array2.forEach([1, 2, 3], x => ignore(x))
@@ -108,8 +108,8 @@ let mapi2 = Js.Array2.mapi([1, 2, 3], (x, i) => x + i)
108108
let some1 = [1, 2, 3, 4]->Js.Array2.some(x => x > 3)
109109
let some2 = Js.Array2.some([1, 2, 3, 4], x => x > 3)
110110

111-
let somei1 = [0, 1, 2, 3]->Js.Array2.somei((x, i) => i > 2)
112-
let somei2 = Js.Array2.somei([0, 1, 2, 3], (x, i) => i > 2)
111+
let somei1 = [0, 1, 2, 3]->Js.Array2.somei((_x, i) => i > 2)
112+
let somei2 = Js.Array2.somei([0, 1, 2, 3], (_x, i) => i > 2)
113113

114114
let unsafeGet1 = [1, 2, 3]->Js.Array2.unsafe_get(1)
115115
let unsafeGet2 = Js.Array2.unsafe_get([1, 2, 3], 1)

tests/tools_tests/test.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ for file in src/migrate/*.{res,resi}; do
4242
fi
4343
done
4444

45+
# Move migrated files to expected directory so they can be compiled in the project
46+
#for file in src/migrate/StdlibMigration_*.res; do
47+
# expected_file="src/expected/$(basename $file).expected"
48+
# output="src/migrate/migrated/Migrated_$(basename $file)"
49+
# cp -f "$expected_file" "$output"
50+
#done
51+
4552
warningYellow='\033[0;33m'
4653
successGreen='\033[0;32m'
4754
reset='\033[0m'

tools/src/tools.ml

Lines changed: 95 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,15 +1311,86 @@ module Migrate = struct
13111311
*)
13121312

13131313
module MapperUtils = struct
1314-
let get_template_args_to_insert mapper template_args =
1314+
let get_template_args_to_insert mapper template_args source_args =
1315+
let labelled_args_that_will_be_mapped = ref [] in
1316+
let mapped_template_args =
1317+
template_args
1318+
|> List.filter_map (fun (label, arg) ->
1319+
match (label, arg) with
1320+
| ( Asttypes.Nolabel,
1321+
{
1322+
Parsetree.pexp_desc =
1323+
Pexp_extension
1324+
( {txt = "insert.labelledArgument"},
1325+
PStr
1326+
[
1327+
{
1328+
pstr_desc =
1329+
Pstr_eval
1330+
( {
1331+
pexp_desc =
1332+
Pexp_constant
1333+
(Pconst_string (arg_name, _));
1334+
},
1335+
_ );
1336+
};
1337+
] );
1338+
} ) -> (
1339+
(* Map unlabelled args *)
1340+
let arg_in_source_args =
1341+
source_args
1342+
|> List.find_map (fun (label, arg) ->
1343+
match label with
1344+
| Asttypes.Labelled {txt = label}
1345+
| Optional {txt = label} ->
1346+
if label = arg_name then Some arg else None
1347+
| _ -> None)
1348+
in
1349+
match arg_in_source_args with
1350+
| None -> None
1351+
| Some arg ->
1352+
labelled_args_that_will_be_mapped :=
1353+
arg_name :: !labelled_args_that_will_be_mapped;
1354+
Some (Asttypes.Nolabel, arg))
1355+
| ( _,
1356+
{
1357+
pexp_desc =
1358+
Pexp_extension ({txt = "insert.labelledArgument"}, _);
1359+
} ) ->
1360+
(* Do not add any other instance of insert.labelledArgument. *)
1361+
None
1362+
| _, {pexp_desc = Pexp_construct ({txt = Lident "()"}, None)} ->
1363+
None
1364+
| _ -> Some (label, mapper.Ast_mapper.expr mapper arg))
1365+
in
1366+
(mapped_template_args, !labelled_args_that_will_be_mapped)
1367+
1368+
let build_labelled_args_map template_args =
13151369
template_args
13161370
|> List.filter_map (fun (label, arg) ->
1317-
match arg with
1318-
| {Parsetree.pexp_desc = Pexp_extension ({txt}, _)}
1319-
when String.starts_with txt ~prefix:"insert." ->
1320-
None
1321-
| {pexp_desc = Pexp_construct ({txt = Lident "()"}, None)} -> None
1322-
| _ -> Some (label, mapper.Ast_mapper.expr mapper arg))
1371+
match (label, arg) with
1372+
| ( (Asttypes.Labelled {txt = label} | Optional {txt = label}),
1373+
{
1374+
Parsetree.pexp_desc =
1375+
Pexp_extension
1376+
( {txt = "insert.labelledArgument"},
1377+
PStr
1378+
[
1379+
{
1380+
pstr_desc =
1381+
Pstr_eval
1382+
( {
1383+
pexp_desc =
1384+
Pexp_constant
1385+
(Pconst_string (arg_name, _));
1386+
},
1387+
_ );
1388+
};
1389+
] );
1390+
} ) ->
1391+
Some (arg_name, label)
1392+
| _ -> None)
1393+
|> StringMap.of_list
13231394
end
13241395

13251396
let makeMapper (deprecated_used : Cmt_utils.deprecated_used list) =
@@ -1380,36 +1451,11 @@ module Migrate = struct
13801451
};
13811452
} ->
13821453
let labelled_args_map =
1383-
template_args
1384-
|> List.filter_map (fun (label, arg) ->
1385-
match (label, arg) with
1386-
| ( ( Asttypes.Labelled {txt = label}
1387-
| Optional {txt = label} ),
1388-
{
1389-
Parsetree.pexp_desc =
1390-
Pexp_extension
1391-
( {txt = "insert.labelledArgument"},
1392-
PStr
1393-
[
1394-
{
1395-
pstr_desc =
1396-
Pstr_eval
1397-
( {
1398-
pexp_desc =
1399-
Pexp_constant
1400-
(Pconst_string
1401-
(arg_name, _));
1402-
},
1403-
_ );
1404-
};
1405-
] );
1406-
} ) ->
1407-
Some (arg_name, label)
1408-
| _ -> None)
1409-
|> StringMap.of_list
1454+
MapperUtils.build_labelled_args_map template_args
14101455
in
1411-
let template_args_to_insert =
1456+
let template_args_to_insert, will_be_mapped =
14121457
MapperUtils.get_template_args_to_insert mapper template_args
1458+
source_args
14131459
in
14141460
{
14151461
exp with
@@ -1419,18 +1465,24 @@ module Migrate = struct
14191465
funct = template_funct;
14201466
args =
14211467
(source_args
1422-
|> List.map (fun (label, arg) ->
1468+
|> List.filter_map (fun (label, arg) ->
14231469
match label with
14241470
| Asttypes.Labelled {loc; txt = label}
1425-
| Asttypes.Optional {loc; txt = label}
1471+
| Optional {loc; txt = label}
14261472
when StringMap.mem label labelled_args_map ->
1473+
(* Map labelled args that has just changed name. *)
14271474
let mapped_label_name =
14281475
StringMap.find label labelled_args_map
14291476
in
1430-
( Asttypes.Labelled
1431-
{loc; txt = mapped_label_name},
1432-
arg )
1433-
| label -> (label, arg)))
1477+
Some
1478+
( Asttypes.Labelled
1479+
{loc; txt = mapped_label_name},
1480+
arg )
1481+
| (Labelled {txt} | Optional {txt})
1482+
when List.mem txt will_be_mapped ->
1483+
(* These have been mapped already, do not add. *)
1484+
None
1485+
| label -> Some (label, arg)))
14341486
@ template_args_to_insert;
14351487
partial;
14361488
transformed_jsx;
@@ -1471,8 +1523,9 @@ module Migrate = struct
14711523
transformed_jsx;
14721524
};
14731525
} ->
1474-
let template_args_to_insert =
1526+
let template_args_to_insert, _ =
14751527
MapperUtils.get_template_args_to_insert mapper template_args
1528+
[]
14761529
in
14771530
if List.is_empty template_args_to_insert then
14781531
{

0 commit comments

Comments
 (0)