summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHongbo Zhang <bobzhang1988 AT gmail.com>2012-10-31 23:52:00 +0000
committerHongbo Zhang <bobzhang1988 AT gmail.com>2012-10-31 23:52:00 +0000
commit6ee61c4c2fdb8686ae09b0dcbaa0897bf4b428e5 (patch)
treedc3e2bd24de4883f0707f03002aee3abe5d00a0d
parent920fbd3145ae2916704e8e51b60209b31971ccd5 (diff)
desguaring record syntax sugar
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@13055 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--parsing/pprintast.ml28
1 files changed, 18 insertions, 10 deletions
diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml
index fafd51d89..2e765a67a 100644
--- a/parsing/pprintast.ml
+++ b/parsing/pprintast.ml
@@ -142,7 +142,7 @@ class printer ()= object(self:'self)
| Some x -> pp f "%(%)%a%(%)" first fu x last
method paren: 'a . bool -> (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a -> unit =
fun b fu f x ->
- if b then pp f "(%a)" fu x
+ if b then pp f "(@;%a@;)" fu x
else fu f x
method longident f = function
| Lident s -> pp f "%s" s
@@ -150,7 +150,7 @@ class printer ()= object(self:'self)
| 'a'..'z' | 'A' .. 'Z' ->
pp f "%a.%s" self#longident y s
| _ ->
- pp f "%a.(@ %s@ )@ " self#longident y s)
+ pp f "%a.(@;%s@;)@ " self#longident y s)
| Lapply (y,s)->
pp f "%a(%a)" self#longident y self#longident s
method longident_loc f x = pp f "%a" self#longident x.txt
@@ -360,14 +360,18 @@ class printer ()= object(self:'self)
pp f "#%a" self#longident_loc li
| Ppat_record (l, closed) ->
let longident_x_pattern f (li, p) =
- pp f "@[<2>%a@;=@;%a@]" self#longident_loc li self#pattern1 p in (* FIXME desugar the syntax sugar*)
+ match (li,p.ppat_desc) with
+ | ({txt=Lident s;_ },Ppat_var {txt;_} ) when s = txt ->
+ pp f "@[<2>%a@]" self#longident_loc li
+ | _ ->
+ pp f "@[<2>%a@;=@;%a@]" self#longident_loc li self#pattern1 p in
(match closed with
|Closed ->
- pp f "@[<2>{%a}@]"
- (self#list longident_x_pattern ~sep:";") l
+ pp f "@[<2>{@;%a@;}@]"
+ (self#list longident_x_pattern ~sep:";@:") l
| _ ->
- pp f "@[<2>{%a;_}@]"
- (self#list longident_x_pattern ~sep:";") l)
+ pp f "@[<2>{@;%a;_}@]"
+ (self#list longident_x_pattern ~sep:";@;") l)
| Ppat_tuple l -> pp f "@[<1>(%a)@]" (self#list ~sep:"," self#pattern1) l (* level1*)
| Ppat_constant (c) -> pp f "%a" self#constant c
| Ppat_variant (l,None) -> pp f "`%s" l
@@ -556,9 +560,13 @@ class printer ()= object(self:'self)
(self#option self#core_type ~first:"@ :>") cto2
| Pexp_variant (l, None) -> pp f "`%s" l
| Pexp_record (l, eo) ->
- let longident_x_expression f (li, e) =
- pp f "@[<hov2>%a@;=@;%a@]" self#longident_loc li self#simple_expr e in
- pp f "@[<hv0>@[<hv2>{%a%a@]@;}@]"(* "@[<hov2>{%a%a}@]" *)
+ let longident_x_expression f ( li, e) =
+ match e.pexp_desc with
+ | Pexp_ident {txt;_} when li.txt = txt ->
+ pp f "@[<hov2>%a@]" self#longident_loc li
+ | _ ->
+ pp f "@[<hov2>%a@;=@;%a@]" self#longident_loc li self#simple_expr e in
+ pp f "@[<hv0>@[<hv2>{@;%a%a@]@;}@]"(* "@[<hov2>{%a%a}@]" *)
(self#option ~last:" with@;" self#simple_expr) eo
(self#list longident_x_expression ~sep:";@;") l
| Pexp_array (l) ->