12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485openPpxlibtypet=Parsetree.signatureleterr=Printer_maker.err(* Note: filename should only be used with .mli files. See reason_toolchain. *)letdefaultInterfaceParserForuse_stdinfilename=letopenReason_toolchaininlettheParser,parsedAsML=ifFilename.check_suffixfilename".rei"thenRE.interface_with_comments,falseelseifFilename.check_suffixfilename".mli"thenML.interface_with_comments,trueelseerr("Cannot determine default interface parser for filename '"^filename^"'.")intheParser(setup_lexbufuse_stdinfilename),parsedAsML,trueletparse~use_stdinfiletypefilename=let(ast,comments),parsedAsML,parsedAsInterface=matchfiletypewith|`Auto->defaultInterfaceParserForuse_stdinfilename|`BinaryReason->Printer_maker.reasonBinaryParseruse_stdinfilename|`Binary->Printer_maker.ocamlBinaryParseruse_stdinfilename|`ML->letlexbuf=Reason_toolchain.setup_lexbufuse_stdinfilenameinletintf=Reason_toolchain.ML.interface_with_commentsinintflexbuf,true,true|`Reason->letlexbuf=Reason_toolchain.setup_lexbufuse_stdinfilenameinletintf=Reason_toolchain.RE.interface_with_commentsinintflexbuf,false,trueinifnotparsedAsInterfacethenerr"The file parsed does not appear to be an interface file."else(ast,comments),parsedAsMLletprintprinttypefilenameparsedAsMLoutput_chanoutput_formatter=matchprinttypewith|`BinaryReason->fun(ast,comments)->(* Our special format for interchange between reason should keep the
* comments separate. This is not compatible for input into the
* ocaml compiler - only for input into another version of Reason. We
* also store whether or not the binary was originally *parsed* as an
* interface file.
*)output_valueoutput_chan(Ocaml_common.Config.ast_intf_magic_number,filename,ast,comments,parsedAsML,true)|`Binary->fun(ast,_)->letast=ast|>Reason_syntax_util.(apply_mapper_to_signatureremove_stylistic_attrs_mapper)|>Reason_syntax_util.(apply_mapper_to_signaturebackport_letopt_mapper)inPpxlib__.Utils.Ast_io.writeoutput_chan{Ppxlib__.Utils.Ast_io.input_name=filename;input_version=Obj.magic(modulePpxlib_ast.Compiler_version:Ppxlib_ast.OCaml_version);ast=Intfast}~add_ppx_context:false|`AST->fun(ast,_)->Ocaml_common.Printast.interfaceoutput_formatter(Reason_toolchain.To_current.copy_signatureast)|`None->fun_->()|`ML->Reason_toolchain.ML.print_interface_with_commentsoutput_formatter|`Reason->Reason_toolchain.RE.print_interface_with_commentsoutput_formatter