jon.recoil.org

Source file magic_numbers.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
open Std

module Cmi = struct
  type error =
    | Not_an_interface of string
    | Wrong_version_interface of string * string
    | Corrupted_interface of string

  exception Error of error

  let to_version_opt = function
    | "Caml1999I017" -> Some "4.02"
    | "Caml1999I020" -> Some "4.03"
    | "Caml1999I021" -> Some "4.04 or 4.05"
    | "Caml1999I022" -> Some "4.06"
    | "Caml1999I023" -> Some "4.07.0"
    | "Caml1999I024" -> Some "4.07.1"
    | "Caml1999I025" -> Some "4.08"
    | "Caml1999I026" -> Some "4.09"
    | "Caml1999I027" -> Some "4.10"
    | "Caml1999I028" -> Some "4.11"
    | "Caml1999I029" | "Caml1999I500" -> Some "4.12"
    | "Caml1999I030" -> Some "4.13"
    | "Caml1999I031" | "Caml1999I501" -> Some "4.14"
    | "Caml1999I502" -> Some "4.14.1-5"
    | "Caml1999I503" -> Some "4.14.1-6"
    | "Caml1999I504" -> Some "4.14.1-7"
    | "Caml1999I505" -> Some "4.14.1-8"
    | "Caml1999I506" -> Some "4.14.1-10"
    | "Caml1999I507" -> Some "4.14.1-12"
    | "Caml1999I508" -> Some "4.14.1-13"
    | "Caml1999I509" -> Some "4.14.1-15"
    | "Caml1999I510" -> Some "4.14.1-16"
    | "Caml1999I511" -> Some "4.14.1-18"
    | "Caml1999I512" -> Some "4.14.1-19"
    | "Caml1999I513" -> Some "4.14.1-22"
    | "Caml1999I514" -> Some "4.14.1-24"
    | "Caml1999I032" -> Some "5.0"
    | "Caml1999I033" -> Some "5.1"
    | "Caml1999I520" -> Some "5.1.1minus"
    | "Caml1999I521" -> Some "5.1.1minus-4"
    | "Caml1999I522" -> Some "5.1.1minus-8"
    | "Caml1999I523" -> Some "5.1.1minus-9"
    | "Caml1999I524" -> Some "5.1.1minus-10"
    | "Caml1999I526" -> Some "5.1.1minus-11"
    | "Caml1999I527" -> Some "5.1.1minus-12"
    | "Caml1999I528" -> Some "5.1.1minus-13"
    | "Caml1999I529" -> Some "5.1.1minus-14"
    | "Caml1999I530" -> Some "5.1.1minus-16"
    | "Caml1999I531" -> Some "5.1.1minus-17"
    | "Caml1999I532" -> Some "5.1.1minus-18"
    | "Caml1999I533" -> Some "5.1.1minus-19"
    | "Caml1999I534" -> Some "5.1.1minus-20"
    | "Caml1999I535" -> Some "5.1.1minus-21"
    | "Caml1999I536" -> Some "5.1.1minus-23"
    | "Caml1999I537" -> Some "5.1.1minus-24"
    | "Caml1999I034" -> Some "5.2"
    | "Caml1999I550" -> Some "5.2.0minus-0"
    | "Caml1999I551" -> Some "5.2.0minus-1"
    | "Caml1999I552" -> Some "5.2.0minus-2"
    | "Caml1999I553" -> Some "5.2.0minus-3"
    | "Caml1999I554" -> Some "5.2.0minus-4"
    | "Caml1999I555" -> Some "5.2.0minus-5"
    | "Caml1999I556" -> Some "5.2.0minus-6"
    | "Caml1999I557" -> Some "5.2.0minus-7"
    | "Caml1999I558" -> Some "5.2.0minus-8"
    | "Caml1999I559" -> Some "5.2.0minus-9"
    | "Caml1999I560" -> Some "5.2.0minus-10"
    | "Caml1999I561" -> Some "5.2.0minus-11"
    | "Caml1999I562" -> Some "5.2.0minus-12"
    | "Caml1999I563" -> Some "5.2.0minus-13"
    | "Caml1999I564" -> Some "5.2.0minus-14"
    | "Caml1999I565" -> Some "5.2.0minus-16"
    | "Caml1999I566" -> Some "5.2.0minus-17"
    | "Caml1999I567" -> Some "5.2.0minus-18"
    | "Caml1999I568" -> Some "5.2.0minus-19"
    | "Caml1999I569" -> Some "5.2.0minus-22"
    | "Caml1999I570" -> Some "5.2.0minus-24"
    | "Caml1999I571" -> Some "5.2.0minus-25"
    | "Caml1999I572" -> Some "5.2.0minus-29"
    | "Caml1999I573" -> Some "5.2.0minus-31"
    | "Caml1999I574" -> Some "5.2.0minus-32"
    | "Caml1999I575" -> Some "5.2.0minus-34"
    | "Caml1999I576" -> Some "5.2.0minus-36"
    | "Caml1999I577" -> Some "5.2.0minus-37"
    | "Caml1999I578" -> Some "5.2.0minus-39"
    | _ -> None

  let () = assert (to_version_opt Config.cmi_magic_number <> None)

  open Format_doc

  let report_error_doc ppf = function
    | Not_an_interface filename ->
      fprintf ppf "%a@ is not a compiled interface"
        Location.Doc.quoted_filename filename
    | Wrong_version_interface (filename, compiler_magic) ->
      let merlin_ocaml_version =
        let ocaml_version =
          match to_version_opt Config.cmi_magic_number with
          | Some version -> "OCaml " ^ version
          | None -> "an unknown version of OCaml"
        in
        sprintf "%s (with magic number %s)" ocaml_version Config.cmi_magic_number
      in
      begin match to_version_opt compiler_magic with
      | None ->
        fprintf ppf
          "%a@ seems to be compiled with a version of OCaml (with magic number \
           %s) that is not supported by Merlin.@.\
          This instance of Merlin handles %s."
          Location.Doc.quoted_filename filename
          compiler_magic
          merlin_ocaml_version
      | Some version ->
        fprintf ppf
          "%a@ seems to be compiled with OCaml %s.@.\
           But this instance of Merlin handles %s."
          Location.Doc.quoted_filename filename
          version
          merlin_ocaml_version
      end
    | Corrupted_interface filename ->
      fprintf ppf "Corrupted compiled interface@ %a"
        Location.Doc.quoted_filename filename

  let () =
    Location.register_error_of_exn
      (function
        | Error err -> Some (Location.error_of_printer_file report_error_doc err)
        | _ -> None
      )

  let report_error = Format_doc.compat report_error_doc
end