package reason

  1. Overview
  2. Docs
Reason: Syntax & Toolchain for OCaml

Install

Dune Dependency

Authors

Maintainers

Sources

reason-3.15.0.tbz
sha256=ec3d2025f4391f0d2b88d2053e627a85aa1addd9c51320e9e72c690e05fb66a6
sha512=2bc7681a0e7649f619a8e93e961690531f697fadb1ae5d3f2c5913b0fce6995780394f2ce5b3e1920902ca7a2f4e188f62696f58f20ae3dd81c3658528bd0a33

doc/src/reason.refmt-lib/reason_interface_printer.ml.html

Source file reason_interface_printer.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
open Ppxlib

type t = Parsetree.signature

let err = Printer_maker.err

(* Note: filename should only be used with .mli files. See reason_toolchain. *)
let defaultInterfaceParserFor use_stdin filename =
  let open Reason_toolchain in
  let theParser, parsedAsML =
    if Filename.check_suffix filename ".rei"
    then RE.interface_with_comments, false
    else if Filename.check_suffix filename ".mli"
    then ML.interface_with_comments, true
    else
      err
        ("Cannot determine default interface parser for filename '"
        ^ filename
        ^ "'.")
  in
  theParser (setup_lexbuf use_stdin filename), parsedAsML, true

let parse ~use_stdin filetype filename =
  let (ast, comments), parsedAsML, parsedAsInterface =
    match filetype with
    | `Auto -> defaultInterfaceParserFor use_stdin filename
    | `BinaryReason -> Printer_maker.reasonBinaryParser use_stdin filename
    | `Binary -> Printer_maker.ocamlBinaryParser use_stdin filename
    | `ML ->
      let lexbuf = Reason_toolchain.setup_lexbuf use_stdin filename in
      let intf = Reason_toolchain.ML.interface_with_comments in
      intf lexbuf, true, true
    | `Reason ->
      let lexbuf = Reason_toolchain.setup_lexbuf use_stdin filename in
      let intf = Reason_toolchain.RE.interface_with_comments in
      intf lexbuf, false, true
  in
  if not parsedAsInterface
  then err "The file parsed does not appear to be an interface file."
  else (ast, comments), parsedAsML

let print printtype filename parsedAsML output_chan output_formatter =
  match printtype with
  | `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_value
        output_chan
        ( Ocaml_common.Config.ast_intf_magic_number
        , filename
        , ast
        , comments
        , parsedAsML
        , true )
  | `Binary ->
    fun (ast, _) ->
      let ast =
        ast
        |> Reason_syntax_util.(
             apply_mapper_to_signature remove_stylistic_attrs_mapper)
        |> Reason_syntax_util.(apply_mapper_to_signature backport_letopt_mapper)
      in
      Ppxlib__.Utils.Ast_io.write
        output_chan
        { Ppxlib__.Utils.Ast_io.input_name = filename
        ; input_version =
            Obj.magic
              (module Ppxlib_ast.Compiler_version : Ppxlib_ast.OCaml_version)
        ; ast = Intf ast
        }
        ~add_ppx_context:false
  | `AST ->
    fun (ast, _) ->
      Ocaml_common.Printast.interface
        output_formatter
        (Reason_toolchain.To_current.copy_signature ast)
  | `None -> fun _ -> ()
  | `ML -> Reason_toolchain.ML.print_interface_with_comments output_formatter
  | `Reason ->
    Reason_toolchain.RE.print_interface_with_comments output_formatter
OCaml

Innovation. Community. Security.