Bläddra i källkod

fix abstract setter detection (closes #4180)

Simon Krajewski 10 år sedan
förälder
incheckning
38b70b26b0
2 ändrade filer med 27 tillägg och 1 borttagningar
  1. 26 0
      tests/unit/src/unit/issues/Issue4180.hx
  2. 1 1
      typer.ml

+ 26 - 0
tests/unit/src/unit/issues/Issue4180.hx

@@ -0,0 +1,26 @@
+package unit.issues;
+
+private abstract A(Int) {
+	public function new(v) this = v;
+	@:op(A-B) function _(a:Int):A;
+	public function get() return this;
+}
+
+class Issue4180 extends Test {
+	@:isVar static var a(get,set):A;
+	static function set_a(value:A):A return a = value;
+	static function get_a():A return a;
+
+	static var a2(default,set):A;
+	static function set_a2(value:A):A return a2 = value;
+
+	function test() {
+		a = new A(0);
+		a -= 5;
+		eq(-5, a.get());
+
+		a2 = new A(0);
+		a2 -= 5;
+		eq(-5, a2.get());
+	}
+}

+ 1 - 1
typer.ml

@@ -1919,7 +1919,7 @@ let rec type_binop ctx op e1 e2 is_assign_op with_type p =
 			let ev = mk (TLocal v) e.etype p in
 			let get = type_binop ctx op (EField ((EConst (Ident v.v_name),p),cf.cf_name),p) e2 true with_type p in
 			let e' = match get.eexpr with
-				| TBinop _ ->
+				| TBinop _ | TMeta((Meta.RequiresAssign,_,_),_) ->
 					unify ctx get.etype t p;
 					make_call ctx (mk (TField (ev,quick_field_dynamic ev.etype ("set_" ^ cf.cf_name))) (tfun [t] t) p) [get] t p
 				| _ ->