Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit a1f8081

Browse files
committed
make record type for props with attrs
1 parent 1255eb4 commit a1f8081

File tree

3 files changed

+65
-44
lines changed

3 files changed

+65
-44
lines changed

cli/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 =
@@ -757,15 +761,19 @@ let transformStructureItem ~config mapper item =
757761
|> Option.map React_jsx_common.typVarsOfCoreType
758762
|> Option.value ~default:[]
759763
in
760-
let rec getPropTypes types ({ptyp_loc; ptyp_desc} as fullType) =
764+
let rec getPropTypes types
765+
({ptyp_loc; ptyp_desc; ptyp_attributes} as fullType) =
761766
match ptyp_desc with
762767
| Ptyp_arrow (name, type_, ({ptyp_desc = Ptyp_arrow _} as rest))
763768
when isLabelled name || isOptional name ->
764-
getPropTypes ((name, ptyp_loc, type_) :: types) rest
769+
getPropTypes
770+
((name, ptyp_attributes, ptyp_loc, type_) :: types)
771+
rest
765772
| Ptyp_arrow (Nolabel, _type, rest) -> getPropTypes types rest
766773
| Ptyp_arrow (name, type_, returnValue)
767774
when isLabelled name || isOptional name ->
768-
(returnValue, (name, returnValue.ptyp_loc, type_) :: types)
775+
( returnValue,
776+
(name, ptyp_attributes, returnValue.ptyp_loc, type_) :: types )
769777
| _ -> (fullType, types)
770778
in
771779
let innerType, propTypes = getPropTypes [] pval_type in
@@ -1237,19 +1245,22 @@ let transformSignatureItem ~config _mapper item =
12371245
in
12381246
let rec getPropTypes types ({ptyp_loc; ptyp_desc} as fullType) =
12391247
match ptyp_desc with
1240-
| Ptyp_arrow (name, type_, ({ptyp_desc = Ptyp_arrow _} as rest))
1248+
| Ptyp_arrow
1249+
( name,
1250+
({ptyp_attributes = attrs} as type_),
1251+
({ptyp_desc = Ptyp_arrow _} as rest) )
12411252
when isOptional name || isLabelled name ->
1242-
getPropTypes ((name, ptyp_loc, type_) :: types) rest
1253+
getPropTypes ((name, attrs, ptyp_loc, type_) :: types) rest
12431254
| Ptyp_arrow
12441255
(Nolabel, {ptyp_desc = Ptyp_constr ({txt = Lident "unit"}, _)}, rest)
12451256
->
12461257
getPropTypes types rest
12471258
| Ptyp_arrow (Nolabel, _type, rest) ->
12481259
hasForwardRef := true;
12491260
getPropTypes types rest
1250-
| Ptyp_arrow (name, type_, returnValue)
1261+
| Ptyp_arrow (name, ({ptyp_attributes = attrs} as type_), returnValue)
12511262
when isOptional name || isLabelled name ->
1252-
(returnValue, (name, returnValue.ptyp_loc, type_) :: types)
1263+
(returnValue, (name, attrs, returnValue.ptyp_loc, type_) :: types)
12531264
| _ -> (fullType, types)
12541265
in
12551266
let innerType, propTypes = getPropTypes [] pval_type in

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

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module C0 = {
44
@obj external makeProps: (~_open: 'T_open, ~key: string=?, unit) => {"_open": 'T_open} = ""
55

6-
@react.component let make = (@warning("-16") ~_open) => React.string(_open)
6+
@react.component let make = @warning("-16") (~_open) => React.string(_open)
77
let make = {
88
let \"MangleKeyword$C0" = (\"Props": {"_open": 'T_open}) => make(~_open=\"Props"["_open"])
99
\"MangleKeyword$C0"
@@ -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 = ({_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 = ({_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"})

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)