Started matching errors in typechecker
This commit is contained in:
parent
0e17e8b274
commit
0e484f5bc1
@ -113,6 +113,22 @@ and matching : type a . (formatter -> a -> unit) -> formatter -> a matching -> u
|
|||||||
| Match_option {match_none ; match_some = (some, match_some)} ->
|
| Match_option {match_none ; match_some = (some, match_some)} ->
|
||||||
fprintf ppf "| None -> %a @.| Some %s -> %a" f match_none some f match_some
|
fprintf ppf "| None -> %a @.| Some %s -> %a" f match_none some f match_some
|
||||||
|
|
||||||
|
(* Shows the type expected for the matched value *)
|
||||||
|
and matching_type ppf m = match m with
|
||||||
|
| Match_tuple _ ->
|
||||||
|
fprintf ppf "tuple"
|
||||||
|
| Match_variant lst ->
|
||||||
|
fprintf ppf "variant %a" (list_sep matching_variant_case_type (tag "@.")) lst
|
||||||
|
| Match_bool _ ->
|
||||||
|
fprintf ppf "boolean"
|
||||||
|
| Match_list _ ->
|
||||||
|
fprintf ppf "list"
|
||||||
|
| Match_option _ ->
|
||||||
|
fprintf ppf "option"
|
||||||
|
|
||||||
|
and matching_variant_case_type ppf ((c,n),_a) =
|
||||||
|
fprintf ppf "| %s %s" c n
|
||||||
|
|
||||||
let declaration ppf (d:declaration) = match d with
|
let declaration ppf (d:declaration) = match d with
|
||||||
| Declaration_type (type_name , te) ->
|
| Declaration_type (type_name , te) ->
|
||||||
fprintf ppf "type %s = %a" type_name type_expression te
|
fprintf ppf "type %s = %a" type_name type_expression te
|
||||||
|
@ -46,6 +46,14 @@ module Errors = struct
|
|||||||
I.PP.expression ae
|
I.PP.expression ae
|
||||||
in
|
in
|
||||||
error title full ()
|
error title full ()
|
||||||
|
|
||||||
|
let match_error : type a . expected: a I.Types.matching -> actual: O.Types.type_value -> unit -> _ =
|
||||||
|
fun ~expected ~actual () ->
|
||||||
|
let title = (thunk "typing match") in
|
||||||
|
let full () = Format.asprintf "expected %a but got %a"
|
||||||
|
I.PP.matching_type expected
|
||||||
|
O.PP.type_value actual in
|
||||||
|
error title full ()
|
||||||
end
|
end
|
||||||
open Errors
|
open Errors
|
||||||
|
|
||||||
@ -81,14 +89,14 @@ and type_match : type i o . (environment -> i -> o result) -> environment -> O.t
|
|||||||
fun f e t i -> match i with
|
fun f e t i -> match i with
|
||||||
| Match_bool {match_true ; match_false} ->
|
| Match_bool {match_true ; match_false} ->
|
||||||
let%bind _ =
|
let%bind _ =
|
||||||
trace_strong (simple_error "Matching bool on not-a-bool")
|
trace_strong (match_error ~expected:i ~actual:t)
|
||||||
@@ get_t_bool t in
|
@@ get_t_bool t in
|
||||||
let%bind match_true = f e match_true in
|
let%bind match_true = f e match_true in
|
||||||
let%bind match_false = f e match_false in
|
let%bind match_false = f e match_false in
|
||||||
ok (O.Match_bool {match_true ; match_false})
|
ok (O.Match_bool {match_true ; match_false})
|
||||||
| Match_option {match_none ; match_some} ->
|
| Match_option {match_none ; match_some} ->
|
||||||
let%bind t_opt =
|
let%bind t_opt =
|
||||||
trace_strong (simple_error "Matching option on not-an-option")
|
trace_strong (match_error ~expected:i ~actual:t)
|
||||||
@@ get_t_option t in
|
@@ get_t_option t in
|
||||||
let%bind match_none = f e match_none in
|
let%bind match_none = f e match_none in
|
||||||
let (n, b) = match_some in
|
let (n, b) = match_some in
|
||||||
|
Loading…
Reference in New Issue
Block a user