Browse Source

[java/cs] Fix Unop + apply parameters. Closes #2281

Cauê Waneck 11 years ago
parent
commit
90e5f18786
4 changed files with 49 additions and 3 deletions
  1. 8 0
      gencommon.ml
  2. 2 1
      gencs.ml
  3. 5 2
      genjava.ml
  4. 34 0
      tests/unit/issues/Issue2281.hx

+ 8 - 0
gencommon.ml

@@ -9466,6 +9466,14 @@ struct
 			| _ -> None
 
 	let traverse gen unwrap_null wrap_val null_to_dynamic has_value opeq_handler handle_opeq handle_cast =
+		(* let unwrap_null e = *)
+		(* 	let ret = unwrap_null e in *)
+		(* 	{ ret with eexpr = TParenthesis(ret) } *)
+		(* in *)
+		(* let wrap_val e t b = *)
+		(* 	let ret = wrap_val e t b in *)
+		(* 	{ ret with eexpr = TParenthesis(ret) } *)
+		(* in *)
 		let handle_unwrap to_t e =
 			let e_null_t = get (is_null_t gen e.etype) in
 			match gen.greal_type to_t with

+ 2 - 1
gencs.ml

@@ -2279,7 +2279,8 @@ let configure gen =
 		(fun e ->
 			match real_type e.etype with
 				| TInst({ cl_path = (["haxe";"lang"], "Null") }, [t]) ->
-						{ (mk_field_access gen e "value" e.epos) with etype = t }
+					let e = { e with eexpr = TParenthesis(e) } in
+					{ (mk_field_access gen e "value" e.epos) with etype = t }
 				| _ ->
 					trace (debug_type e.etype); gen.gcon.error "This expression is not a Nullable expression" e.epos; assert false
 		)

+ 5 - 2
genjava.ml

@@ -2025,6 +2025,7 @@ let configure gen =
 	let field_is_dynamic t field =
 		match field_access_esp gen (gen.greal_type t) field with
 			| FClassField (cl,p,_,_,_,t,_) ->
+				let p = change_param_type (TClassDecl cl) p in
 				is_dynamic (apply_params cl.cl_types p t)
 			| FEnumField _ -> false
 			| _ -> true
@@ -2037,7 +2038,8 @@ let configure gen =
 
 	let is_dynamic_expr e =
 		is_dynamic e.etype || match e.eexpr with
-		| TField(tf, f) -> field_is_dynamic tf.etype f
+		| TField(tf, f) ->
+			field_is_dynamic tf.etype f
 		| _ ->
 			false
 	in
@@ -2072,7 +2074,8 @@ let configure gen =
 			| TBinop (Ast.OpGte, e1, e2)
 			| TBinop (Ast.OpGt, e1, e2) -> is_dynamic e.etype || is_dynamic_expr e1 || is_dynamic_expr e2 || is_string e1.etype || is_string e2.etype
 			| TBinop (_, e1, e2) -> is_dynamic e.etype || is_dynamic_expr e1 || is_dynamic_expr e2
-			| TUnop (_, _, e1) -> is_dynamic_expr e1
+			| TUnop (_, _, e1) ->
+				is_dynamic_expr e1
 			| _ -> false)
 		(fun e1 e2 ->
 			let is_null e = match e.eexpr with | TConst(TNull) | TLocal({ v_name = "__undefined__" }) -> true | _ -> false in

+ 34 - 0
tests/unit/issues/Issue2281.hx

@@ -0,0 +1,34 @@
+package unit.issues;
+
+class Issue2281 extends Test
+{
+    function test() {
+			var fint = new Foo();
+			fint.val = 0;
+			eq(0, fint.val++);
+			eq(1,fint.val);
+			eq(2,++fint.val);
+			eq(12, fint.val += 10);
+			fint.valNull = 0;
+			eq(0, fint.valNull++);
+			eq(1,fint.valNull);
+			eq(2,++fint.valNull);
+			eq(12, fint.valNull += 10);
+			fint.val2 = 0;
+			eq(0, fint.val2++);
+			eq(1,fint.val2);
+			eq(2,++fint.val2);
+			eq(12, fint.val2 += 10);
+    }
+}
+
+
+private class Foo<T>
+{
+	public var val:T;
+	public var valNull:Null<T>;
+	public var val2:Null<Int>;
+	public function new()
+	{
+	}
+}