Переглянути джерело

[jvm] add @:jvm.synthetic

closes #9213
Simon Krajewski 5 роки тому
батько
коміт
bdf2937d18
3 змінених файлів з 24 додано та 13 видалено
  1. 7 0
      src-json/meta.json
  2. 8 4
      src/generators/genjvm.ml
  3. 9 9
      std/jvm/DynamicObject.hx

+ 7 - 0
src-json/meta.json

@@ -603,6 +603,13 @@
 		"targets": ["TClass", "TEnum"],
 		"internal": true
 	},
+	{
+		"name": "JvmSynthetic",
+		"metadata": ":jvm.synthetic",
+		"doc": "Mark generated class, field or method as synthetic",
+		"platforms": ["java"],
+		"targets": ["TClass", "TEnum", "TAnyField"]
+	},
 	{
 		"name": "JsRequire",
 		"metadata": ":jsRequire",

+ 8 - 4
src/generators/genjvm.ml

@@ -2250,7 +2250,8 @@ class tclass_to_jvm gctx c = object(self)
 			jc#add_interface (["java";"lang";"annotation"],"Annotation") [];
 			(* TODO: this should be done via Haxe metadata instead of hardcoding it here *)
 			jc#add_annotation retention_path ["value",(AEnum(retention_policy_sig,"RUNTIME"))];
-		end
+		end;
+		if Meta.has Meta.JvmSynthetic c.cl_meta then jc#add_access_flag 0x1000 (* synthetic *)
 
 	method private handle_relation_type_params =
 		let map_type_params t =
@@ -2355,7 +2356,7 @@ class tclass_to_jvm gctx c = object(self)
 
 	method private generate_empty_ctor =
 		let jsig_empty = method_sig [haxe_empty_constructor_sig] None in
-		let jm_empty_ctor = jc#spawn_method "<init>" jsig_empty [MPublic] in
+		let jm_empty_ctor = jc#spawn_method "<init>" jsig_empty [MPublic;MSynthetic] in
 		let _,load,_ = jm_empty_ctor#add_local "_" haxe_empty_constructor_sig VarArgument in
 		jm_empty_ctor#load_this;
 		if c.cl_constructor = None then begin
@@ -2448,6 +2449,7 @@ class tclass_to_jvm gctx c = object(self)
 		let flags = if c.cl_interface then MAbstract :: flags else flags in
 		let flags = if mtype = MStatic then MethodAccessFlags.MStatic :: flags else flags in
 		let flags = if has_class_field_flag cf CfFinal then MFinal :: flags else flags in
+		let flags = if Meta.has Meta.JvmSynthetic cf.cf_meta then MSynthetic :: flags else flags in
 		let name,scmode,flags = match mtype with
 			| MConstructor ->
 				let rec has_super_ctor c = match c.cl_super with
@@ -2483,6 +2485,7 @@ class tclass_to_jvm gctx c = object(self)
 		let jsig = jsignature_of_type gctx cf.cf_type in
 		let flags = [FdPublic] in
 		let flags = if mtype = MStatic then FdStatic :: flags else flags in
+		let flags = if Meta.has Meta.JvmSynthetic cf.cf_meta then FdSynthetic :: flags else flags in
 		let jm = jc#spawn_field cf.cf_name jsig flags in
 		let default e =
 			let p = null_pos in
@@ -2651,6 +2654,7 @@ let generate_enum gctx en =
 	let jc_enum = new JvmClass.builder en.e_path haxe_enum_path in
 	jc_enum#add_access_flag 0x1; (* public *)
 	jc_enum#add_access_flag 0x400; (* abstract *)
+	if Meta.has Meta.JvmSynthetic en.e_meta then jc_enum#add_access_flag 0x1000; (* synthetic *)
 	let jsig_enum_ctor = method_sig [TInt;string_sig] None in
 	(* Create base constructor *)
 	 begin
@@ -2687,7 +2691,7 @@ let generate_enum gctx en =
 			jm_ctor#return;
 			jc_ctor#add_annotation (["haxe";"jvm";"annotation"],"EnumValueReflectionInformation") (["argumentNames",AArray (List.map (fun (name,_) -> AString name) args)]);
 			if args <> [] then begin
-				let jm_params = jc_ctor#spawn_method "_hx_getParameters" (method_sig [] (Some (array_sig object_sig))) [MPublic] in
+				let jm_params = jc_ctor#spawn_method "_hx_getParameters" (method_sig [] (Some (array_sig object_sig))) [MPublic;MSynthetic] in
 				let jm_equals,compare_field = generate_enum_equals gctx jc_ctor in
 				let fl = List.map (fun (n,jsig) ->
 					compare_field n jsig;
@@ -2797,7 +2801,7 @@ let generate_anons gctx =
 		begin
 			let string_map_path = (["haxe";"ds"],"StringMap") in
 			let string_map_sig = object_path_sig string_map_path in
-			let jm_fields = jc#spawn_method "_hx_getKnownFields" (method_sig [] (Some string_map_sig)) [MProtected] in
+			let jm_fields = jc#spawn_method "_hx_getKnownFields" (method_sig [] (Some string_map_sig)) [MProtected;MSynthetic] in
 			let _,load,save = jm_fields#add_local "tmp" string_map_sig VarWillInit in
 			jm_fields#construct ConstructInit string_map_path (fun () -> []);
 			save();

+ 9 - 9
std/jvm/DynamicObject.hx

@@ -10,7 +10,7 @@ class DynamicObject implements java.lang.Cloneable extends Object {
 
 	var _hx_fields:Null<StringMap<Dynamic>>;
 
-	public var _hx_deletedAField:Null<Bool>;
+	@:jvm.synthetic public var _hx_deletedAField:Null<Bool>;
 
 	public function toString() {
 		if (__hx_toString_depth >= 5) {
@@ -44,7 +44,7 @@ class DynamicObject implements java.lang.Cloneable extends Object {
 		return buf.toString();
 	}
 
-	final public function _hx_deleteField(name:String) {
+	@:jvm.synthetic final public function _hx_deleteField(name:String) {
 		_hx_initReflection();
 		_hx_deletedAField = true;
 		try {
@@ -53,27 +53,27 @@ class DynamicObject implements java.lang.Cloneable extends Object {
 		return _hx_fields.remove(name);
 	}
 
-	final public function _hx_getFields() {
+	@:jvm.synthetic final public function _hx_getFields() {
 		_hx_initReflection();
 		return [for (key in _hx_fields.keys()) key];
 	}
 
-	override public function _hx_getField<T>(name:String) {
+	@:jvm.synthetic override public function _hx_getField<T>(name:String) {
 		_hx_initReflection();
 		return _hx_fields.get(name);
 	}
 
-	final public function _hx_hasField(name:String) {
+	@:jvm.synthetic final public function _hx_hasField(name:String) {
 		_hx_initReflection();
 		return _hx_fields.exists(name);
 	}
 
-	override public function _hx_setField(name:String, value:Dynamic) {
+	@:jvm.synthetic override public function _hx_setField(name:String, value:Dynamic) {
 		_hx_initReflection();
 		_hx_fields.set(name, value);
 	}
 
-	final public function _hx_clone() {
+	@:jvm.synthetic final public function _hx_clone() {
 		var clone:DynamicObject = (cast this : java.lang.Object).clone();
 		if (_hx_fields != null) {
 			clone._hx_fields = this._hx_fields.copy();
@@ -81,13 +81,13 @@ class DynamicObject implements java.lang.Cloneable extends Object {
 		return clone;
 	}
 
-	final function _hx_initReflection() {
+	@:jvm.synthetic final function _hx_initReflection() {
 		if (_hx_fields == null) {
 			_hx_fields = _hx_getKnownFields();
 		}
 	}
 
-	function _hx_getKnownFields():StringMap<Dynamic> {
+	@:jvm.synthetic function _hx_getKnownFields():StringMap<Dynamic> {
 		return new StringMap();
 	}
 }