Browse Source

[inline] don't lose `@:deprecated` when inlining vars

closes #7096
Simon Krajewski 7 years ago
parent
commit
b698057795

+ 1 - 0
src/compiler/server.ml

@@ -454,6 +454,7 @@ let rec wait_loop process_params verbose accept =
 				Parser.reset_state();
 				Parser.reset_state();
 				return_partial_type := false;
 				return_partial_type := false;
 				measure_times := false;
 				measure_times := false;
+				Hashtbl.clear DeprecationCheck.warned_positions;
 				close_times();
 				close_times();
 				stats.s_files_parsed := 0;
 				stats.s_files_parsed := 0;
 				stats.s_classes_built := 0;
 				stats.s_classes_built := 0;

+ 8 - 5
src/optimization/optimizer.ml

@@ -238,6 +238,13 @@ let inline_default_config cf t =
 	let tparams = fst tparams @ cf.cf_params in
 	let tparams = fst tparams @ cf.cf_params in
 	tparams <> [], apply_params tparams tmonos
 	tparams <> [], apply_params tparams tmonos
 
 
+let inline_metadata e meta =
+	let inline_meta e meta = match meta with
+		| (Meta.Deprecated | Meta.Pure),_,_ -> mk (TMeta(meta,e)) e.etype e.epos
+		| _ -> e
+	in
+	List.fold_left inline_meta e meta
+
 let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=false) force =
 let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=false) force =
 	(* perform some specific optimization before we inline the call since it's not possible to detect at final optimization time *)
 	(* perform some specific optimization before we inline the call since it's not possible to detect at final optimization time *)
 	try
 	try
@@ -619,11 +626,7 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
 				let el_v = List.map (fun (v,eo) -> mk (TVar (v,eo)) ctx.t.tvoid e.epos) vl in
 				let el_v = List.map (fun (v,eo) -> mk (TVar (v,eo)) ctx.t.tvoid e.epos) vl in
 				mk (TBlock (el_v @ [e])) tret e.epos
 				mk (TBlock (el_v @ [e])) tret e.epos
 		) in
 		) in
-		let inline_meta e meta = match meta with
-			| (Meta.Deprecated | Meta.Pure),_,_ -> mk (TMeta(meta,e)) e.etype e.epos
-			| _ -> e
-		in
-		let e = List.fold_left inline_meta e cf.cf_meta in
+		let e = inline_metadata e cf.cf_meta in
 		let e = Diagnostics.secure_generated_code ctx e in
 		let e = Diagnostics.secure_generated_code ctx e in
 		if Meta.has (Meta.Custom ":inlineDebug") ctx.meta then begin
 		if Meta.has (Meta.Custom ":inlineDebug") ctx.meta then begin
 			let se t = s_expr_pretty true t true (s_type (print_context())) in
 			let se t = s_expr_pretty true t true (s_type (print_context())) in

+ 5 - 2
src/typing/calls.ml

@@ -445,7 +445,7 @@ let rec acc_get ctx g p =
 		(* do not create a closure for static calls *)
 		(* do not create a closure for static calls *)
 		let cmode = (match fmode with FStatic _ -> fmode | FInstance (c,tl,f) -> FClosure (Some (c,tl),f) | _ -> assert false) in
 		let cmode = (match fmode with FStatic _ -> fmode | FInstance (c,tl,f) -> FClosure (Some (c,tl),f) | _ -> assert false) in
 		ignore(follow f.cf_type); (* force computing *)
 		ignore(follow f.cf_type); (* force computing *)
-		(match f.cf_expr with
+		begin match f.cf_expr with
 		| None when ctx.com.display.dms_display ->
 		| None when ctx.com.display.dms_display ->
 			mk (TField (e,cmode)) t p
 			mk (TField (e,cmode)) t p
 		| None ->
 		| None ->
@@ -498,7 +498,10 @@ let rec acc_get ctx g p =
 			end
 			end
 		| Some e ->
 		| Some e ->
 			let rec loop e = Type.map_expr loop { e with epos = p } in
 			let rec loop e = Type.map_expr loop { e with epos = p } in
-			loop e)
+			let e = loop e in
+			let e = Optimizer.inline_metadata e f.cf_meta in
+			e
+		end
 	| AKMacro _ ->
 	| AKMacro _ ->
 		assert false
 		assert false
 
 

+ 7 - 0
tests/misc/projects/Issue7096/Main.hx

@@ -0,0 +1,7 @@
+class Main {
+	@:deprecated inline static var i:Int = 0;
+
+	public static function main() {
+		trace(i);
+	}
+}

+ 2 - 0
tests/misc/projects/Issue7096/compile.hxml

@@ -0,0 +1,2 @@
+--main Main
+--interp

+ 1 - 0
tests/misc/projects/Issue7096/compile.hxml.stderr

@@ -0,0 +1 @@
+Main.hx:5: characters 9-10 : Warning : Usage of this field is deprecated