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

Commit 677f225

Browse files
committed
Parse optional in first field when punned.
Fixes #583
1 parent 2258d18 commit 677f225

File tree

5 files changed

+36
-5
lines changed

5 files changed

+36
-5
lines changed

src/res_core.ml

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2676,6 +2676,7 @@ and parseJsxChildren p =
26762676
and parseBracedOrRecordExpr p =
26772677
let startPos = p.Parser.startPos in
26782678
Parser.expect Lbrace p;
2679+
let attrsForFields = parseAttributesForFields p in
26792680
match p.Parser.token with
26802681
| Rbrace ->
26812682
Parser.err p (Diagnostics.unexpected Rbrace p.breadcrumbs);
@@ -2752,7 +2753,16 @@ and parseBracedOrRecordExpr p =
27522753
| _ -> valueOrConstructor
27532754
in
27542755
let expr =
2755-
parseRecordExpr ~startPos [(pathIdent, valueOrConstructor)] p
2756+
parseRecordExpr ~startPos
2757+
[
2758+
( pathIdent,
2759+
{
2760+
valueOrConstructor with
2761+
pexp_attributes =
2762+
attrsForFields @ valueOrConstructor.pexp_attributes;
2763+
} );
2764+
]
2765+
p
27562766
in
27572767
Parser.expect Rbrace p;
27582768
expr
@@ -6253,9 +6263,29 @@ and parseAttribute p =
62536263
] )
62546264
| _ -> None
62556265

6266+
and parseAttributeForFields p =
6267+
let isAttributeForField p =
6268+
Parser.lookahead p (function state ->
6269+
(Parser.next state;
6270+
match state.token with
6271+
| Lident ident -> ident = "optional"
6272+
| _ -> false))
6273+
in
6274+
match p.Parser.token with
6275+
| At when isAttributeForField p ->
6276+
let startPos = p.startPos in
6277+
Parser.next p;
6278+
let attrId = parseAttributeId ~startPos p in
6279+
let payload = parsePayload p in
6280+
Some (attrId, payload)
6281+
| _ -> None
6282+
62566283
and parseAttributes p =
62576284
parseRegion p ~grammar:Grammar.Attribute ~f:parseAttribute
62586285

6286+
and parseAttributesForFields p =
6287+
parseRegion p ~grammar:Grammar.Attribute ~f:parseAttributeForFields
6288+
62596289
(*
62606290
* standalone-attribute ::=
62616291
* | @@ atribute-id

tests/parsing/grammar/expressions/expected/record.res.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ let r =
1919
z = ((None)[@optional ])
2020
}
2121
let z name = { name = ((name)[@optional ]); x = 3 }
22+
let z name = { name = ((name)[@optional ]); x = 3 }
2223
let z name = { name; x = ((x)[@optional ]) }
2324
let _ =
2425
match z with

tests/parsing/grammar/expressions/record.res

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ let r = {x: @optional None, y: @optional None, z: @optional None}
2828

2929
let z = name => { name : @optional name, x: 3}
3030

31-
// let z = name => { @optional name, x: 3}
31+
let z = name => { @optional name, x: 3}
3232

3333
let z = name => { name, @optional x }
3434

tests/printer/expr/expected/record.res.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ let z = name => {@optional name, x: 3}
8080

8181
let z = name => {@optional name, x: 3}
8282

83-
// let z = name => { @optional name, x: 3}
83+
let z = name => {name, @optional x}
8484

8585
let _ = switch z {
8686
| {x: @optional None, y: @optional None, z: @optional None} => 11

tests/printer/expr/record.res

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ let r = {x: @optional None, y: @optional None, z: @optional None}
6868

6969
let z = name => { name : @optional name, x: 3}
7070

71-
let z = name => { name : @optional name, x: 3}
71+
let z = name => { @optional name, x: 3}
7272

73-
// let z = name => { @optional name, x: 3}
73+
let z = name => { name, @optional x }
7474

7575
let _ = switch z {
7676
| {x: @optional None, y: @optional None, z: @optional None} => 11

0 commit comments

Comments
 (0)