فهرست منبع

[java/cs] Also restore cf_params. See #3350

Cauê Waneck 10 سال پیش
والد
کامیت
4aef533fd3
2فایلهای تغییر یافته به همراه29 افزوده شده و 6 حذف شده
  1. 3 3
      filters.ml
  2. 26 3
      gencommon.ml

+ 3 - 3
filters.ml

@@ -705,13 +705,13 @@ let save_class_state ctx t = match t with
 	| TClassDecl c ->
 		let mk_field_restore f =
 			let rec mk_overload_restore f =
-				f.cf_kind,f.cf_expr,f.cf_type,f.cf_meta
+				f.cf_kind,f.cf_expr,f.cf_type,f.cf_meta,f.cf_params
 			in
 			( f,mk_overload_restore f, List.map (fun f -> f,mk_overload_restore f) f.cf_overloads )
 		in
 		let restore_field (f,res,overloads) =
-			let restore_field (f,(kind,expr,t,meta)) =
-				f.cf_kind <- kind; f.cf_expr <- expr; f.cf_type <- t; f.cf_meta <- meta;
+			let restore_field (f,(kind,expr,t,meta,params)) =
+				f.cf_kind <- kind; f.cf_expr <- expr; f.cf_type <- t; f.cf_meta <- meta; f.cf_params <- params;
 				f
 			in
 			let f = restore_field (f,res) in

+ 26 - 3
gencommon.ml

@@ -4975,22 +4975,45 @@ struct
 					| _ -> assert false
 			in
 
-			let iter_types (_,t) =
+			let iter_types (nt,t) =
 				let cls = get_cls t in
-				check_type (snd cls.cl_path) (fun name -> cls.cl_path <- (fst cls.cl_path, name))
+				let orig = cls.cl_path in
+				check_type (snd orig) (fun name -> cls.cl_path <- (fst orig, name))
+			in
+
+			let save_params save params =
+				List.fold_left (fun save (_,t) ->
+					let cls = get_cls t in
+					(cls.cl_path,t) :: save) save params
 			in
 
 			List.iter (function
 				| TClassDecl cl ->
 					i := 0;
 
+					let save = [] in
+
 					found_types := PMap.empty;
+					let save = save_params save cl.cl_params in
 					List.iter iter_types cl.cl_params;
 					let cur_found_types = !found_types in
+					let save = ref save in
 					List.iter (fun cf ->
 						found_types := cur_found_types;
+						save := save_params !save cf.cf_params;
 						List.iter iter_types cf.cf_params
-					) (cl.cl_ordered_fields @ cl.cl_ordered_statics)
+					) (cl.cl_ordered_fields @ cl.cl_ordered_statics);
+
+					if !save <> [] then begin
+						let save = !save in
+						let res = cl.cl_restore in
+						cl.cl_restore <- (fun () ->
+							res();
+							List.iter (fun (path,t) ->
+								let cls = get_cls t in
+								cls.cl_path <- path) save
+						);
+					end
 
 				| TEnumDecl ( ({ e_params = hd :: tl }) ) ->
 					i := 0;