소스 검색

[java] read abstract property in JAR loader

Simon Krajewski 5 년 전
부모
커밋
358fa28e78
9개의 변경된 파일50개의 추가작업 그리고 7개의 파일을 삭제
  1. 9 3
      src/codegen/java.ml
  2. 6 4
      src/codegen/javaModern.ml
  3. 5 0
      std/java/lang/Boolean.hx
  4. 5 0
      std/java/lang/Byte.hx
  5. 5 0
      std/java/lang/Double.hx
  6. 5 0
      std/java/lang/Float.hx
  7. 5 0
      std/java/lang/Integer.hx
  8. 5 0
      std/java/lang/Long.hx
  9. 5 0
      std/java/lang/Short.hx

+ 9 - 3
src/codegen/java.ml

@@ -237,7 +237,7 @@ let convert_java_enum ctx p pe =
 		d_data = List.rev !data;
 		d_data = List.rev !data;
 	}
 	}
 
 
-	let convert_java_field ctx p jc field =
+	let convert_java_field ctx p jc is_interface field =
 		let p = { p with pfile =	p.pfile ^" (" ^field.jf_name ^")" } in
 		let p = { p with pfile =	p.pfile ^" (" ^field.jf_name ^")" } in
 		let cff_doc = None in
 		let cff_doc = None in
 		let cff_pos = p in
 		let cff_pos = p in
@@ -275,6 +275,8 @@ let convert_java_enum ctx p pe =
 			| JVolatile -> cff_meta := (Meta.Volatile, [], p) :: !cff_meta
 			| JVolatile -> cff_meta := (Meta.Volatile, [], p) :: !cff_meta
 			| JTransient -> cff_meta := (Meta.Transient, [], p) :: !cff_meta
 			| JTransient -> cff_meta := (Meta.Transient, [], p) :: !cff_meta
 			(* | JVarArgs -> cff_meta := (Meta.VarArgs, [], p) :: !cff_meta *)
 			(* | JVarArgs -> cff_meta := (Meta.VarArgs, [], p) :: !cff_meta *)
+			| JAbstract when not is_interface ->
+				cff_access := (AAbstract, p) :: !cff_access
 			| _ -> ()
 			| _ -> ()
 		) field.jf_flags;
 		) field.jf_flags;
 
 
@@ -442,16 +444,20 @@ let convert_java_enum ctx p pe =
 				meta := (Meta.LibType,[],p) :: !meta;
 				meta := (Meta.LibType,[],p) :: !meta;
 
 
 			let is_interface = ref false in
 			let is_interface = ref false in
+			let is_abstract =  ref false in
 			List.iter (fun f -> match f with
 			List.iter (fun f -> match f with
 				| JFinal -> flags := HFinal :: !flags
 				| JFinal -> flags := HFinal :: !flags
 				| JInterface ->
 				| JInterface ->
 						is_interface := true;
 						is_interface := true;
 						flags := HInterface :: !flags
 						flags := HInterface :: !flags
-				| JAbstract -> meta := (Meta.Abstract, [], p) :: !meta
+				| JAbstract ->
+					meta := (Meta.Abstract, [], p) :: !meta;
+					is_abstract := true;
 				| JAnnotation -> meta := (Meta.Annotation, [], p) :: !meta
 				| JAnnotation -> meta := (Meta.Annotation, [], p) :: !meta
 				| _ -> ()
 				| _ -> ()
 			) jc.cflags;
 			) jc.cflags;
 
 
+			if !is_abstract && not !is_interface then flags := HAbstract :: !flags;
 			(match jc.csuper with
 			(match jc.csuper with
 				| TObject( (["java";"lang"], "Object"), _ ) -> ()
 				| TObject( (["java";"lang"], "Object"), _ ) -> ()
 				| TObject( (["haxe";"lang"], "HxObject"), _ ) -> meta := (Meta.HxGen,[],p) :: !meta
 				| TObject( (["haxe";"lang"], "HxObject"), _ ) -> meta := (Meta.HxGen,[],p) :: !meta
@@ -477,7 +483,7 @@ let convert_java_enum ctx p pe =
 						if !is_interface && List.mem JStatic f.jf_flags then
 						if !is_interface && List.mem JStatic f.jf_flags then
 							()
 							()
 						else begin
 						else begin
-							fields := convert_java_field ctx p jc f :: !fields;
+							fields := convert_java_field ctx p jc !is_interface f :: !fields;
 							jfields := f :: !jfields
 							jfields := f :: !jfields
 						end
 						end
 					with
 					with

+ 6 - 4
src/codegen/javaModern.ml

@@ -758,7 +758,7 @@ module Converter = struct
 			PMap.add s (ct_type_param s) acc
 			PMap.add s (ct_type_param s) acc
 		) acc params
 		) acc params
 
 
