From 7770a12fc6b88798d8eeb3c7ffc6a38363f370c2 Mon Sep 17 00:00:00 2001 From: Iwan Date: Sat, 3 Apr 2021 11:38:37 +0200 Subject: [PATCH] Fix parsing of arrow expressions in ternaries. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arrow functions in the "ternary true branch" where picked up as nested arrows: `x ? y => () : onChange` for the parser was `x ? y => (() : onChange => …)` The fix is to pass the right context through. Fixes https://github.com/rescript-lang/syntax/issues/363 --- src/res_core.ml | 6 +++--- tests/printer/expr/__snapshots__/render.spec.js.snap | 3 +++ tests/printer/expr/expected/ternary.res.txt | 3 +++ tests/printer/expr/ternary.res | 3 +++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/res_core.ml b/src/res_core.ml index 21e191e0..00027dbb 100644 --- a/src/res_core.ml +++ b/src/res_core.ml @@ -1576,7 +1576,7 @@ and parseTernaryExpr leftOperand p = | _ -> leftOperand -and parseEs6ArrowExpression ?parameters p = +and parseEs6ArrowExpression ?context ?parameters p = let startPos = p.Parser.startPos in Parser.leaveBreadcrumb p Grammar.Es6ArrowExpr; let parameters = match parameters with @@ -1592,7 +1592,7 @@ and parseEs6ArrowExpression ?parameters p = in Parser.expect EqualGreater p; let body = - let expr = parseExpr p in + let expr = parseExpr ?context p in match returnType with | Some typ -> Ast_helper.Exp.constraint_ @@ -2108,7 +2108,7 @@ and parseOperandExpr ~context p = if (context != WhenExpr) && isEs6ArrowExpression ~inTernary:(context=TernaryTrueBranchExpr) p then - parseEs6ArrowExpression p + parseEs6ArrowExpression ~context p else parseUnaryExpr p in diff --git a/tests/printer/expr/__snapshots__/render.spec.js.snap b/tests/printer/expr/__snapshots__/render.spec.js.snap index 3d36cb93..cd0dc5da 100644 --- a/tests/printer/expr/__snapshots__/render.spec.js.snap +++ b/tests/printer/expr/__snapshots__/render.spec.js.snap @@ -4037,6 +4037,9 @@ a => let x = @attrOnTernary (truth ? true : false) let x = @attrOnCondition truth ? true : false + +x ? y => () : onChange +let y = () : onChange} /> " `; diff --git a/tests/printer/expr/expected/ternary.res.txt b/tests/printer/expr/expected/ternary.res.txt index 09a8e216..197e5781 100644 --- a/tests/printer/expr/expected/ternary.res.txt +++ b/tests/printer/expr/expected/ternary.res.txt @@ -259,3 +259,6 @@ a => a ? aasdasdasdasdasdasdaaasdasdasdasdasdasdasdasdasdasdasdasdasdaaaaaaaaa : let x = @attrOnTernary (truth ? true : false) let x = @attrOnCondition truth ? true : false + +x ? y => () : onChange +let y = () : onChange} /> diff --git a/tests/printer/expr/ternary.res b/tests/printer/expr/ternary.res index 97c595e3..d8a8a360 100644 --- a/tests/printer/expr/ternary.res +++ b/tests/printer/expr/ternary.res @@ -121,3 +121,6 @@ a => a ? aasdasdasdasdasdasdaaasdasdasdasdasdasdasdasdasdasdasdasdasdaaaaaaaaa : let x = @attrOnTernary (truth ? true : false) let x = @attrOnCondition truth ? true : false + +x ? y => () : onChange +let y = () : onChange} />