Skip to content

Commit 3b0018d

Browse files
committed
Initial mapping of Pexp_jsx_fragment to 0
1 parent d3c4f6e commit 3b0018d

File tree

4 files changed

+48
-32
lines changed

4 files changed

+48
-32
lines changed

compiler/ml/ast_helper.ml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,31 @@ module Exp = struct
184184
mk ?loc ?attrs (Pexp_jsx_fragment (a, b, c))
185185

186186
let case lhs ?guard rhs = {pc_lhs = lhs; pc_guard = guard; pc_rhs = rhs}
187+
188+
let make_list_expression loc seq ext_opt =
189+
let rec handle_seq = function
190+
| [] -> (
191+
match ext_opt with
192+
| Some ext -> ext
193+
| None ->
194+
let loc = {loc with Location.loc_ghost = true} in
195+
let nil = Location.mkloc (Longident.Lident "[]") loc in
196+
construct ~loc nil None)
197+
| e1 :: el ->
198+
let exp_el = handle_seq el in
199+
let loc =
200+
Location.
201+
{
202+
loc_start = e1.Parsetree.pexp_loc.Location.loc_start;
203+
loc_end = exp_el.pexp_loc.loc_end;
204+
loc_ghost = false;
205+
}
206+
in
207+
let arg = tuple ~loc [e1; exp_el] in
208+
construct ~loc (Location.mkloc (Longident.Lident "::") loc) (Some arg)
209+
in
210+
let expr = handle_seq seq in
211+
{expr with pexp_loc = loc}
187212
end
188213

189214
module Mty = struct

compiler/ml/ast_helper.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ module Exp : sig
217217
expression
218218

219219
val case : pattern -> ?guard:expression -> expression -> case
220+
221+
val make_list_expression :
222+
Location.t -> expression list -> expression option -> expression
220223
end
221224

222225
(** Value declarations *)

compiler/ml/ast_mapper_to0.ml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,15 @@ module E = struct
288288
let loc = sub.location sub loc in
289289
let attrs = sub.attributes sub attrs in
290290
match desc with
291-
| Pexp_jsx_fragment _ -> failwith "TODO Pexp_jsx_fragment 4"
291+
| Pexp_jsx_fragment (_, xs, _) ->
292+
(* TODO: tweak location slightly *)
293+
let list_expr = Ast_helper.Exp.make_list_expression loc xs None in
294+
let mapped = sub.expr sub list_expr in
295+
let jsx_attr =
296+
sub.attribute sub (Location.mknoloc "JSX", Parsetree.PStr [])
297+
in
298+
{mapped with pexp_attributes = jsx_attr :: attrs}
299+
(* failwith "TODO Pexp_jsx_fragment 4" *)
292300
| Pexp_ident x -> ident ~loc ~attrs (map_loc sub x)
293301
| Pexp_constant x -> constant ~loc ~attrs (map_constant x)
294302
| Pexp_let (r, vbs, e) ->

compiler/syntax/src/res_core.ml

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -435,28 +435,6 @@ let make_unary_expr start_pos token_end token operand =
435435
[(Nolabel, operand)]
436436
| _ -> operand
437437

