Browse Source

added unused capture var check again

Simon Krajewski 12 years ago
parent
commit
148b891e8b
3 changed files with 16 additions and 14 deletions
  1. 13 12
      matcher.ml
  2. 1 0
      std/haxe/macro/ExprTools.hx
  3. 2 2
      std/haxe/macro/Printer.hx

+ 13 - 12
matcher.ml

@@ -17,12 +17,14 @@ and con = {
 	c_pos : pos;
 }
 
+type pvar = tvar * pos
+
 type pat_def =
 	| PAny
-	| PVar of tvar
+	| PVar of pvar
 	| PCon of con * pat list
 	| POr of pat * pat
-	| PBind of tvar * pat
+	| PBind of pvar * pat
 	| PTuple of pat array
 
 and pat = {
@@ -49,14 +51,12 @@ type out = {
 	o_guard : texpr option;
 	o_pos : pos;
 	mutable o_num_paths : int;
-	mutable o_bindings : (tvar * st) list;
+	mutable o_bindings : (pvar * st) list;
 }
 
 type pat_vec = pat array * out
 type pat_matrix = pat_vec list
 
-type pvar = tvar * pos
-
 type pattern_ctx = {
 	mutable pc_locals : (string, pvar) PMap.t;
 	mutable pc_sub_vars : (string, pvar) PMap.t option;
@@ -188,12 +188,12 @@ let s_con con = match con.c_def with
 	| CExpr e -> s_expr s_type e
 
 let rec s_pat pat = match pat.p_def with
-	| PVar v -> v.v_name
+	| PVar (v,_) -> v.v_name
 	| PCon (c,[]) -> s_con c
 	| PCon (c,pl) -> s_con c ^ "(" ^ (String.concat "," (List.map s_pat pl)) ^ ")"
 	| POr (pat1,pat2) -> s_pat pat1 ^ " | " ^ s_pat pat2
 	| PAny -> "_"
-	| PBind(v,pat) -> v.v_name ^ "=" ^ s_pat pat
+	| PBind((v,_),pat) -> v.v_name ^ "=" ^ s_pat pat
 	| PTuple pl -> String.concat " " (Array.to_list (Array.map s_pat pl))
 
 let st_args l r v =
@@ -213,7 +213,7 @@ let rec s_pat_vec pl =
 	String.concat " " (Array.to_list (Array.map s_pat pl))
 
 let s_out out =
-	"var " ^ (String.concat "," (List.map (fun (v,st) -> v.v_name ^ "=" ^ (s_st st)) out.o_bindings)) ^ ";"
+	"var " ^ (String.concat "," (List.map (fun ((v,_),st) -> v.v_name ^ "=" ^ (s_st st)) out.o_bindings)) ^ ";"
 	(* ^ s_expr_small out.o_expr *)
 
 let rec s_pat_matrix pmat =
@@ -397,7 +397,7 @@ let to_pattern ctx e t =
 						error "Cannot bind tuple" p
 					| None ->
 						let v = mk_var pctx s t p in
-						mk_pat (PVar v) v.v_type p
+						mk_pat (PVar (v,p)) v.v_type p
 				end
 			end
 		| (EObjectDecl fl) ->
@@ -444,7 +444,7 @@ let to_pattern ctx e t =
 		| EBinop(OpAssign,(EConst(Ident s),p2),e1) ->
 			let v = mk_var pctx s t p in
 			let pat1 = loop pctx e1 t in
-			mk_pat (PBind(v,pat1)) t p2
+			mk_pat (PBind((v,p),pat1)) t p2
 		| EBinop(OpOr,(EBinop(OpOr,e1,e2),p2),e3) ->
 			loop pctx (EBinop(OpOr,e1,(EBinop(OpOr,e2,e3),p2)),p) t
 		| EBinop(OpOr,e1,e2) ->
@@ -799,8 +799,9 @@ let rec st_to_texpr mctx st = match st.st_def with
 
 let replace_locals mctx out e =
 	let all_subterms = Hashtbl.create 0 in
+	let bindings = List.map (fun ((v,p),st) -> Hashtbl.add all_subterms st p; v,st) out.o_bindings in
 	let replace v =
-		let st = List.assq v out.o_bindings in
+		let st = List.assq v bindings in
 		Hashtbl.remove all_subterms st;
 		st
 	in
@@ -816,7 +817,7 @@ let replace_locals mctx out e =
 			Type.map_expr loop e
 	in
 	let e = loop e in
-	Hashtbl.iter (fun _ st -> mctx.ctx.com.warning "This variable is unused" (pos st)) all_subterms;
+	Hashtbl.iter (fun _ p -> mctx.ctx.com.warning "This variable is unused" p) all_subterms;
 	e
 
 let rec to_typed_ast mctx need_val dt =

+ 1 - 0
std/haxe/macro/ExprTools.hx

@@ -134,6 +134,7 @@ class ExprTools {
 					opt2(c.guard, f);
 					opt2(c.expr, f);
 				}
+				opt2(edef, f);
 		}
 	}
 	

+ 2 - 2
std/haxe/macro/Printer.hx

@@ -108,7 +108,7 @@ class Printer {
 		(field.meta != null && field.meta.length > 0 ? field.meta.map(printMetadata).join(" ") : "")
 		+ switch(field.kind) {
 			case FVar(t, eo): 'var $field.name:${printComplexType(t)}' + opt(eo, printExpr, "=");
-			case FProp(get, set, to, eo): 'var $field.name($get,$set)';
+			case FProp(get, set, _, _): 'var $field.name($get,$set)';
 			case FFun(func): "function " + printFunction(func);
 		}
 	
@@ -192,7 +192,7 @@ class Printer {
 		case ECast(e1, _): "cast " +printExpr(e1);
 		case EDisplay(e1, _): '#DISPLAY(${printExpr(e1)})';
 		case EDisplayNew(tp): '#DISPLAY(${printTypePath(tp)})';
-		case ETernary(econd, eif, eelse): '${printExpr(econd)} ? ${printExpr(eif)} : $ {printExpr(eelse) }';
+		case ETernary(econd, eif, eelse): '${printExpr(econd)} ? ${printExpr(eif)} : ${printExpr(eelse) }';
 		case ECheckType(e1, ct): '#CHECK_TYPE(${printExpr(e1)}, ${printComplexType(ct)})';
 		case EMeta(meta, e1): printMetadata(meta) + " " +printExpr(e1);
 	}