-	let convert_field ctx is_method (jc : jclass) (jf : jfield) p =
+	let convert_field ctx is_method (jc : jclass) (is_interface : bool) (jf : jfield) p =
 		let ctx = {
 		let ctx = {
 			type_params = type_param_lut ctx.type_params jf.jf_types;
 			type_params = type_param_lut ctx.type_params jf.jf_types;
 		} in
 		} in
@@ -798,6 +798,7 @@ module Converter = struct
 		in
 		in
 		if is_method then add_meta (Meta.Overload,[],p);
 		if is_method then add_meta (Meta.Overload,[],p);
 		if AccessFlags.has_flag jf.jf_flags MFinal then add_access (AFinal,p);
 		if AccessFlags.has_flag jf.jf_flags MFinal then add_access (AFinal,p);
+		if not is_interface && AccessFlags.has_flag jf.jf_flags MAbstract then add_access (AAbstract,p);
 		let extract_local_names () =
 		let extract_local_names () =
 			let default i =
 			let default i =
 				"param" ^ string_of_int i
 				"param" ^ string_of_int i
@@ -881,7 +882,8 @@ module Converter = struct
 		let add_meta m = meta := m :: !meta in
 		let add_meta m = meta := m :: !meta in
 		add_meta (Meta.LibType,[],p);
 		add_meta (Meta.LibType,[],p);
 		let is_interface = AccessFlags.has_flag jc.jc_flags MInterface in
 		let is_interface = AccessFlags.has_flag jc.jc_flags MInterface in
-		if is_interface then add_flag HInterface;
+		if is_interface then add_flag HInterface
+		else if AccessFlags.has_flag jc.jc_flags MAbstract then add_flag HAbstract;
 		begin match jc.jc_super with
 		begin match jc.jc_super with
 			| TObject(([],""),_)
 			| TObject(([],""),_)
 			| TObject((["java";"lang"],"Object"),_) ->
 			| TObject((["java";"lang"],"Object"),_) ->
@@ -913,7 +915,7 @@ module Converter = struct
 					let key = (jf.jf_name,sig_key) in
 					let key = (jf.jf_name,sig_key) in
 					if not (Hashtbl.mem known_sigs key) then begin
 					if not (Hashtbl.mem known_sigs key) then begin
 						Hashtbl.add known_sigs key jf;
 						Hashtbl.add known_sigs key jf;
-						DynArray.add fields (convert_field ctx true jc jf p)
+						DynArray.add fields (convert_field ctx true jc is_interface jf p)
 					end
 					end
 				end
 				end
 			) jc.jc_methods;
 			) jc.jc_methods;
@@ -921,7 +923,7 @@ module Converter = struct
 				if should_generate jf then begin
 				if should_generate jf then begin
 					if not (Hashtbl.mem known_names jf.jf_name) then begin
 					if not (Hashtbl.mem known_names jf.jf_name) then begin
 						Hashtbl.add known_names jf.jf_name jf;
 						Hashtbl.add known_names jf.jf_name jf;
-						DynArray.add fields (convert_field ctx false jc jf p)
+						DynArray.add fields (convert_field ctx false jc is_interface jf p)
 					end
 					end
 				end
 				end
 			) jc.jc_fields;
 			) jc.jc_fields;

+ 5 - 0
std/java/lang/Boolean.hx

@@ -51,4 +51,9 @@ package java.lang;
 	@:native("toString") @:overload static function _toString(param1:Bool):String;
 	@:native("toString") @:overload static function _toString(param1:Bool):String;
 	@:overload static function valueOf(param1:Bool):Boolean;
 	@:overload static function valueOf(param1:Bool):Boolean;
 	@:overload static function valueOf(param1:String):Boolean;
 	@:overload static function valueOf(param1:String):Boolean;
+
+	function doubleValue():Float;
+	function floatValue():Single;
+	function intValue():Int;
+	function longValue():haxe.Int64;
 }
 }

