diff --git a/Changes b/Changes index aa92b6546..e998e065f 100644 --- a/Changes +++ b/Changes @@ -59,6 +59,9 @@ Bug fixes: - PR#6650: Cty_constr not handled correctly by Subst - PR#6651: Failing component lookup +Features wishes: +- PR#6367: introduce Asttypes.arg_label to encode labelled arguments + OCaml 4.02.2: ------------- diff --git a/boot/ocamlc b/boot/ocamlc index 6a2dc3590..3285cfbbf 100755 Binary files a/boot/ocamlc and b/boot/ocamlc differ diff --git a/boot/ocamldep b/boot/ocamldep index cf7beac25..161190658 100755 Binary files a/boot/ocamldep and b/boot/ocamldep differ diff --git a/boot/ocamllex b/boot/ocamllex index 78b32802a..860642f9f 100755 Binary files a/boot/ocamllex and b/boot/ocamllex differ diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index 203afceb1..0c0355b3a 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -18,7 +18,7 @@ open Typedtree open Lambda val transl_exp: expression -> lambda -val transl_apply: lambda -> (label * expression option * optional) list +val transl_apply: lambda -> (arg_label * expression option * optional) list -> Location.t -> lambda val transl_let: rec_flag -> value_binding list -> lambda -> lambda val transl_primitive: Location.t -> Primitive.description -> Env.t diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index d1b98e224..451315543 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -780,11 +780,11 @@ val create_index_lists : 'a list -> ('a -> string) -> 'a list list val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : string -> bool +val is_optional : Asttypes.arg_label -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : string -> string +val label_name : Asttypes.arg_label -> string (** Return the given name where the module name or part of it was removed, according to the list of modules diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli index 5958be91d..dd5a7fcb9 100644 --- a/ocamldoc/odoc_misc.mli +++ b/ocamldoc/odoc_misc.mli @@ -107,8 +107,8 @@ val search_string_backward : pat: string -> s: string -> int val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : string -> bool +val is_optional : Asttypes.arg_label -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : string -> string +val label_name : Asttypes.arg_label -> string diff --git a/ocamldoc/odoc_str.ml b/ocamldoc/odoc_str.ml index 1536640e5..281496bb3 100644 --- a/ocamldoc/odoc_str.ml +++ b/ocamldoc/odoc_str.ml @@ -148,8 +148,8 @@ let string_of_class_params c = Printf.bprintf b "%s%s%s%s -> " ( match label with - "" -> "" - | s -> s^":" + Asttypes.Nolabel -> "" + | s -> Printtyp.string_of_label s ^":" ) (if parent then "(" else "") (Odoc_print.string_of_type_expr diff --git a/ocamldoc/odoc_value.ml b/ocamldoc/odoc_value.ml index b35f2c6b5..7caedb360 100644 --- a/ocamldoc/odoc_value.ml +++ b/ocamldoc/odoc_value.ml @@ -95,22 +95,16 @@ let parameter_list_from_arrows typ = so there is nothing to merge. With this dummy list we can merge the parameter names from the .ml and the type from the .mli file. *) let dummy_parameter_list typ = - let normal_name s = - match s with - "" -> s - | _ -> - match s.[0] with - '?' -> String.sub s 1 ((String.length s) - 1) - | _ -> s - in + let normal_name = Odoc_misc.label_name in Printtyp.mark_loops typ; let liste_param = parameter_list_from_arrows typ in let rec iter (label, t) = match t.Types.desc with | Types.Ttuple l -> - if label = "" then + let open Asttypes in + if label = Nolabel then Odoc_parameter.Tuple - (List.map (fun t2 -> iter ("", t2)) l, t) + (List.map (fun t2 -> iter (Nolabel, t2)) l, t) else (* if there is a label, then we don't want to decompose the tuple *) Odoc_parameter.Simple_name diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 847d428f6..e8de67b47 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -38,7 +38,7 @@ module Typ : val any: ?loc:loc -> ?attrs:attrs -> unit -> core_type val var: ?loc:loc -> ?attrs:attrs -> string -> core_type - val arrow: ?loc:loc -> ?attrs:attrs -> label -> core_type -> core_type + val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type -> core_type -> core_type val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type @@ -93,11 +93,11 @@ module Exp: val constant: ?loc:loc -> ?attrs:attrs -> constant -> expression val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list -> expression -> expression - val fun_: ?loc:loc -> ?attrs:attrs -> label -> expression option -> pattern + val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option -> pattern -> expression -> expression val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression val apply: ?loc:loc -> ?attrs:attrs -> expression - -> (label * expression) list -> expression + -> (arg_label * expression) list -> expression val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression @@ -293,7 +293,7 @@ module Cty: val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_type val signature: ?loc:loc -> ?attrs:attrs -> class_signature -> class_type - val arrow: ?loc:loc -> ?attrs:attrs -> label -> core_type -> class_type -> class_type + val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type -> class_type -> class_type val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type end @@ -319,9 +319,12 @@ module Cl: val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr - val fun_: ?loc:loc -> ?attrs:attrs -> label -> expression option -> pattern -> class_expr -> class_expr - val apply: ?loc:loc -> ?attrs:attrs -> class_expr -> (label * expression) list -> class_expr - val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list -> class_expr -> class_expr + val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option -> pattern -> + class_expr -> class_expr + val apply: + ?loc:loc -> ?attrs:attrs -> class_expr -> (arg_label * expression) list -> class_expr + val let_: + ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list -> class_expr -> class_expr val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type -> class_expr val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr end diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index b212a2b9a..a0d636162 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -37,6 +37,11 @@ type closed_flag = Closed | Open type label = string +type arg_label = + Nolabel + | Labelled of string (* label:T -> ... *) + | Optional of string (* ?label:T -> ... *) + type 'a loc = 'a Location.loc = { txt : 'a; loc : Location.t; diff --git a/parsing/parser.mly b/parsing/parser.mly index 3a0663898..b3c4454a3 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -73,7 +73,7 @@ let ghunit () = ghexp (Pexp_construct (mknoloc (Lident "()"), None)) let mkinfix arg1 name arg2 = - mkexp(Pexp_apply(mkoperator name 2, ["", arg1; "", arg2])) + mkexp(Pexp_apply(mkoperator name 2, [Nolabel, arg1; Nolabel, arg2])) let neg_float_string f = if String.length f > 0 && f.[0] = '-' @@ -93,7 +93,7 @@ let mkuminus name arg = | ("-" | "-."), Pexp_constant(Const_float f) -> mkexp(Pexp_constant(Const_float(neg_float_string f))) | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Nolabel, arg])) let mkuplus name arg = let desc = arg.pexp_desc in @@ -104,7 +104,7 @@ let mkuplus name arg = | "+", Pexp_constant(Const_nativeint _) | ("+" | "+."), Pexp_constant(Const_float _) -> mkexp desc | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Nolabel, arg])) let mkexp_cons consloc args loc = Exp.mk ~loc (Pexp_construct(mkloc (Lident "::") consloc, Some args)) @@ -186,34 +186,34 @@ let bigarray_get arr arg = match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(get 1)), - ["", arr; "", c1])) + [Nolabel, arr; Nolabel, c1])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(get 2)), - ["", arr; "", c1; "", c2])) + [Nolabel, arr; Nolabel, c1; Nolabel, c2])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(get 3)), - ["", arr; "", c1; "", c2; "", c3])) + [Nolabel, arr; Nolabel, c1; Nolabel, c2; Nolabel, c3])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(get 0)), - ["", arr; "", ghexp(Pexp_array coords)])) + [Nolabel, arr; Nolabel, ghexp(Pexp_array coords)])) let bigarray_set arr arg newval = let set order = bigarray_function order true in match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(set 1)), - ["", arr; "", c1; "", newval])) + [Nolabel, arr; Nolabel, c1; Nolabel, newval])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(set 2)), - ["", arr; "", c1; "", c2; "", newval])) + [Nolabel, arr; Nolabel, c1; Nolabel, c2; Nolabel, newval])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(set 3)), - ["", arr; "", c1; "", c2; "", c3; "", newval])) + [Nolabel, arr; Nolabel, c1; Nolabel, c2; Nolabel, c3; Nolabel, newval])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(set 0)), - ["", arr; - "", ghexp(Pexp_array coords); - "", newval])) + [Nolabel, arr; + Nolabel, ghexp(Pexp_array coords); + Nolabel, newval])) let lapply p1 p2 = if !Clflags.applicative_functors @@ -948,13 +948,13 @@ class_type: { $1 } | QUESTION LIDENT COLON simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow("?" ^ $2 , mkoption $4, $6)) } + { mkcty(Pcty_arrow(Optional $2 , mkoption $4, $6)) } | OPTLABEL simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow("?" ^ $1, mkoption $2, $4)) } + { mkcty(Pcty_arrow(Optional $1, mkoption $2, $4)) } | LIDENT COLON simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow($1, $3, $5)) } + { mkcty(Pcty_arrow(Labelled $1, $3, $5)) } | simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow("", $1, $3)) } + { mkcty(Pcty_arrow(Nolabel, $1, $3)) } ; class_signature: LBRACKET core_type_comma_list RBRACKET clty_longident @@ -1051,21 +1051,21 @@ seq_expr: ; labeled_simple_pattern: QUESTION LPAREN label_let_pattern opt_default RPAREN - { ("?" ^ fst $3, $4, snd $3) } + { (Optional (fst $3), $4, snd $3) } | QUESTION label_var - { ("?" ^ fst $2, None, snd $2) } + { (Optional (fst $2), None, snd $2) } | OPTLABEL LPAREN let_pattern opt_default RPAREN - { ("?" ^ $1, $4, $3) } + { (Optional $1, $4, $3) } | OPTLABEL pattern_var - { ("?" ^ $1, None, $2) } + { (Optional $1, None, $2) } | TILDE LPAREN label_let_pattern RPAREN - { (fst $3, None, snd $3) } + { (Labelled (fst $3), None, snd $3) } | TILDE label_var - { (fst $2, None, snd $2) } + { (Labelled (fst $2), None, snd $2) } | LABEL simple_pattern - { ($1, None, $2) } + { (Labelled $1, None, $2) } | simple_pattern - { ("", None, $1) } + { (Nolabel, None, $1) } ; pattern_var: LIDENT { mkpat(Ppat_var (mkrhs $1 1)) } @@ -1181,10 +1181,10 @@ expr: { mkexp(Pexp_setfield($1, mkrhs $3 3, $5)) } | simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function ".()" true)), - ["",$1; "",$4; "",$7])) } + [Nolabel,$1; Nolabel,$4; Nolabel,$7])) } | simple_expr DOT LBRACKET seq_expr RBRACKET LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function ".[]" true)), - ["",$1; "",$4; "",$7])) } + [Nolabel,$1; Nolabel,$4; Nolabel,$7])) } | simple_expr DOT LBRACE expr RBRACE LESSMINUS expr { bigarray_set $1 $4 $7 } | label LESSMINUS expr @@ -1230,12 +1230,12 @@ simple_expr: { unclosed "(" 3 ")" 5 } | simple_expr DOT LPAREN seq_expr RPAREN { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function ".()" false)), - ["",$1; "",$4])) } + [Nolabel,$1; Nolabel,$4])) } | simple_expr DOT LPAREN seq_expr error { unclosed "(" 3 ")" 5 } | simple_expr DOT LBRACKET seq_expr RBRACKET { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function ".[]" false)), - ["",$1; "",$4])) } + [Nolabel,$1; Nolabel,$4])) } | simple_expr DOT LBRACKET seq_expr error { unclosed "[" 3 "]" 5 } | simple_expr DOT LBRACE expr RBRACE @@ -1272,9 +1272,9 @@ simple_expr: | mod_longident DOT LBRACKET expr_semi_list opt_semi error { unclosed "[" 3 "]" 6 } | PREFIXOP simple_expr - { mkexp(Pexp_apply(mkoperator $1 1, ["",$2])) } + { mkexp(Pexp_apply(mkoperator $1 1, [Nolabel,$2])) } | BANG simple_expr - { mkexp(Pexp_apply(mkoperator "!" 1, ["",$2])) } + { mkexp(Pexp_apply(mkoperator "!" 1, [Nolabel,$2])) } | NEW ext_attributes class_longident { mkexp_attrs (Pexp_new(mkrhs $3 3)) $2 } | LBRACELESS field_expr_list GREATERRBRACE @@ -1313,19 +1313,19 @@ simple_labeled_expr_list: ; labeled_simple_expr: simple_expr %prec below_SHARP - { ("", $1) } + { (Nolabel, $1) } | label_expr { $1 } ; label_expr: LABEL simple_expr %prec below_SHARP - { ($1, $2) } + { (Labelled $1, $2) } | TILDE label_ident - { $2 } + { (Labelled (fst $2), snd $2) } | QUESTION label_ident - { ("?" ^ fst $2, snd $2) } + { (Optional (fst $2), snd $2) } | OPTLABEL simple_expr %prec below_SHARP - { ("?" ^ $1, $2) } + { (Optional $1, $2) } ; label_ident: LIDENT { ($1, mkexp(Pexp_ident(mkrhs (Lident $1) 1))) } @@ -1794,13 +1794,13 @@ core_type2: simple_core_type_or_tuple { $1 } | QUESTION LIDENT COLON core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow("?" ^ $2 , mkoption $4, $6)) } + { mktyp(Ptyp_arrow(Optional $2 , mkoption $4, $6)) } | OPTLABEL core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow("?" ^ $1 , mkoption $2, $4)) } + { mktyp(Ptyp_arrow(Optional $1 , mkoption $2, $4)) } | LIDENT COLON core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow($1, $3, $5)) } + { mktyp(Ptyp_arrow(Labelled $1, $3, $5)) } | core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow("", $1, $3)) } + { mktyp(Ptyp_arrow(Nolabel, $1, $3)) } ; simple_core_type: diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 7bce27ad5..5d9162bbf 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -54,10 +54,10 @@ and core_type_desc = (* _ *) | Ptyp_var of string (* 'a *) - | Ptyp_arrow of label * core_type * core_type - (* T1 -> T2 (label = "") - ~l:T1 -> T2 (label = "l") - ?l:T1 -> T2 (label = "?l") + | Ptyp_arrow of arg_label * core_type * core_type + (* T1 -> T2 Simple + ~l:T1 -> T2 Labelled + ?l:T1 -> T2 Otional *) | Ptyp_tuple of core_type list (* T1 * ... * Tn @@ -219,18 +219,18 @@ and expression_desc = *) | Pexp_function of case list (* function P1 -> E1 | ... | Pn -> En *) - | Pexp_fun of label * expression option * pattern * expression - (* fun P -> E1 (lab = "", None) - fun ~l:P -> E1 (lab = "l", None) - fun ?l:P -> E1 (lab = "?l", None) - fun ?l:(P = E0) -> E1 (lab = "?l", Some E0) + | Pexp_fun of arg_label * expression option * pattern * expression + (* fun P -> E1 (Simple, None) + fun ~l:P -> E1 (Labelled l, None) + fun ?l:P -> E1 (Optional l, None) + fun ?l:(P = E0) -> E1 (Optional l, Some E0) Notes: - - If E0 is provided, lab must start with '?'. + - If E0 is provided, only Optional is allowed. - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun. - "let f P = E" is represented using Pexp_fun. *) - | Pexp_apply of expression * (label * expression) list + | Pexp_apply of expression * (arg_label * expression) list (* E0 ~l1:E1 ... ~ln:En li can be empty (non labeled argument) or start with '?' (optional argument). @@ -464,10 +464,10 @@ and class_type_desc = ['a1, ..., 'an] c *) | Pcty_signature of class_signature (* object ... end *) - | Pcty_arrow of label * core_type * class_type - (* T -> CT (label = "") - ~l:T -> CT (label = "l") - ?l:T -> CT (label = "?l") + | Pcty_arrow of arg_label * core_type * class_type + (* T -> CT Simple + ~l:T -> CT Labelled l + ?l:T -> CT Optional l *) | Pcty_extension of extension (* [%id] *) @@ -540,13 +540,13 @@ and class_expr_desc = ['a1, ..., 'an] c *) | Pcl_structure of class_structure (* object ... end *) - | Pcl_fun of label * expression option * pattern * class_expr - (* fun P -> CE (lab = "", None) - fun ~l:P -> CE (lab = "l", None) - fun ?l:P -> CE (lab = "?l", None) - fun ?l:(P = E0) -> CE (lab = "?l", Some E0) + | Pcl_fun of arg_label * expression option * pattern * class_expr + (* fun P -> CE (Simple, None) + fun ~l:P -> CE (Labelled l, None) + fun ?l:P -> CE (Optional l, None) + fun ?l:(P = E0) -> CE (Optional l, Some E0) *) - | Pcl_apply of class_expr * (label * expression) list + | Pcl_apply of class_expr * (arg_label * expression) list (* CE ~l1:E1 ... ~ln:En li can be empty (non labeled argument) or start with '?' (optional argument). diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 97067465d..6d1d22c14 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -220,15 +220,15 @@ class printer ()= object(self:'self) method type_with_label f (label,({ptyp_desc;_}as c) ) = match label with - | "" -> self#core_type1 f c (* otherwise parenthesize *) - | s -> - if s.[0]='?' then - match ptyp_desc with - | Ptyp_constr ({txt;_}, l) -> - assert (is_predef_option txt); - pp f "%s:%a" s (self#list self#core_type1) l - | _ -> failwith "invalid input in print_type_with_label" - else pp f "%s:%a" s self#core_type1 c + | Nolabel -> self#core_type1 f c (* otherwise parenthesize *) + | Labelled s -> pp f "%s:%a" s self#core_type1 c + | Optional s -> + begin match ptyp_desc with + | Ptyp_constr ({txt;_}, l) -> + assert (is_predef_option txt); + pp f "?%s:%a" s (self#list self#core_type1) l + | _ -> failwith "invalid input in print_type_with_label" + end method core_type f x = if x.ptyp_attributes <> [] then begin pp f "((%a)%a)" self#core_type {x with ptyp_attributes=[]} @@ -401,13 +401,11 @@ class printer ()= object(self:'self) | _ -> self#paren true self#pattern f x method label_exp f (l,opt,p) = - if l = "" then + match l with + | Nolabel -> pp f "%a@ " self#simple_pattern p (*single case pattern parens needed here *) - else - if l.[0] = '?' then - let len = String.length l - 1 in - let rest = String.sub l 1 len in begin - match p.ppat_desc with + | Optional rest -> + begin match p.ppat_desc with | Ppat_var {txt;_} when txt = rest -> (match opt with | Some o -> pp f "?(%s=@;%a)@;" rest self#expression o @@ -415,10 +413,10 @@ class printer ()= object(self:'self) | _ -> (match opt with | Some o -> - pp f "%s:(%a=@;%a)@;" l self#pattern1 p self#expression o - | None -> pp f "%s:%a@;" l self#simple_pattern p) + pp f "?%s:(%a=@;%a)@;" rest self#pattern1 p self#expression o + | None -> pp f "?%s:%a@;" rest self#simple_pattern p) end - else + | Labelled l -> (match p.ppat_desc with | Ppat_var {txt;_} when txt = l -> pp f "~%s@;" l @@ -1058,7 +1056,7 @@ class printer ()= object(self:'self) if x.pexp_attributes <> [] then pp f "=@;%a" self#expression x else match x.pexp_desc with | Pexp_fun (label, eo, p, e) -> - if label="" then + if label=Nolabel then pp f "%a@ %a" self#simple_pattern p pp_print_pexp_function e else pp f "%a@ %a" self#label_exp (label,eo,p) pp_print_pexp_function e @@ -1353,19 +1351,17 @@ class printer ()= object(self:'self) self#pattern pc_lhs (self#option self#expression ~first:"@;when@;") pc_guard self#under_pipe#expression pc_rhs in self#list aux f l ~sep:"" method label_x_expression_param f (l,e) = - match l with - | "" -> self#expression2 f e ; (* level 2*) - | lbl -> - let simple_name = match e.pexp_desc with - | Pexp_ident {txt=Lident l;_} -> Some l - | _ -> None in - if lbl.[0] = '?' then - let str = String.sub lbl 1 (String.length lbl-1) in + let simple_name = match e.pexp_desc with + | Pexp_ident {txt=Lident l;_} -> Some l + | _ -> None + in match l with + | Nolabel -> self#expression2 f e ; (* level 2*) + | Optional str -> if Some str = simple_name then - pp f "%s" lbl + pp f "?%s" str else - pp f "%s:%a" lbl self#simple_expr e - else + pp f "?%s:%a" str self#simple_expr e + | Labelled lbl -> if Some lbl = simple_name then pp f "~%s" lbl else diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index 42a340915..a5b468cdc 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -53,10 +53,10 @@ class printer : Format.formatter -> Parsetree.extension_constructor -> unit method label_exp : Format.formatter -> - Asttypes.label * Parsetree.expression option * Parsetree.pattern -> + Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern -> unit method label_x_expression_param : - Format.formatter -> Asttypes.label * Parsetree.expression -> unit + Format.formatter -> Asttypes.arg_label * Parsetree.expression -> unit method list : ?sep:space_formatter -> ?first:space_formatter -> @@ -113,7 +113,7 @@ class printer : method type_params : Format.formatter -> (Parsetree.core_type * Asttypes.variance) list -> unit method type_with_label : - Format.formatter -> Asttypes.label * Parsetree.core_type -> unit + Format.formatter -> Asttypes.arg_label * Parsetree.core_type -> unit method tyvar : Format.formatter -> string -> unit method under_pipe : 'b method under_semi : 'b diff --git a/parsing/printast.ml b/parsing/printast.ml index 2bf9d8f3e..490e319f5 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -130,6 +130,11 @@ let string i ppf s = line i ppf "\"%s\"\n" s;; let string_loc i ppf s = line i ppf "%a\n" fmt_string_loc s;; let bool i ppf x = line i ppf "%s\n" (string_of_bool x);; let label i ppf x = line i ppf "label=\"%s\"\n" x;; +let arg_label i ppf = function + | Nolabel -> line i ppf "Nolabel\n" + | Optional s -> line i ppf "Optional \"%s\"\n" s + | Labelled s -> line i ppf "Labelled \"%s\"\n" s +;; let rec core_type i ppf x = line i ppf "core_type %a\n" fmt_location x.ptyp_loc; @@ -140,7 +145,7 @@ let rec core_type i ppf x = | Ptyp_var (s) -> line i ppf "Ptyp_var %s\n" s; | Ptyp_arrow (l, ct1, ct2) -> line i ppf "Ptyp_arrow\n"; - string i ppf l; + arg_label i ppf l; core_type i ppf ct1; core_type i ppf ct2; | Ptyp_tuple l -> @@ -250,7 +255,8 @@ and expression i ppf x = line i ppf "Pexp_function\n"; list i case ppf l; | Pexp_fun (l, eo, p, e) -> - line i ppf "Pexp_fun \"%s\"\n" l; + line i ppf "Pexp_fun\n"; + arg_label i ppf l; option i expression ppf eo; pattern i ppf p; expression i ppf e; @@ -457,7 +463,8 @@ and class_type i ppf x = line i ppf "Pcty_signature\n"; class_signature i ppf cs; | Pcty_arrow (l, co, cl) -> - line i ppf "Pcty_arrow \"%s\"\n" l; + line i ppf "Pcty_arrow\n"; + arg_label i ppf l; core_type i ppf co; class_type i ppf cl; | Pcty_extension (s, arg) -> @@ -531,7 +538,7 @@ and class_expr i ppf x = class_structure i ppf cs; | Pcl_fun (l, eo, p, e) -> line i ppf "Pcl_fun\n"; - label i ppf l; + arg_label i ppf l; option i expression ppf eo; pattern i ppf p; class_expr i ppf e; @@ -852,7 +859,8 @@ and longident_x_expression i ppf (li, e) = expression (i+1) ppf e; and label_x_expression i ppf (l,e) = - line i ppf "