Skip to content

Commit 6e73efe

Browse files
committed
make record type for props with attrs
1 parent be1b82a commit 6e73efe

File tree

3 files changed

+64
-43
lines changed

3 files changed

+64
-43
lines changed

res_syntax/src/reactjs_jsx_v4.ml

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -289,14 +289,15 @@ let makePropsTypeParams ?(stripExplicitOption = false)
289289

290290
let makeLabelDecls ~loc namedTypeList =
291291
namedTypeList
292-
|> List.map (fun (isOptional, label, _, interiorType) ->
292+
|> List.map (fun (isOptional, label, attrs, interiorType) ->
293293
if label = "key" then
294-
Type.field ~loc ~attrs:optionalAttrs {txt = label; loc} interiorType
294+
Type.field ~loc ~attrs:(optionalAttrs @ attrs) {txt = label; loc}
295+
interiorType
295296
else if isOptional then
296-
Type.field ~loc ~attrs:optionalAttrs {txt = label; loc}
297+
Type.field ~loc ~attrs:(optionalAttrs @ attrs) {txt = label; loc}
297298
(Typ.var @@ safeTypeFromValue @@ Labelled label)
298299
else
299-
Type.field ~loc {txt = label; loc}
300+
Type.field ~loc ~attrs {txt = label; loc}
300301
(Typ.var @@ safeTypeFromValue @@ Labelled label))
301302

302303
let makeTypeDecls propsName loc namedTypeList =
@@ -681,7 +682,9 @@ let newtypeToVar newtype type_ =
681682
mapper.typ mapper type_
682683

683684
let argToType ~newtypes ~(typeConstraints : core_type option) types
684-
(name, default, _noLabelName, _alias, loc, type_) =
685+
((name, default, {ppat_attributes = attrs}, _alias, loc, type_) :
686+
arg_label * expression option * pattern * label * 'loc * core_type option)
687+
=
685688
let rec getType name coreType =
686689
match coreType with
687690
| {ptyp_desc = Ptyp_arrow (arg, c1, c2)} ->
@@ -699,28 +702,29 @@ let argToType ~newtypes ~(typeConstraints : core_type option) types
699702
in
700703
match (type_, name, default) with
701704
| Some type_, name, _ when isOptional name ->
702-
(true, getLabel name, [], {type_ with ptyp_attributes = optionalAttrs})
705+
(true, getLabel name, attrs, {type_ with ptyp_attributes = optionalAttrs})
703706
:: types
704-
| Some type_, name, _ -> (false, getLabel name, [], type_) :: types
707+
| Some type_, name, _ -> (false, getLabel name, attrs, type_) :: types
705708
| None, name, _ when isOptional name ->
706709
( true,
707710
getLabel name,
708-
[],
711+
attrs,
709712
Typ.var ~loc ~attrs:optionalAttrs (safeTypeFromValue name) )
710713
:: types
711714
| None, name, _ when isLabelled name ->
712-
(false, getLabel name, [], Typ.var ~loc (safeTypeFromValue name)) :: types
715+
(false, getLabel name, attrs, Typ.var ~loc (safeTypeFromValue name))
716+
:: types
713717
| _ -> types
714718

715719
let argWithDefaultValue (name, default, _, _, _, _) =
716720
match default with
717721
| Some default when isOptional name -> Some (getLabel name, default)
718722
| _ -> None
719723

720-
let argToConcreteType types (name, _loc, type_) =
724+
let argToConcreteType types (name, attrs, _loc, type_) =
721725
match name with
722-
| name when isLabelled name -> (false, getLabel name, [], type_) :: types
723-
| name when isOptional name -> (true, getLabel name, [], type_) :: types
726+
| name when isLabelled name -> (false, getLabel name, attrs, type_) :: types
727+
| name when isOptional name -> (true, getLabel name, attrs, type_) :: types
724728
| _ -> types
725729

726730
let check_string_int_attribute_iter =
@@ -763,15 +767,19 @@ let transformStructureItem ~config mapper item =
763767
|> Option.map React_jsx_common.typVarsOfCoreType
764768
|> Option.value ~default:[]
765769
in
766-
let rec getPropTypes types ({ptyp_loc; ptyp_desc} as fullType) =
770+
let rec getPropTypes types
771+
({ptyp_loc; ptyp_desc; ptyp_attributes} as fullType) =
767772
match ptyp_desc with
768773
| Ptyp_arrow (name, type_, ({ptyp_desc = Ptyp_arrow _} as rest))
769774
when isLabelled name || isOptional name ->
770-
getPropTypes ((name, ptyp_loc, type_) :: types) rest
775+
getPropTypes
776+
((name, ptyp_attributes, ptyp_loc, type_) :: types)
777+
rest
771778
| Ptyp_arrow (Nolabel, _type, rest) -> getPropTypes types rest
772779
| Ptyp_arrow (name, type_, returnValue)
773780
when isLabelled name || isOptional name ->
774-
(returnValue, (name, returnValue.ptyp_loc, type_) :: types)
781+
( returnValue,
782+
(name, ptyp_attributes, returnValue.ptyp_loc, type_) :: types )
775783
| _ -> (fullType, types)
776784
in
777785
let innerType, propTypes = getPropTypes [] pval_type in
@@ -1264,19 +1272,22 @@ let transformSignatureItem ~config _mapper item =
12641272
in
12651273
let rec getPropTypes types ({ptyp_loc; ptyp_desc} as fullType) =
12661274
match ptyp_desc with
1267-
| Ptyp_arrow (name, type_, ({ptyp_desc = Ptyp_arrow _} as rest))
1275+
| Ptyp_arrow
1276+
( name,
1277+
({ptyp_attributes = attrs} as type_),
1278+
({ptyp_desc = Ptyp_arrow _} as rest) )
12681279
when isOptional name || isLabelled name ->
1269-
getPropTypes ((name, ptyp_loc, type_) :: types) rest
1280+
getPropTypes ((name, attrs, ptyp_loc, type_) :: types) rest
12701281
| Ptyp_arrow
12711282
(Nolabel, {ptyp_desc = Ptyp_constr ({txt = Lident "unit"}, _)}, rest)
12721283
->
12731284
getPropTypes types rest
12741285
| Ptyp_arrow (Nolabel, _type, rest) ->
12751286
hasForwardRef := true;
12761287
getPropTypes types rest
1277-
| Ptyp_arrow (name, type_, returnValue)
1288+
| Ptyp_arrow (name, ({ptyp_attributes = attrs} as type_), returnValue)
12781289
when isOptional name || isLabelled name ->
1279-
(returnValue, (name, returnValue.ptyp_loc, type_) :: types)
1290+
(returnValue, (name, attrs, returnValue.ptyp_loc, type_) :: types)
12801291
| _ -> (fullType, types)
12811292
in
12821293
let innerType, propTypes = getPropTypes [] pval_type in

res_syntax/tests/ppx/react/expected/mangleKeyword.res.txt

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,49 +20,57 @@ let c1 = React.createElement(C1.make, C1.makeProps(~_open="x", ()))
2020
@@jsxConfig({version: 4, mode: "classic"})
2121

2222
module C0 = {
23-
type props<'T_open> = {
24-
_open: 'T_open,
23+
type props<'T_open, 'T_type> = {
24+
@as("open") _open: 'T_open,
25+
@as("type") _type: 'T_type,
2526
}
2627

27-
@react.component let make = ({@as("open") _open, _}: props<'T_open>) => React.string(_open)
28+
@react.component
29+
let make = ({@as("open") _open, @as("type") _type, _}: props<'T_open, string>) =>
30+
React.string(_open)
2831
let make = {
2932
let \"MangleKeyword$C0" = (props: props<_>) => make(props)
3033

3134
\"MangleKeyword$C0"
3235
}
3336
}
3437
module C1 = {
35-
type props<'T_open> = {
36-
_open: 'T_open,
38+
type props<'T_open, 'T_type> = {
39+
@as("open") _open: 'T_open,
40+
@as("type") _type: 'T_type,
3741
}
3842

39-
external make: @as("open") React.componentLike<props<string>, React.element> = "default"
43+
external make: @as("open") React.componentLike<props<string, string>, React.element> = "default"
4044
}
4145

42-
let c0 = React.createElement(C0.make, {_open: "x"})
43-
let c1 = React.createElement(C1.make, {_open: "x"})
46+
let c0 = React.createElement(C0.make, {_open: "x", _type: "t"})
47+
let c1 = React.createElement(C1.make, {_open: "x", _type: "t"})
4448

4549
@@jsxConfig({version: 4, mode: "automatic"})
4650

4751
module C0 = {
48-
type props<'T_open> = {
49-
_open: 'T_open,
52+
type props<'T_open, 'T_type> = {
53+
@as("open") _open: 'T_open,
54+
@as("type") _type: 'T_type,
5055
}
5156

52-
@react.component let make = ({@as("open") _open, _}: props<'T_open>) => React.string(_open)
57+
@react.component
58+
let make = ({@as("open") _open, @as("type") _type, _}: props<'T_open, string>) =>
59+
React.string(_open)
5360
let make = {
5461
let \"MangleKeyword$C0" = (props: props<_>) => make(props)
5562

5663
\"MangleKeyword$C0"
5764
}
5865
}
5966
module C1 = {
60-
type props<'T_open> = {
61-
_open: 'T_open,
67+
type props<'T_open, 'T_type> = {
68+
@as("open") _open: 'T_open,
69+
@as("type") _type: 'T_type,
6270
}
6371

64-
external make: @as("open") React.componentLike<props<string>, React.element> = "default"
72+
external make: @as("open") React.componentLike<props<string, string>, React.element> = "default"
6573
}
6674

67-
let c0 = React.jsx(C0.make, {_open: "x"})
68-
let c1 = React.jsx(C1.make, {_open: "x"})
75+
let c0 = React.jsx(C0.make, {_open: "x", _type: "t"})
76+
let c1 = React.jsx(C1.make, {_open: "x", _type: "t"})

res_syntax/tests/ppx/react/mangleKeyword.res

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,29 @@ let c1 = <C1 _open="x" />
1717
module C0 = {
1818
@react.component
1919
let make =
20-
(@as("open") ~_open) => React.string(_open)
20+
(@as("open") ~_open, @as("type") ~_type: string) => React.string(_open)
2121
}
2222
module C1 = {
2323
@react.component
24-
external make: (@as("open") ~_open: string) => React.element = "default"
24+
external make: (@as("open") ~_open: string, @as("type") ~_type: string) => React.element =
25+
"default"
2526
}
2627

27-
let c0 = <C0 _open="x" />
28-
let c1 = <C1 _open="x" />
28+
let c0 = <C0 _open="x" _type="t" />
29+
let c1 = <C1 _open="x" _type="t" />
2930

3031
@@jsxConfig({version: 4, mode: "automatic"})
3132

3233
module C0 = {
3334
@react.component
3435
let make =
35-
(@as("open") ~_open) => React.string(_open)
36+
(@as("open") ~_open, @as("type") ~_type: string) => React.string(_open)
3637
}
3738
module C1 = {
3839
@react.component
39-
external make: (@as("open") ~_open: string) => React.element = "default"
40+
external make: (@as("open") ~_open: string, @as("type") ~_type: string) => React.element =
41+
"default"
4042
}
4143

42-
let c0 = <C0 _open="x" />
43-
let c1 = <C1 _open="x" />
44+
let c0 = <C0 _open="x" _type="t" />
45+
let c1 = <C1 _open="x" _type="t" />

0 commit comments

Comments
 (0)