Bladeren bron

[java/cs] Fixed java/c# issues with @:native . Closes #1492

Cauê Waneck 11 jaren geleden
bovenliggende
commit
bec597339f
2 gewijzigde bestanden met toevoegingen van 24 en 5 verwijderingen
  1. 22 3
      filters.ml
  2. 2 2
      genjava.ml

+ 22 - 3
filters.ml

@@ -911,10 +911,19 @@ let check_private_path ctx t = match t with
 (* Rewrites class or enum paths if @:native metadata is set *)
 let apply_native_paths ctx t =
 	let get_native_name meta =
-		let (_,e,mp) = Meta.get Meta.Native meta in
+		let rec get_native meta = match meta with
+			| [] -> raise Not_found
+			| (Meta.Native,[v],p as meta) :: _ ->
+				meta
+			| _ :: meta ->
+				get_native meta
+		in
+		let (_,e,mp) = get_native meta in
 		match e with
 		| [Ast.EConst (Ast.String name),p] ->
 			name,p
+		| [] ->
+			raise Not_found
 		| _ ->
 			error "String expected" mp
 	in
@@ -925,14 +934,24 @@ let apply_native_paths ctx t =
 	try
 		(match t with
 		| TClassDecl c ->
+			let did_change = ref false in
 			let field cf = try
 				let name,_ = get_native_name cf.cf_meta in
 				cf.cf_name <- name;
+				did_change := true
 			with Not_found ->
 				()
 			in
-			List.iter field c.cl_ordered_fields;
-			List.iter field c.cl_ordered_statics;
+			let fields cfs old_map =
+				did_change := false;
+				List.iter field cfs;
+				if !did_change then
+					List.fold_left (fun map f -> PMap.add f.cf_name f map) PMap.empty cfs
+				else
+					old_map
+			in
+			c.cl_fields <- fields c.cl_ordered_fields c.cl_fields;
+			c.cl_statics <- fields c.cl_ordered_statics c.cl_statics;
 			let meta,path = get_real_path c.cl_meta c.cl_path in
 			c.cl_meta <- meta :: c.cl_meta;
 			c.cl_path <- path;

+ 2 - 2
genjava.ml

@@ -172,7 +172,7 @@ struct
 				| TField( _, FStatic({ cl_path = (["java";"lang"], "Math") }, { cf_name = "POSITIVE_INFINITY" }) ) ->
 					mk_static_field_access_infer float_cl "POSITIVE_INFINITY" e.epos []
 				| TField( _, FStatic({ cl_path = (["java";"lang"], "Math") }, { cf_name = "isNaN"}) ) ->
-					mk_static_field_access_infer float_cl "_isNaN" e.epos []
+					mk_static_field_access_infer float_cl "isNaN" e.epos []
 				| TCall( ({ eexpr = TField( (_ as ef), FStatic({ cl_path = (["java";"lang"], "Math") }, { cf_name = ("ffloor" as f) }) ) } as fe), p)
 				| TCall( ({ eexpr = TField( (_ as ef), FStatic({ cl_path = (["java";"lang"], "Math") }, { cf_name = ("fceil" as f) }) ) } as fe), p) ->
 						Type.map_expr run { e with eexpr = TCall({ fe with eexpr = TField(ef, FDynamic (String.sub f 1 (String.length f - 1)))	}, p) }
@@ -2278,7 +2278,7 @@ let jpath_to_hx (pack,name) = match pack, name with
 
 let hxname_to_j name =
 	let sb = Buffer.create 16 in
-	let rec next i = 
+	let rec next i =
 		if i >= String.length name then Buffer.contents sb else
 			let c = name.[i] in
 			if c == '_' then begin