From 9cf524c66ce973b3bd2d4023774e5af1607eb74f Mon Sep 17 00:00:00 2001 From: Christoph Knittel Date: Thu, 24 Mar 2022 19:29:58 +0100 Subject: [PATCH 1/3] Print punned fields --- src/res_printer.ml | 37 +++++++++++++------ .../reason/expected/bracedJsx.re.txt | 2 +- .../conversion/reason/expected/braces.re.txt | 2 +- tests/printer/expr/expected/block.res.txt | 2 +- tests/printer/expr/expected/record.res.txt | 9 +++++ tests/printer/expr/record.res | 10 +++++ 6 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/res_printer.ml b/src/res_printer.ml index e68b25f7..bdd8b424 100644 --- a/src/res_printer.ml +++ b/src/res_printer.ml @@ -2807,6 +2807,10 @@ and printExpression (e : Parsetree.expression) cmtTbl = let forceBreak = e.pexp_loc.loc_start.pos_lnum < e.pexp_loc.loc_end.pos_lnum in + let punningAllowed = match spreadExpr with + | Some(_) -> true + | None -> List.length rows > 1 + in Doc.breakableGroup ~forceBreak ( Doc.concat([ Doc.lbrace; @@ -2815,7 +2819,7 @@ and printExpression (e : Parsetree.expression) cmtTbl = Doc.softLine; spread; Doc.join ~sep:(Doc.concat [Doc.text ","; Doc.line]) - (List.map (fun row -> printRecordRow row cmtTbl) rows) + (List.map (fun row -> printRecordRow row cmtTbl punningAllowed) rows) ] ); Doc.trailingComma; @@ -4818,17 +4822,28 @@ and printDirectionFlag flag = match flag with | Asttypes.Downto -> Doc.text " downto " | Asttypes.Upto -> Doc.text " to " -and printRecordRow (lbl, expr) cmtTbl = +and printRecordRow (lbl, expr) cmtTbl punningAllowed = let cmtLoc = {lbl.loc with loc_end = expr.pexp_loc.loc_end} in - let doc = Doc.group (Doc.concat [ - printLidentPath lbl cmtTbl; - Doc.text ": "; - (let doc = printExpressionWithComments expr cmtTbl in - match Parens.expr expr with - | Parens.Parenthesized -> addParens doc - | Braced braces -> printBraces doc expr braces - | Nothing -> doc); - ]) in + let doc = Doc.group ( + match expr.pexp_desc with + | Pexp_ident({txt = Lident key; loc = keyLoc}) when ( + punningAllowed && + Longident.last lbl.txt = key && + lbl.loc.loc_start.pos_cnum == keyLoc.loc_start.pos_cnum + ) -> + (* print punned field *) + printLidentPath lbl cmtTbl; + | _ -> + Doc.concat [ + printLidentPath lbl cmtTbl; + Doc.text ": "; + (let doc = printExpressionWithComments expr cmtTbl in + match Parens.expr expr with + | Parens.Parenthesized -> addParens doc + | Braced braces -> printBraces doc expr braces + | Nothing -> doc); + ] + ) in printComments doc cmtTbl cmtLoc and printBsObjectRow (lbl, expr) cmtTbl = diff --git a/tests/conversion/reason/expected/bracedJsx.re.txt b/tests/conversion/reason/expected/bracedJsx.re.txt index 27f93d34..b49e82fe 100644 --- a/tests/conversion/reason/expected/bracedJsx.re.txt +++ b/tests/conversion/reason/expected/bracedJsx.re.txt @@ -91,7 +91,7 @@ let make = () => { ], ), } - | SetValue(input) => {...state, input: input} + | SetValue(input) => {...state, input} } , {history: [], input: ""}) diff --git a/tests/conversion/reason/expected/braces.re.txt b/tests/conversion/reason/expected/braces.re.txt index cf164c93..0a3e335d 100644 --- a/tests/conversion/reason/expected/braces.re.txt +++ b/tests/conversion/reason/expected/braces.re.txt @@ -20,5 +20,5 @@ let getDailyNewCases = x => | Pair({prevRecord, record}) => let confirmed = record.confirmed - prevRecord.confirmed let deaths = record.deaths - prevRecord.deaths - {confirmed: confirmed, deaths: deaths} + {confirmed, deaths} } diff --git a/tests/printer/expr/expected/block.res.txt b/tests/printer/expr/expected/block.res.txt index 8333405a..d7d8068b 100644 --- a/tests/printer/expr/expected/block.res.txt +++ b/tests/printer/expr/expected/block.res.txt @@ -60,7 +60,7 @@ React.useEffect0(() => { switch videoContainerRect { | Some(videoContainerRect) => let newChapter = ({startTime: percent *. duration}: Video.chapter) - {a: a, b: b}->onChange + {a, b}->onChange | _ => () } }} diff --git a/tests/printer/expr/expected/record.res.txt b/tests/printer/expr/expected/record.res.txt index 9226003d..e977aa83 100644 --- a/tests/printer/expr/expected/record.res.txt +++ b/tests/printer/expr/expected/record.res.txt @@ -39,3 +39,12 @@ let user = { } // braced + constrained expr let user = {name: {(ceo.name: string)}} + +// Punning +let r = {a} // actually not a record, just an expression in braces +let r = {a, b} +let r = {a, b, c: 42} +let r = {A.a, b} +let r = {A.a: a, b} +let r = {a: a, b} +let r = {a, b: b} diff --git a/tests/printer/expr/record.res b/tests/printer/expr/record.res index 55e655e8..0d460829 100644 --- a/tests/printer/expr/record.res +++ b/tests/printer/expr/record.res @@ -28,3 +28,13 @@ let user = {name: { }} // braced + constrained expr let user = {name: {(ceo.name: string)}} + + +// Punning +let r = {a} // actually not a record, just an expression in braces +let r = {a, b} +let r = {a, b, c: 42} +let r = {A.a, b} +let r = {A.a: a, b} +let r = {a: a, b} +let r = {a, b: b} \ No newline at end of file From 9baf3c11ff024962f6cbc875ec1ac2e950d2389e Mon Sep 17 00:00:00 2001 From: Christoph Knittel Date: Fri, 25 Mar 2022 07:18:05 +0100 Subject: [PATCH 2/3] Avoid List.length --- src/res_printer.ml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/res_printer.ml b/src/res_printer.ml index bdd8b424..5506039d 100644 --- a/src/res_printer.ml +++ b/src/res_printer.ml @@ -2807,9 +2807,9 @@ and printExpression (e : Parsetree.expression) cmtTbl = let forceBreak = e.pexp_loc.loc_start.pos_lnum < e.pexp_loc.loc_end.pos_lnum in - let punningAllowed = match spreadExpr with - | Some(_) -> true - | None -> List.length rows > 1 + let punningAllowed = match spreadExpr, rows with + | (None, [_]) -> false (* disallow punning for single-element records *) + | _ -> true in Doc.breakableGroup ~forceBreak ( Doc.concat([ From dee565d3650659ca5176975de840648b0f6fc38c Mon Sep 17 00:00:00 2001 From: Christoph Knittel Date: Mon, 28 Mar 2022 16:35:00 +0200 Subject: [PATCH 3/3] Add test cases for punning + comments --- tests/printer/expr/expected/record.res.txt | 23 ++++++++++++++++++++ tests/printer/expr/record.res | 25 +++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/tests/printer/expr/expected/record.res.txt b/tests/printer/expr/expected/record.res.txt index e977aa83..576cd48c 100644 --- a/tests/printer/expr/expected/record.res.txt +++ b/tests/printer/expr/expected/record.res.txt @@ -48,3 +48,26 @@ let r = {A.a, b} let r = {A.a: a, b} let r = {a: a, b} let r = {a, b: b} + +// Punning + comments +let r = { + // a + a, + // b + b, +} +let r = { + a, // a + b, // b +} +let r = { + /* a */ + a, + /* b */ + b, +} +let r = { + a /* a */, + b /* b */, +} +let r = {a /* a */, b /* b */} diff --git a/tests/printer/expr/record.res b/tests/printer/expr/record.res index 0d460829..4cb993c9 100644 --- a/tests/printer/expr/record.res +++ b/tests/printer/expr/record.res @@ -37,4 +37,27 @@ let r = {a, b, c: 42} let r = {A.a, b} let r = {A.a: a, b} let r = {a: a, b} -let r = {a, b: b} \ No newline at end of file +let r = {a, b: b} + +// Punning + comments +let r = { + // a + a, + // b + b, +} +let r = { + a, // a + b, // b +} +let r = { + /* a */ + a, + /* b */ + b, +} +let r = { + a /* a */, + b /* b */, +} +let r = {a /* a */, b /* b */}