diff --git a/CHANGELOG.md b/CHANGELOG.md index a61d61a0..2d2623d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ ## Unreleased -## 9.0 +* Fix parsing of first class module exprs as part of binary/ternary expr in [#256](https://github.com/rescript-lang/syntax/pull/256) -* Fix parsing of poly-var typexpr consisting of one tag-spec-first in [254](https://github.com/rescript-lang/syntax/pull/254) +## ReScript 9.0.0 + +* Fix parsing of poly-var typexpr consisting of one tag-spec-first in [#254](https://github.com/rescript-lang/syntax/pull/254) * Implement new syntax for guards on pattern match cases in [#248](https://github.com/rescript-lang/syntax/pull/248) * Implement intelligent breaking for poly-var type expressions in [#246](https://github.com/rescript-lang/syntax/pull/246) * Improve indentation of fast pipe chain in let binding in [#244](https://github.com/rescript-lang/syntax/pull/244) diff --git a/src/res_core.ml b/src/res_core.ml index 9a884043..909bce4d 100644 --- a/src/res_core.ml +++ b/src/res_core.ml @@ -2961,7 +2961,10 @@ and parseExprBlockItem p = Parser.next p; begin match p.token with | Lparen -> - parseFirstClassModuleExpr ~startPos p + let expr = parseFirstClassModuleExpr ~startPos p in + let a = parsePrimaryExpr ~operand:expr p in + let expr = parseBinaryExpr ~a p 1 in + parseTernaryExpr expr p | _ -> let name = match p.Parser.token with | Uident ident -> @@ -5558,6 +5561,9 @@ and parseModuleOrModuleTypeImplOrPackExpr ~attrs p = | Typ -> parseModuleTypeImpl ~attrs startPos p | Lparen -> let expr = parseFirstClassModuleExpr ~startPos p in + let a = parsePrimaryExpr ~operand:expr p in + let expr = parseBinaryExpr ~a p 1 in + let expr = parseTernaryExpr expr p in Ast_helper.Str.eval ~attrs expr | _ -> parseMaybeRecModuleBinding ~attrs ~startPos p diff --git a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap index a21a0864..c765d39e 100644 --- a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap @@ -470,7 +470,41 @@ let build_dispatch_table handlers = [@ns.namedArgLoc ]) table) [@ns.braces ]) ;;(module Three) -;;((module Three) : (module X_int))" +;;((module Three) : (module X_int)) +;;(module Teenager).(0) +;;((module Teenager) |. age) |. Js.log +;;((module Teenager).(0)) |. Js.log +;;((if ((module Teenager) |. age) |. isAdult + then Js.log \\"has responsibilities\\" + else Js.log \\"can play in the playground\\")[@ns.ternary ]) +;;((if ((module Streets).(0)) |. isExpensive + then Js.log \\"big money\\" + else Js.log \\"affordable\\")[@ns.ternary ]) +let () = ((((module Teenager) |. age) |. Js.log)[@ns.braces ]) +let () = (((module Teenager).(0))[@ns.braces ]) +let () = + ((if ((module Teenager) |. age) |. isAdult + then Js.log \\"has responsibilities\\" + else Js.log \\"can play in the playground\\") + [@ns.braces ][@ns.ternary ]) +let () = + ((if ((module Streets).(0)) |. isExpensive + then Js.log \\"big money\\" + else Js.log \\"affordable\\") + [@ns.braces ][@ns.ternary ]) +let () = + ((let a = 1 in + let b = 2 in (module Teenager).(0); ((module Teenager) |. age) |. Js.log) + [@ns.braces ]) +let () = + ((let a = 1 in + let b = 2 in + ((module Teenager) |. age) |. Js.log; + ((if (((module Teenager).(0)) |. age) |. isAdult + then Js.log \\"has responsibilities\\" + else Js.log \\"can play in the playground\\") + [@ns.ternary ])) + [@ns.braces ])" `; exports[`float.js 1`] = ` diff --git a/tests/parsing/grammar/expressions/firstClassModule.js b/tests/parsing/grammar/expressions/firstClassModule.js index d9c2b03a..e4c732b2 100644 --- a/tests/parsing/grammar/expressions/firstClassModule.js +++ b/tests/parsing/grammar/expressions/firstClassModule.js @@ -60,3 +60,36 @@ let build_dispatch_table = handlers => { module(Three) module(Three: X_int) + +module(Teenager)[0] +module(Teenager)->age->Js.log +module(Teenager)[0]->Js.log +module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground") +module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable") + +let () = { + module(Teenager)->age->Js.log +} +let () = { + module(Teenager)[0] +} +let () = { + module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground") +} +let () = { + module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable") +} + +let () = { + let a = 1 + let b = 2 + module(Teenager)[0] + module(Teenager)->age->Js.log +} + +let () = { + let a = 1 + let b = 2 + module(Teenager)->age->Js.log + module(Teenager)[0]->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground") +} diff --git a/tests/printer/expr/__snapshots__/render.spec.js.snap b/tests/printer/expr/__snapshots__/render.spec.js.snap index 612d33cd..fabb37ec 100644 --- a/tests/printer/expr/__snapshots__/render.spec.js.snap +++ b/tests/printer/expr/__snapshots__/render.spec.js.snap @@ -2032,6 +2032,45 @@ let three = module(Three) let x = @attr module(Foo) let x = @attr module(Foo: FirstClass) + +module(Teenager)[0] +module(Teenager)->age->Js.log +module(Teenager)[0]->Js.log +module(Teenager)->age->isAdult + ? Js.log(\\"has responsibilities\\") + : Js.log(\\"can play in the playground\\") +module(Streets)[0]->isExpensive ? Js.log(\\"big money\\") : Js.log(\\"affordable\\") + +let () = { + module(Teenager)->age->Js.log +} +let () = { + module(Teenager)[0] +} +let () = { + module(Teenager)->age->isAdult + ? Js.log(\\"has responsibilities\\") + : Js.log(\\"can play in the playground\\") +} +let () = { + module(Streets)[0]->isExpensive ? Js.log(\\"big money\\") : Js.log(\\"affordable\\") +} + +let () = { + let a = 1 + let b = 2 + module(Teenager)[0] + module(Teenager)->age->Js.log +} + +let () = { + let a = 1 + let b = 2 + module(Teenager)->age->Js.log + module(Teenager)[0]->age->isAdult + ? Js.log(\\"has responsibilities\\") + : Js.log(\\"can play in the playground\\") +} " `; diff --git a/tests/printer/expr/firstClassModule.js b/tests/printer/expr/firstClassModule.js index e1c30b88..ed6d576f 100644 --- a/tests/printer/expr/firstClassModule.js +++ b/tests/printer/expr/firstClassModule.js @@ -6,3 +6,38 @@ let three = module(Three) let x = @attr module(Foo) let x = @attr module(Foo: FirstClass) + +module(Teenager)[0] +module(Teenager)->age->Js.log +module(Teenager)[0]->Js.log +module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground") +module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable") + + +let () = { + module(Teenager)->age->Js.log +} +let () = { + module(Teenager)[0] +} +let () = { + module(Teenager)->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground") +} +let () = { + module(Streets)[0]->isExpensive ? Js.log("big money") : Js.log("affordable") +} + +let () = { + let a = 1 + let b = 2 + module(Teenager)[0] + module(Teenager)->age->Js.log +} + + +let () = { + let a = 1 + let b = 2 + module(Teenager)->age->Js.log + module(Teenager)[0]->age->isAdult ? Js.log("has responsibilities") : Js.log("can play in the playground") +}