Browse Source

support usage-detection of locals

Simon Krajewski 12 years ago
parent
commit
b38deb829b
2 changed files with 20 additions and 9 deletions
  1. 6 2
      codegen.ml
  2. 14 7
      typer.ml

+ 6 - 2
codegen.ml

@@ -1779,12 +1779,16 @@ let detect_usage com =
 		| TClassDecl c ->
 			let rec expr e = match e.eexpr with
 				| TField(_,fa) ->
-					(match extract_field fa with
+					begin match extract_field fa with
 						| Some cf when Meta.has Meta.Usage cf.cf_meta ->
 							let p = {e.epos with pmin = e.epos.pmax - (String.length cf.cf_name)} in
 							usage := p :: !usage;
-						| _ -> ());
+						| _ ->
+							()
+					end;
 					Type.iter expr e
+				| TLocal v when Meta.has Meta.Usage v.v_meta ->
+					usage := e.epos :: !usage
 				| _ -> Type.iter expr e
 			in
 			let field cf = match cf.cf_expr with None -> () | Some e -> expr e in

+ 14 - 7
typer.ml

@@ -2934,13 +2934,20 @@ and type_expr ctx (e,p) (with_type:with_type) =
 		mk (TCast (type_expr ctx e Value,Some texpr)) t p
 	| EDisplay (e,iscall) when Common.defined_value_safe ctx.com Define.DisplayMode = "usage" ->
 		let e = try type_expr ctx e Value with Error (Unknown_ident n,_) -> raise (Parser.TypePath ([n],None)) in
-		(match e.eexpr with
-		| TField(_,fa) -> (match extract_field fa with
-			| None -> e
-			| Some cf ->
-				cf.cf_meta <- (Meta.Usage,[],p) :: cf.cf_meta;
-				e)
-		| _ -> e)
+		begin match e.eexpr with
+		| TField(_,fa) ->
+			begin match extract_field fa with
+				| None ->
+					()
+				| Some cf ->
+					cf.cf_meta <- (Meta.Usage,[],p) :: cf.cf_meta;
+			end
+		| TLocal v ->
+			v.v_meta <- (Meta.Usage,[],p) :: v.v_meta;
+		| _ ->
+			()
+		end;
+		e
 	| EDisplay (e,iscall) ->
 		let old = ctx.in_display in
 		let opt_args args ret = TFun(List.map(fun (n,o,t) -> n,true,t) args,ret) in