|
@@ -205,7 +205,7 @@ and expr_def =
|
|
|
| ECall of expr * expr list
|
|
|
| ENew of placed_type_path * expr list
|
|
|
| EUnop of unop * unop_flag * expr
|
|
|
- | EVars of (placed_name * bool * type_hint option * expr option * metadata) list
|
|
|
+ | EVars of evar list
|
|
|
| EFunction of function_kind * func
|
|
|
| EBlock of expr list
|
|
|
| EFor of expr * expr
|
|
@@ -271,6 +271,14 @@ and class_field = {
|
|
|
mutable cff_kind : class_field_kind;
|
|
|
}
|
|
|
|
|
|
+and evar = {
|
|
|
+ ev_name : placed_name;
|
|
|
+ ev_final : bool;
|
|
|
+ ev_type : type_hint option;
|
|
|
+ ev_expr : expr option;
|
|
|
+ ev_meta : metadata;
|
|
|
+}
|
|
|
+
|
|
|
type enum_flag =
|
|
|
| EPrivate
|
|
|
| EExtern
|
|
@@ -334,6 +342,15 @@ let mk_type_path ?(params=[]) ?sub (pack,name) =
|
|
|
raise (Invalid_argument "Empty module name is not allowed");
|
|
|
{ tpackage = pack; tname = name; tsub = sub; tparams = params; }
|
|
|
|
|
|
+let mk_evar ?(final=false) ?(t:type_hint option) ?eo ?(meta=[]) name =
|
|
|
+ {
|
|
|
+ ev_name = name;
|
|
|
+ ev_final = final;
|
|
|
+ ev_type = t;
|
|
|
+ ev_expr = eo;
|
|
|
+ ev_meta = meta;
|
|
|
+ }
|
|
|
+
|
|
|
let is_lower_ident i =
|
|
|
if String.length i = 0 then
|
|
|
raise (Invalid_argument "Identifier name must not be empty")
|
|
@@ -666,10 +683,10 @@ let map_expr loop (e,p) =
|
|
|
ENew (t,el)
|
|
|
| EUnop (op,f,e) -> EUnop (op,f,loop e)
|
|
|
| EVars vl ->
|
|
|
- EVars (List.map (fun (n,b,t,eo,ml) ->
|
|
|
- let t = opt type_hint t in
|
|
|
- let eo = opt loop eo in
|
|
|
- n,b,t,eo,ml
|
|
|
+ EVars (List.map (fun v ->
|
|
|
+ let t = opt type_hint v.ev_type in
|
|
|
+ let eo = opt loop v.ev_expr in
|
|
|
+ { v with ev_type = t; ev_expr = eo }
|
|
|
) vl)
|
|
|
| EFunction (kind,f) -> EFunction (kind,func f)
|
|
|
| EBlock el -> EBlock (List.map loop el)
|
|
@@ -750,7 +767,7 @@ let iter_expr loop (e,p) =
|
|
|
| EFunction(_,f) ->
|
|
|
List.iter (fun (_,_,_,_,eo) -> opt eo) f.f_args;
|
|
|
opt f.f_expr
|
|
|
- | EVars vl -> List.iter (fun (_,_,_,eo,_) -> opt eo) vl
|
|
|
+ | EVars vl -> List.iter (fun v -> opt v.ev_expr) vl
|
|
|
|
|
|
let s_object_key_name name = function
|
|
|
| DoubleQuotes -> "\"" ^ StringHelper.s_escape name ^ "\""
|
|
@@ -885,10 +902,10 @@ module Printer = struct
|
|
|
if List.length tl > 0 then "<" ^ String.concat ", " (List.map (s_type_param tabs) tl) ^ ">" else ""
|
|
|
and s_func_arg tabs ((n,_),o,_,t,e) =
|
|
|
if o then "?" else "" ^ n ^ s_opt_type_hint tabs t ":" ^ s_opt_expr tabs e " = "
|
|
|
- and s_var tabs ((n,_),_,t,e,ml) =
|
|
|
- let s = n ^ (s_opt_type_hint tabs t ":") ^ s_opt_expr tabs e " = " in
|
|
|
- if ml = [] then s
|
|
|
- else (String.concat " " (List.map (s_metadata tabs) ml)) ^ " " ^ s
|
|
|
+ and s_var tabs v =
|
|
|
+ let s = (fst v.ev_name) ^ (s_opt_type_hint tabs v.ev_type ":") ^ s_opt_expr tabs v.ev_expr " = " in
|
|
|
+ if v.ev_meta = [] then s
|
|
|
+ else (String.concat " " (List.map (s_metadata tabs) v.ev_meta)) ^ " " ^ s
|
|
|
and s_case tabs (el,e1,e2,_) =
|
|
|
"case " ^ s_expr_list tabs el ", " ^
|
|
|
(match e1 with None -> ":" | Some e -> " if (" ^ s_expr_inner tabs e ^ "):") ^
|
|
@@ -1034,9 +1051,14 @@ module Expr = struct
|
|
|
loop e1
|
|
|
| EVars vl ->
|
|
|
add "EVars";
|
|
|
- List.iter (fun ((n,p),_,cto,eo,_) ->
|
|
|
- add (Printf.sprintf "%s %s%s" tabs n (match cto with None -> "" | Some (ct,_) -> ":" ^ Printer.s_complex_type "" ct));
|
|
|
- match eo with
|
|
|
+ List.iter (fun v ->
|
|
|
+ let t_hint =
|
|
|
+ match v.ev_type with
|
|
|
+ | None -> ""
|
|
|
+ | Some (ct,_) -> ":" ^ Printer.s_complex_type "" ct
|
|
|
+ in
|
|
|
+ add (Printf.sprintf "%s %s%s" tabs (fst v.ev_name) t_hint);
|
|
|
+ match v.ev_expr with
|
|
|
| None -> ()
|
|
|
| Some e ->
|
|
|
loop' (Printf.sprintf "%s " tabs) e
|