浏览代码

inherit @:native in overriden fields (closes #7844) (#7846)

* inherit @:native in overriden fields (closes #7844)

* add test
Dan Korostelev 6 年之前
父节点
当前提交
5c1b54d1d2
共有 2 个文件被更改,包括 36 次插入0 次删除
  1. 8 0
      src/typing/typeloadFields.ml
  2. 28 0
      tests/unit/src/unit/issues/Issue7844.hx

+ 8 - 0
src/typing/typeloadFields.ml

@@ -1035,6 +1035,14 @@ let create_method (ctx,cctx,fctx) c f fd p =
 		| Meta.AstSource,[] -> (m,(match fd.f_expr with None -> [] | Some e -> [e]),p)
 		| Meta.AstSource,[] -> (m,(match fd.f_expr with None -> [] | Some e -> [e]),p)
 		| _ -> m,el,p
 		| _ -> m,el,p
 	) cf.cf_meta;
 	) cf.cf_meta;
+	Option.may (fun cf_parent ->
+		if not (Meta.has Meta.Native cf.cf_meta) then
+			try
+				let native_meta = Meta.get Meta.Native cf_parent.cf_meta in
+				cf.cf_meta <- native_meta :: cf.cf_meta;
+			with Not_found ->
+				()
+	) parent;
 	generate_value_meta ctx.com (Some c) (fun meta -> cf.cf_meta <- meta :: cf.cf_meta) fd.f_args;
 	generate_value_meta ctx.com (Some c) (fun meta -> cf.cf_meta <- meta :: cf.cf_meta) fd.f_args;
 	check_abstract (ctx,cctx,fctx) c cf fd t ret p;
 	check_abstract (ctx,cctx,fctx) c cf fd t ret p;
 	init_meta_overloads ctx (Some c) cf;
 	init_meta_overloads ctx (Some c) cf;

+ 28 - 0
tests/unit/src/unit/issues/Issue7844.hx

@@ -0,0 +1,28 @@
+package unit.issues;
+
+private class A {
+	@:keep
+	@:native("other")
+	function some() {
+		return "A";
+	}
+}
+
+private class B extends A {}
+
+private class C extends B {
+	public function new() {}
+
+	override public function some() {
+		return super.some() + "C";
+	}
+}
+
+class Issue7844 extends unit.Test {
+	function test() {
+		var c = new C();
+		var f = Reflect.field(c, "other");
+		var r = Reflect.callMethod(c, f, []);
+		eq(r, "AC");
+	}
+}