438-
let make_list_expression loc seq ext_opt =
439-
let rec handle_seq = function
440-
| [] -> (
441-
match ext_opt with
442-
| Some ext -> ext
443-
| None ->
444-
let loc = {loc with Location.loc_ghost = true} in
445-
let nil = Location.mkloc (Longident.Lident "[]") loc in
446-
Ast_helper.Exp.construct ~loc nil None)
447-
| e1 :: el ->
448-
let exp_el = handle_seq el in
449-
let loc =
450-
mk_loc e1.Parsetree.pexp_loc.Location.loc_start exp_el.pexp_loc.loc_end
451-
in
452-
let arg = Ast_helper.Exp.tuple ~loc [e1; exp_el] in
453-
Ast_helper.Exp.construct ~loc
454-
(Location.mkloc (Longident.Lident "::") loc)
455-
(Some arg)
456-
in
457-
let expr = handle_seq seq in
458-
{expr with pexp_loc = loc}
459-
460438
let make_list_pattern loc seq ext_opt =
461439
let rec handle_seq = function
462440
| [] ->
@@ -2616,7 +2594,7 @@ and parse_jsx_opening_or_self_closing_element ~start_pos p =
26162594
Scanner.pop_mode p.scanner Jsx;
26172595
Parser.expect GreaterThan p;
26182596
let loc = mk_loc children_start_pos children_end_pos in
2619-
make_list_expression loc [] None (* no children *)
2597+
Ast_helper.Exp.make_list_expression loc [] None (* no children *)
26202598
| GreaterThan -> (
26212599
(* <foo a=b> bar </foo> *)
26222600
let children_start_pos = p.Parser.start_pos in
@@ -2639,7 +2617,7 @@ and parse_jsx_opening_or_self_closing_element ~start_pos p =
26392617
let loc = mk_loc children_start_pos children_end_pos in
26402618
match (spread, children) with
26412619
| true, child :: _ -> child
2642-
| _ -> make_list_expression loc children None)
2620+
| _ -> Ast_helper.Exp.make_list_expression loc children None)
26432621
| token -> (
26442622
Scanner.pop_mode p.scanner Jsx;
26452623
let () =
@@ -2660,11 +2638,11 @@ and parse_jsx_opening_or_self_closing_element ~start_pos p =
26602638
let loc = mk_loc children_start_pos children_end_pos in
26612639
match (spread, children) with
26622640
| true, child :: _ -> child
2663-
| _ -> make_list_expression loc children None))
2641+
| _ -> Ast_helper.Exp.make_list_expression loc children None))
26642642
| token ->
26652643
Scanner.pop_mode p.scanner Jsx;
26662644
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);
2667-
make_list_expression Location.none [] None
2645+
Ast_helper.Exp.make_list_expression Location.none [] None
26682646
in
26692647
let jsx_end_pos = p.prev_end_pos in
26702648
let loc = mk_loc jsx_start_pos jsx_end_pos in
@@ -3864,9 +3842,10 @@ and parse_list_expr ~start_pos p =
38643842
in
38653843
let make_sub_expr = function
38663844
| exprs, Some spread, start_pos, end_pos ->
3867-
make_list_expression (mk_loc start_pos end_pos) exprs (Some spread)
3845+
Ast_helper.Exp.make_list_expression (mk_loc start_pos end_pos) exprs
3846+
(Some spread)
38683847
| exprs, None, start_pos, end_pos ->
3869-
make_list_expression (mk_loc start_pos end_pos) exprs None
3848+
Ast_helper.Exp.make_list_expression (mk_loc start_pos end_pos) exprs None
38703849
in
38713850
let list_exprs_rev =
38723851
parse_comma_delimited_reversed_list p ~grammar:Grammar.ListExpr
@@ -3875,9 +3854,10 @@ and parse_list_expr ~start_pos p =
38753854
Parser.expect Rbrace p;
38763855
let loc = mk_loc start_pos p.prev_end_pos in
38773856
match split_by_spread list_exprs_rev with
3878-
| [] -> make_list_expression loc [] None
3879-
| [(exprs, Some spread, _, _)] -> make_list_expression loc exprs (Some spread)
3880-
| [(exprs, None, _, _)] -> make_list_expression loc exprs None
3857+
| [] -> Ast_helper.Exp.make_list_expression loc [] None
3858+
| [(exprs, Some spread, _, _)] ->
3859+
Ast_helper.Exp.make_list_expression loc exprs (Some spread)
3860+
| [(exprs, None, _, _)] -> Ast_helper.Exp.make_list_expression loc exprs None
38813861
| exprs ->
38823862
let list_exprs = List.map make_sub_expr exprs in
38833863
Ast_helper.Exp.apply ~loc

0 commit comments

Comments
 (0)