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

Commit cf2d0c5

Browse files
Fix parsing of first class module exprs as part of binary/ternary expr (#256)
* Fix parsing of first class module exprs as part of binary/ternary expr * update changelog
1 parent 0f2ad69 commit cf2d0c5

File tree

6 files changed

+153
-4
lines changed

6 files changed

+153
-4
lines changed

CHANGELOG.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
## Unreleased
22

3-
## 9.0
3+
* Fix parsing of first class module exprs as part of binary/ternary expr in [#256](https://github.com/rescript-lang/syntax/pull/256)
44

5-
* Fix parsing of poly-var typexpr consisting of one tag-spec-first in [254](https://github.com/rescript-lang/syntax/pull/254)
5+
## ReScript 9.0.0
6+
7+
* Fix parsing of poly-var typexpr consisting of one tag-spec-first in [#254](https://github.com/rescript-lang/syntax/pull/254)
68
* Implement new syntax for guards on pattern match cases in [#248](https://github.com/rescript-lang/syntax/pull/248)
79
* Implement intelligent breaking for poly-var type expressions in [#246](https://github.com/rescript-lang/syntax/pull/246)
810
* Improve indentation of fast pipe chain in let binding in [#244](https://github.com/rescript-lang/syntax/pull/244)

src/res_core.ml

+7-1
Original file line numberDiff line numberDiff line change
@@ -2961,7 +2961,10 @@ and parseExprBlockItem p =
29612961
Parser.next p;
29622962
begin match p.token with
29632963
| Lparen ->
2964-
parseFirstClassModuleExpr ~startPos p
2964+
let expr = parseFirstClassModuleExpr ~startPos p in
2965+
let a = parsePrimaryExpr ~operand:expr p in
2966+
let expr = parseBinaryExpr ~a p 1 in
2967+
parseTernaryExpr expr p
29652968
| _ ->
29662969
let name = match p.Parser.token with
29672970
| Uident ident ->
@@ -5558,6 +5561,9 @@ and parseModuleOrModuleTypeImplOrPackExpr ~attrs p =
55585561
| Typ -> parseModuleTypeImpl ~attrs startPos p
55595562
| Lparen ->
55605563
let expr = parseFirstClassModuleExpr ~startPos p in
5564+
let a = parsePrimaryExpr ~operand:expr p in
5565+
let expr = parseBinaryExpr ~a p 1 in
5566+
let expr = parseTernaryExpr expr p in
55615567
Ast_helper.Str.eval ~attrs expr
55625568
| _ -> parseMaybeRecModuleBinding ~attrs ~startPos p
55635569

tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap

+35-1
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,41 @@ let build_dispatch_table handlers =
470470
[@ns.namedArgLoc ]) table)
471471
[@ns.braces ])
472472
;;(module Three)
473-
;;((module Three) : (module X_int))"
473+
;;((module Three) : (module X_int))
474+
;;(module Teenager).(0)
475+
;;((module Teenager) |. age) |. Js.log
476+
;;((module Teenager).(0)) |. Js.log
477+
;;((if ((module Teenager) |. age) |. isAdult
478+
then Js.log \\"has responsibilities\\"
479+
else Js.log \\"can play in the playground\\")[@ns.ternary ])
480+
;;((if ((module Streets).(0)) |. isExpensive
481+
then Js.log \\"big money\\"
482+
else Js.log \\"affordable\\")[@ns.ternary ])
483+
let () = ((((module Teenager) |. age) |. Js.log)[@ns.braces ])
484+
let () = (((module Teenager).(0))[@ns.braces ])
485+
let () =
486+
((if ((module Teenager) |. age) |. isAdult
487+
then Js.log \\"has responsibilities\\"
488+
else Js.log \\"can play in the playground\\")
489+
[@ns.braces ][@ns.ternary ])
490+
let () =
491+
((if ((module Streets).(0)) |. isExpensive
492+
then Js.log \\"big money\\"
493+
else Js.log \\"affordable\\")
494+
[@ns.braces ][@ns.ternary ])
495+
let () =
496+
((let a = 1 in
497+
let b = 2 in (module Teenager).(0); ((module Teenager) |. age) |. Js.log)
498+
[@ns.braces ])
499+
let () =
500+
((let a = 1 in
501+
let b = 2 in
502+
((module Teenager) |. age) |. Js.log;
503+
((if (((module Teenager).(0)) |. age) |. isAdult
504+
then Js.log \\"has responsibilities\\"
505+
else Js.log \\"can play in the playground\\")
506+
[@ns.ternary ]))
507+
[@ns.braces ])"
474508
`;
475509
476510
exports[`float.js 1`] = `

tests/parsing/grammar/expressions/firstClassModule.js

+33
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,36 @@ let build_dispatch_table = handlers => {
6060

6161
module(Three)
6262
module(Three: X_int)
63+
64+
module(Teenager)[0]
65+
module(Teenager)->age->Js.log
66+
module(Teenager)[0]->Js.log
67+
module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground")
68+
module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable")
69+
70+
let () = {
71+
module(Teenager)->age->Js.log
72+
}
73+
let () = {
74+
module(Teenager)[0]
75+
}
76+
let () = {
77+
module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground")
78+
}
79+
let () = {
80+
module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable")
81+
}
82+
83+
let () = {
84+
let a = 1
85+
let b = 2
86+
module(Teenager)[0]
87+
module(Teenager)->age->Js.log
88+
}
89+
90+
let () = {
91+
let a = 1
92+
let b = 2
93+
module(Teenager)->age->Js.log
94+
module(Teenager)[0]->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground")
95+
}

tests/printer/expr/__snapshots__/render.spec.js.snap

+39
Original file line numberDiff line numberDiff line change
@@ -2032,6 +2032,45 @@ let three = module(Three)
20322032
20332033
let x = @attr module(Foo)
20342034
let x = @attr module(Foo: FirstClass)
2035+
2036+
module(Teenager)[0]
2037+
module(Teenager)->age->Js.log
2038+
module(Teenager)[0]->Js.log
2039+
module(Teenager)->age->isAdult
2040+
? Js.log(\\"has responsibilities\\")
2041+
: Js.log(\\"can play in the playground\\")
2042+
module(Streets)[0]->isExpensive ? Js.log(\\"big money\\") : Js.log(\\"affordable\\")
2043+
2044+
let () = {
2045+
module(Teenager)->age->Js.log
2046+
}
2047+
let () = {
2048+
module(Teenager)[0]
2049+
}
2050+
let () = {
2051+
module(Teenager)->age->isAdult
2052+
? Js.log(\\"has responsibilities\\")
2053+
: Js.log(\\"can play in the playground\\")
2054+
}
2055+
let () = {
2056+
module(Streets)[0]->isExpensive ? Js.log(\\"big money\\") : Js.log(\\"affordable\\")
2057+
}
2058+
2059+
let () = {
2060+
let a = 1
2061+
let b = 2
2062+
module(Teenager)[0]
2063+
module(Teenager)->age->Js.log
2064+
}
2065+
2066+
let () = {
2067+
let a = 1
2068+
let b = 2
2069+
module(Teenager)->age->Js.log
2070+
module(Teenager)[0]->age->isAdult
2071+
? Js.log(\\"has responsibilities\\")
2072+
: Js.log(\\"can play in the playground\\")
2073+
}
20352074
"
20362075
`;
20372076

tests/printer/expr/firstClassModule.js

+35
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,38 @@ let three = module(Three)
66

77
let x = @attr module(Foo)
88
let x = @attr module(Foo: FirstClass)
9+
10+
module(Teenager)[0]
11+
module(Teenager)->age->Js.log
12+
module(Teenager)[0]->Js.log
13+
module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground")
14+
module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable")
15+
16+
17+
let () = {
18+
module(Teenager)->age->Js.log
19+
}
20+
let () = {
21+
module(Teenager)[0]
22+
}
23+
let () = {
24+
module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground")
25+
}
26+
let () = {
27+
module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable")
28+
}
29+
30+
let () = {
31+
let a = 1
32+
let b = 2
33+
module(Teenager)[0]
34+
module(Teenager)->age->Js.log
35+
}
36+
37+
38+
let () = {
39+
let a = 1
40+
let b = 2
41+
module(Teenager)->age->Js.log
42+
module(Teenager)[0]->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground")
43+
}

0 commit comments

Comments
 (0)