@@ -232,6 +232,64 @@ type initialization = J.block
232232*)
233233
234234let compile output_prefix =
235+ let root_module_name (id : Ident.t ) =
236+ match String. index_opt id.name '$' with
237+ | Some index -> String. sub id.name 0 index
238+ | None -> id.name
239+ in
240+ let rec extract_nested_external_component_segments segments
241+ ((lam : Lam.t ), (make_dynamic_import : bool option ref )) :
242+ (Ident. t * bool * string list ) option =
243+ match lam with
244+ | Lprim
245+ {
246+ primitive = Pfield (_, Fld_module {name; jsx_component = _});
247+ args = [arg];
248+ _;
249+ } ->
250+ extract_nested_external_component_segments (name :: segments)
251+ (arg, make_dynamic_import)
252+ | Lvar id ->
253+ make_dynamic_import := Some false ;
254+ Some (id, false , List. rev segments)
255+ | Lglobal_module (id , dynamic_import ) ->
256+ make_dynamic_import := Some dynamic_import;
257+ Some (id, dynamic_import, List. rev segments)
258+ | _ -> None
259+ in
260+ let extract_nested_external_component_field (lam : Lam.t ) :
261+ (Ident. t * bool * string ) option =
262+ match lam with
263+ | Lprim
264+ {
265+ primitive = Pfield (_, Fld_module {name = " make" ; jsx_component = _});
266+ args = [arg];
267+ _;
268+ } -> (
269+ let dynamic_import = ref None in
270+ match
271+ extract_nested_external_component_segments [] (arg, dynamic_import)
272+ with
273+ | Some (id , dynamic_import , segments ) -> (
274+ let segments =
275+ match segments with
276+ | head :: rest
277+ when head = id.name
278+ || head = root_module_name id
279+ || Ext_string. starts_with head (root_module_name id ^ " $" ) ->
280+ rest
281+ | _ -> segments
282+ in
283+ match segments with
284+ | [] -> None
285+ | _ ->
286+ Some
287+ ( id,
288+ dynamic_import,
289+ String. concat " $" (root_module_name id :: segments) ))
290+ | None -> None )
291+ | _ -> None
292+ in
235293 let rec compile_external_field (* Like [List.empty]*)
236294 ?(dynamic_import = false ) (lamba_cxt : Lam_compile_context.t )
237295 (id : Ident.t ) name : Js_output.t =
@@ -300,6 +358,17 @@ let compile output_prefix =
300358 (Ext_list. append block args_code, b :: args)
301359 | _ -> assert false )
302360 in
361+ let args =
362+ if appinfo.ap_transformed_jsx then
363+ match (appinfo.ap_args, args) with
364+ | jsx_tag :: _ , _ :: rest_args -> (
365+ match extract_nested_external_component_field jsx_tag with
366+ | Some (id , dynamic_import , hidden_name ) ->
367+ E. ml_var_dot ~dynamic_import id hidden_name :: rest_args
368+ | None -> args)
369+ | _ -> args
370+ else args
371+ in
303372
304373 let fn = E. ml_var_dot ~dynamic_import module_id ident_info.name in
305374 let expression =
@@ -1524,6 +1593,17 @@ let compile output_prefix =
15241593 (Ext_list. append block args_code, b :: fn_code)
15251594 | {value = None } -> assert false )
15261595 in
1596+ let args =
1597+ if appinfo.ap_transformed_jsx then
1598+ match (appinfo.ap_args, args) with
1599+ | jsx_tag :: _ , _ :: rest_args -> (
1600+ match extract_nested_external_component_field jsx_tag with
1601+ | Some (id , dynamic_import , hidden_name ) ->
1602+ E. ml_var_dot ~dynamic_import id hidden_name :: rest_args
1603+ | None -> args)
1604+ | _ -> args
1605+ else args
1606+ in
15271607 match (ap_func, lambda_cxt.continuation) with
15281608 | ( Lvar fn_id,
15291609 ( EffectCall (Maybe_tail_is_return (Tail_with_name {label = Some ret}))
@@ -1583,6 +1663,48 @@ let compile output_prefix =
15831663 and compile_prim (prim_info : Lam.prim_info )
15841664 (lambda_cxt : Lam_compile_context.t ) =
15851665 match prim_info with
1666+ | {
1667+ primitive =
1668+ Pjs_call
1669+ {
1670+ prim_name = " jsx" | " jsxs" | " jsxKeyed" | " jsxsKeyed" ;
1671+ transformed_jsx = true ;
1672+ _;
1673+ };
1674+ args = jsx_tag :: rest_args ;
1675+ loc;
1676+ } ->
1677+ let new_cxt = {lambda_cxt with continuation = NeedValue Not_tail } in
1678+ let tag_block, tag_expr =
1679+ match extract_nested_external_component_field jsx_tag with
1680+ | Some (id , dynamic_import , hidden_name ) -> (
1681+ match
1682+ Lam_compile_env. query_external_id_info ~dynamic_import id
1683+ (hidden_name ^ " $jsx" )
1684+ with
1685+ | exception Not_found -> (
1686+ match compile_lambda new_cxt jsx_tag with
1687+ | {block; value = Some b } -> (block, b)
1688+ | {value = None } -> assert false )
1689+ | _ -> ([] , E. ml_var_dot ~dynamic_import id hidden_name))
1690+ | None -> (
1691+ match compile_lambda new_cxt jsx_tag with
1692+ | {block; value = Some b } -> (block, b)
1693+ | {value = None } -> assert false )
1694+ in
1695+ let rest_blocks, rest_exprs =
1696+ Ext_list. split_map rest_args (fun x ->
1697+ match compile_lambda new_cxt x with
1698+ | {block; value = Some b } -> (block, b)
1699+ | {value = None } -> assert false )
1700+ in
1701+ let args_code : J.block = List. concat (tag_block :: rest_blocks) in
1702+ let exp =
1703+ Lam_compile_primitive. translate output_prefix loc lambda_cxt
1704+ prim_info.primitive (tag_expr :: rest_exprs)
1705+ in
1706+ Js_output. output_of_block_and_expression lambda_cxt.continuation args_code
1707+ exp
15861708 | {
15871709 primitive = Pfield (_, fld_info);
15881710 args = [Lglobal_module (id, dynamic_import)];
0 commit comments