1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798openReasonopenPpxlibtypet=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^"'.")inletast,comments=theParser(setup_lexbuf~use_stdinfilename)in{Printer_maker.ast;comments;parsed_as_ml=parsedAsML;parsed_as_intf=true}letparse~use_stdinfiletypefilename=let{Printer_maker.ast;comments;parsed_as_ml=parsedAsML;parsed_as_intf=parsedAsInterface}=matchfiletypewith|`Auto->defaultInterfaceParserForuse_stdinfilename|`BinaryReason->Printer_maker.reasonBinaryParseruse_stdinfilename|`Binary->Printer_maker.ocamlBinaryParseruse_stdinfilename|`ML->letlexbuf=Reason_toolchain.setup_lexbuf~use_stdinfilenameinletintf=Reason_toolchain.ML.interface_with_commentsinletast,comments=intflexbufin{ast;comments;parsed_as_ml=true;parsed_as_intf=true}|`Reason->letlexbuf=Reason_toolchain.setup_lexbuf~use_stdinfilenameinletintf=Reason_toolchain.RE.interface_with_commentsinletast,comments=intflexbufin{ast;comments;parsed_as_ml=false;parsed_as_intf=true}inifnotparsedAsInterfacethenerr"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