@@ -315517,58 +315517,69 @@ let structure_item_mapper (self : mapper) (str : Parsetree.structure_item) =
315517315517 end
315518315518 | _ -> default_mapper.structure_item self str
315519315519
315520+
315520315521let local_module_name =
315521315522 let v = ref 0 in
315522315523 fun () ->
315523315524 incr v ;
315524315525 "local_" ^ string_of_int !v
315525315526
315526315527
315527- let expand_local loc (stru : Ast_structure.t) (acc : Ast_structure.t) : Ast_structure.t =
315528- Ext_list.iter stru Typemod_hide.check;
315529- let local_module_name = local_module_name () in
315530- let open Ast_helper in
315531- Str.module_
315532- ~loc
315533- { pmb_name = {txt = local_module_name; loc};
315534- pmb_expr = {
315535- pmod_desc= Pmod_structure stru;
315536- pmod_loc = loc;
315537- pmod_attributes = [] };
315538- pmb_attributes = Typemod_hide.attrs; pmb_loc = loc} ::
315539- Str.open_ ~loc {
315540- popen_lid = {txt = Lident local_module_name; loc};
315541- popen_override = Override;
315542- popen_loc = loc;
315543- popen_attributes = []
315544- } :: acc
315528+ let expand_reverse (stru : Ast_structure.t) (acc : Ast_structure.t) : Ast_structure.t =
315529+ if stru = [] then acc
315530+ else begin
315531+ Ext_list.iter stru Typemod_hide.check;
315532+ let local_module_name = local_module_name () in
315533+ let last_loc = (List.hd stru).pstr_loc in
315534+ let stru = List.rev stru in
315535+ let first_loc = (List.hd stru).pstr_loc in
315536+ let loc = {first_loc with loc_end = last_loc.loc_end; } in
315537+ let open Ast_helper in
315538+ Str.module_
315539+ ~loc
315540+ { pmb_name = {txt = local_module_name; loc};
315541+ pmb_expr = {
315542+ pmod_desc= Pmod_structure stru;
315543+ pmod_loc = loc;
315544+ pmod_attributes = [] };
315545+ pmb_attributes = Typemod_hide.attrs; pmb_loc = loc} ::
315546+ Str.open_ ~loc {
315547+ popen_lid = {txt = Lident local_module_name; loc};
315548+ popen_override = Override;
315549+ popen_loc = loc;
315550+ popen_attributes = []
315551+ } :: acc
315552+ end
315553+
315545315554
315546315555let rec
315547- structure_mapper (self : mapper) stru =
315556+ structure_mapper (self : mapper) ( stru : Ast_structure.t) =
315548315557 match stru with
315549315558 | [] -> []
315550315559 | item::rest ->
315551- let new_x = self.structure_item self item in
315552- match new_x.pstr_desc with
315560+ match item.pstr_desc with
315553315561 | Pstr_extension (({txt = ("bs.debugger.chrome" | "debugger.chrome") ;loc}, _),_)
315554315562 ->
315555315563 Location.prerr_warning loc (Preprocessor "this extension can be safely removed");
315556- ( structure_mapper self rest)
315564+ structure_mapper self rest
315557315565 | Pstr_extension ( ({txt = ("bs.raw"| "raw") ; loc}, payload), _attrs)
315558315566 ->
315559- Ast_exp_handle_external.handle_raw_structure loc payload :: ( structure_mapper self rest)
315560- | Pstr_extension (({txt = "local"; loc }, payload ),_)
315567+ Ast_exp_handle_external.handle_raw_structure loc payload :: structure_mapper self rest
315568+ | Pstr_extension (({txt = "local"}, _ ),_)
315561315569 ->
315562- begin match payload with
315563- | PStr stru ->
315564- expand_local loc stru (structure_mapper self rest)
315565- | PSig _
315566- | PTyp _
315567- | PPat _ ->
315568- Location.raise_errorf ~loc "local extension is not support"
315569- end
315570+ let rec aux acc (rest : Ast_structure.t) =
315571+ match rest with
315572+ | {pstr_desc = Pstr_extension (({txt = "local";loc}, payload), _) } :: next ->
315573+ begin match payload with
315574+ | PStr work ->
315575+ aux (Ext_list.rev_map_append work acc (fun x -> self.structure_item self x)) next
315576+ | (PSig _ | PTyp _ | PPat _) ->
315577+ Location.raise_errorf ~loc "local extension is not support"
315578+ end
315579+ | _ -> expand_reverse acc (structure_mapper self rest)
315580+ in aux [] stru
315570315581 | _ ->
315571- new_x :: ( structure_mapper self rest)
315582+ self.structure_item self item :: structure_mapper self rest
315572315583
315573315584let unsafe_mapper : mapper =
315574315585 { default_mapper with
0 commit comments