+ 5 - 0
std/java/lang/Byte.hx

@@ -53,6 +53,11 @@ package java.lang;
 	@:overload static function valueOf(param1:java.types.Int8):Byte;
 	@:overload static function valueOf(param1:java.types.Int8):Byte;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Byte;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Byte;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Byte;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Byte;
+
+	function doubleValue():Float;
+	function floatValue():Single;
+	function intValue():Int;
+	function longValue():haxe.Int64;
 }
 }
 
 
 @:realPath("java.lang.Byte_ByteCache") @:javaNative @:native("java.lang.Byte$ByteCache") @:javaCanonical("java.lang",
 @:realPath("java.lang.Byte_ByteCache") @:javaNative @:native("java.lang.Byte$ByteCache") @:javaCanonical("java.lang",

+ 5 - 0
std/java/lang/Double.hx

@@ -64,4 +64,9 @@ package java.lang;
 	@:native("toString") @:overload static function _toString(param1:Float):String;
 	@:native("toString") @:overload static function _toString(param1:Float):String;
 	@:overload static function valueOf(param1:Float):Double;
 	@:overload static function valueOf(param1:Float):Double;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Double;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Double;
+
+	function doubleValue():Float;
+	function floatValue():Single;
+	function intValue():Int;
+	function longValue():haxe.Int64;
 }
 }

+ 5 - 0
std/java/lang/Float.hx

@@ -65,4 +65,9 @@ package java.lang;
 	@:native("toString") @:overload static function _toString(param1:Single):String;
 	@:native("toString") @:overload static function _toString(param1:Single):String;
 	@:overload static function valueOf(param1:Single):Float;
 	@:overload static function valueOf(param1:Single):Float;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Float;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Float;
+
+	function doubleValue():Float;
+	function floatValue():Single;
+	function intValue():Int;
+	function longValue():haxe.Int64;
 }
 }

+ 5 - 0
std/java/lang/Integer.hx

@@ -70,6 +70,11 @@ package java.lang;
 	@:overload static function valueOf(param1:Int):Integer;
 	@:overload static function valueOf(param1:Int):Integer;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Integer;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Integer;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Integer;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Integer;
+
+	function doubleValue():Float;
+	function floatValue():Single;
+	function intValue():Int;
+	function longValue():haxe.Int64;
 }
 }
 
 
 @:realPath("java.lang.Integer_IntegerCache") @:javaNative @:native("java.lang.Integer$IntegerCache") @:javaCanonical("java.lang",
 @:realPath("java.lang.Integer_IntegerCache") @:javaNative @:native("java.lang.Integer$IntegerCache") @:javaCanonical("java.lang",

+ 5 - 0
std/java/lang/Long.hx

@@ -70,6 +70,11 @@ package java.lang;
 	@:overload static function valueOf(param1:haxe.Int64):Long;
 	@:overload static function valueOf(param1:haxe.Int64):Long;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Long;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Long;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Long;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Long;
+
+	function doubleValue():Float;
+	function floatValue():Single;
+	function intValue():Int;
+	function longValue():haxe.Int64;
 }
 }
 
 
 @:realPath("java.lang.Long_LongCache") @:javaNative @:native("java.lang.Long$LongCache") @:javaCanonical("java.lang",
 @:realPath("java.lang.Long_LongCache") @:javaNative @:native("java.lang.Long$LongCache") @:javaCanonical("java.lang",

+ 5 - 0
std/java/lang/Short.hx

@@ -54,6 +54,11 @@ package java.lang;
 	@:overload static function valueOf(param1:java.types.Int16):Short;
 	@:overload static function valueOf(param1:java.types.Int16):Short;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Short;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String, param2:Int):Short;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Short;
 	@:overload @:throws("java.lang.NumberFormatException") static function valueOf(param1:String):Short;
+
+	function doubleValue():Float;
+	function floatValue():Single;
+	function intValue():Int;
+	function longValue():haxe.Int64;
 }
 }
 
 
 @:realPath("java.lang.Short_ShortCache") @:javaNative @:native("java.lang.Short$ShortCache") @:javaCanonical("java.lang",
 @:realPath("java.lang.Short_ShortCache") @:javaNative @:native("java.lang.Short$ShortCache") @:javaCanonical("java.lang",