Skip to content

Commit 481d6b2

Browse files
committed
Implement spread array printer
1 parent 9ce17ba commit 481d6b2

File tree

4 files changed

+83
-2
lines changed

4 files changed

+83
-2
lines changed

jscomp/syntax/src/res_core.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4006,8 +4006,9 @@ and parseArrayExp p =
40064006
let collectExprs = function
40074007
| [], Some spread, _startPos, _endPos -> [spread]
40084008
| exprs, Some spread, _startPos, _endPos -> (
4009-
let els = Ast_helper.Exp.array ~loc exprs
4010-
in [els; spread])
4009+
let els = Ast_helper.Exp.array ~loc exprs in
4010+
let _spread_expr = {spread with Parsetree.pexp_attributes = [spreadAttr]} in
4011+
[els; spread])
40114012
| exprs, None, _startPos, _endPos -> (
40124013
let els = Ast_helper.Exp.array ~loc exprs
40134014
in [els])

jscomp/syntax/src/res_parsetree_viewer.ml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ let hasAwaitAttribute attrs =
104104
| _ -> false)
105105
attrs
106106

107+
let collectArrayExpressions expr =
108+
match expr.pexp_desc with
109+
| Pexp_array exprs -> (exprs, None)
110+
| _ -> ([], Some expr)
111+
107112
let collectListExpressions expr =
108113
let rec collect acc expr =
109114
match expr.pexp_desc with
@@ -678,6 +683,17 @@ let isSpreadBeltListConcat expr =
678683
hasSpreadAttr expr.pexp_attributes
679684
| _ -> false
680685

686+
let isSpreadBeltArrayConcat expr =
687+
match expr.pexp_desc with
688+
| Pexp_ident
689+
{
690+
txt =
691+
Longident.Ldot
692+
(Longident.Ldot (Longident.Lident "Belt", "Array"), "concatMany");
693+
} ->
694+
hasSpreadAttr expr.pexp_attributes
695+
| _ -> false
696+
681697
(* Blue | Red | Green -> [Blue; Red; Green] *)
682698
let collectOrPatternChain pat =
683699
let rec loop pattern chain =

jscomp/syntax/src/res_parsetree_viewer.mli

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ val collectIfExpressions :
4646
(Location.t * ifConditionKind * Parsetree.expression) list
4747
* Parsetree.expression option
4848

49+
val collectArrayExpressions :
50+
Parsetree.expression ->
51+
Parsetree.expression list * Parsetree.expression option
52+
4953
val collectListExpressions :
5054
Parsetree.expression ->
5155
Parsetree.expression list * Parsetree.expression option
@@ -142,6 +146,8 @@ val hasTemplateLiteralAttr : Parsetree.attributes -> bool
142146

143147
val isSpreadBeltListConcat : Parsetree.expression -> bool
144148

149+
val isSpreadBeltArrayConcat : Parsetree.expression -> bool
150+
145151
val collectOrPatternChain : Parsetree.pattern -> Parsetree.pattern list
146152

147153
val processBracesAttr :

jscomp/syntax/src/res_printer.ml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3046,6 +3046,9 @@ and printExpression ~state (e : Parsetree.expression) cmtTbl =
30463046
Doc.rbrace;
30473047
])
30483048
| extension -> printExtension ~state ~atModuleLvl:false extension cmtTbl)
3049+
| Pexp_apply (e, [(Nolabel, {pexp_desc = Pexp_array subLists})])
3050+
when ParsetreeViewer.isSpreadBeltArrayConcat e ->
3051+
printBeltArrayConcatApply ~state subLists cmtTbl
30493052
| Pexp_apply (e, [(Nolabel, {pexp_desc = Pexp_array subLists})])
30503053
when ParsetreeViewer.isSpreadBeltListConcat e ->
30513054
printBeltListConcatApply ~state subLists cmtTbl
@@ -3813,6 +3816,61 @@ and printBinaryExpression ~state (expr : Parsetree.expression) cmtTbl =
38133816
])
38143817
| _ -> Doc.nil
38153818

3819+
and printBeltArrayConcatApply ~state subLists cmtTbl =
3820+
let makeSpreadDoc commaBeforeSpread = function
3821+
| Some expr ->
3822+
Doc.concat
3823+
[
3824+
commaBeforeSpread;
3825+
Doc.dotdotdot;
3826+
(let doc = printExpressionWithComments ~state expr cmtTbl in
3827+
match Parens.expr expr with
3828+
| Parens.Parenthesized -> addParens doc
3829+
| Braced braces -> printBraces doc expr braces
3830+
| Nothing -> doc);
3831+
]
3832+
| None -> Doc.nil
3833+
in
3834+
let makeSubListDoc (expressions, spread) =
3835+
let commaBeforeSpread =
3836+
match expressions with
3837+
| [] -> Doc.nil
3838+
| _ -> Doc.concat [Doc.text ","; Doc.line]
3839+
in
3840+
let spreadDoc = makeSpreadDoc commaBeforeSpread spread in
3841+
Doc.concat
3842+
[
3843+
Doc.join
3844+
~sep:(Doc.concat [Doc.text ","; Doc.line])
3845+
(List.map
3846+
(fun expr ->
3847+
let doc = printExpressionWithComments ~state expr cmtTbl in
3848+
match Parens.expr expr with
3849+
| Parens.Parenthesized -> addParens doc
3850+
| Braced braces -> printBraces doc expr braces
3851+
| Nothing -> doc)
3852+
expressions);
3853+
spreadDoc;
3854+
]
3855+
in
3856+
Doc.group
3857+
(Doc.concat
3858+
[
3859+
Doc.lbracket;
3860+
Doc.indent
3861+
(Doc.concat
3862+
[
3863+
Doc.softLine;
3864+
Doc.join
3865+
~sep:(Doc.concat [Doc.text ","; Doc.line])
3866+
(List.map makeSubListDoc
3867+
(List.map ParsetreeViewer.collectArrayExpressions subLists));
3868+
]);
3869+
Doc.trailingComma;
3870+
Doc.softLine;
3871+
Doc.rbracket;
3872+
])
3873+
38163874
and printBeltListConcatApply ~state subLists cmtTbl =
38173875
let makeSpreadDoc commaBeforeSpread = function
38183876
| Some expr ->

0 commit comments

Comments
 (0)