Browse Source

[java/cs] Better filter expressions that can't be statements. Closes #2989

Cauê Waneck 10 years ago
parent
commit
cc5d44771a
3 changed files with 100 additions and 18 deletions
  1. 46 5
      gencs.ml
  2. 44 13
      genjava.ml
  3. 10 0
      tests/unit/src/unit/issues/Issue2989.hx

+ 46 - 5
gencs.ml

@@ -1165,6 +1165,45 @@ let configure gen =
 		| _ -> false
 		| _ -> false
 	in
 	in
 
 
+	let extract_statements expr =
+		let ret = ref [] in
+		let rec loop expr = match expr.eexpr with
+			| TCall ({ eexpr = TLocal {
+					v_name = "__is__" | "__typeof__" | "__array__" | "__sizeof__" | "__delegate__"
+				} }, el) ->
+				List.iter loop el
+			| TNew ({ cl_path = (["cs"], "NativeArray") }, params, [ size ]) ->
+				()
+			| TUnop (Ast.Increment, _, _)
+			| TUnop (Ast.Decrement, _, _)
+			| TBinop (Ast.OpAssign, _, _)
+			| TBinop (Ast.OpAssignOp _, _, _)
+			| TLocal { v_name = "__fallback__" }
+			| TLocal { v_name = "__sbreak__" } ->
+				ret := expr :: !ret
+			| TConst _
+			| TLocal _
+			| TArray _
+			| TBinop _
+			| TField _
+			| TEnumParameter _
+			| TTypeExpr _
+			| TObjectDecl _
+			| TArrayDecl _
+			| TCast _
+			| TMeta _
+			| TParenthesis _
+			| TUnop _ ->
+				Type.iter loop expr
+			| TFunction _ -> () (* do not extract parameters from inside of it *)
+			| _ ->
+				ret := expr :: !ret
+		in
+		loop expr;
+		(* [expr] *)
+		List.rev !ret
+	in
+
 	let expr_s w e =
 	let expr_s w e =
 		last_line := -1;
 		last_line := -1;
 		in_value := false;
 		in_value := false;
@@ -1515,11 +1554,13 @@ let configure gen =
 				| TBlock el ->
 				| TBlock el ->
 					begin_block w;
 					begin_block w;
 					List.iter (fun e ->
 					List.iter (fun e ->
-						line_directive w e.epos;
-						in_value := false;
-						expr_s w e;
-						(if has_semicolon e then write w ";");
-						newline w
+						List.iter (fun e ->
+							line_directive w e.epos;
+							in_value := false;
+							expr_s w e;
+							(if has_semicolon e then write w ";");
+							newline w
+						) (extract_statements e)
 					) el;
 					) el;
 					end_block w
 					end_block w
 				| TIf (econd, e1, Some(eelse)) when was_in_value ->
 				| TIf (econd, e1, Some(eelse)) when was_in_value ->

+ 44 - 13
genjava.ml

@@ -1190,6 +1190,45 @@ let configure gen =
 			print w "//line %d \"%s\"" cur_line (Ast.s_escape file); newline w
 			print w "//line %d \"%s\"" cur_line (Ast.s_escape file); newline w
 	in
 	in
 
 
+	let extract_statements expr =
+		let ret = ref [] in
+		let rec loop expr = match expr.eexpr with
+			| TCall ({ eexpr = TLocal {
+					v_name = "__is__" | "__typeof__" | "__array__"
+				} }, el) ->
+				List.iter loop el
+			| TNew ({ cl_path = (["java"], "NativeArray") }, params, [ size ]) ->
+				()
+			| TUnop (Ast.Increment, _, _)
+			| TUnop (Ast.Decrement, _, _)
+			| TBinop (Ast.OpAssign, _, _)
+			| TBinop (Ast.OpAssignOp _, _, _)
+			| TLocal { v_name = "__fallback__" }
+			| TLocal { v_name = "__sbreak__" } ->
+				ret := expr :: !ret
+			| TConst _
+			| TLocal _
+			| TArray _
+			| TBinop _
+			| TField _
+			| TEnumParameter _
+			| TTypeExpr _
+			| TObjectDecl _
+			| TArrayDecl _
+			| TCast _
+			| TMeta _
+			| TParenthesis _
+			| TUnop _ ->
+				Type.iter loop expr
+			| TFunction _ -> () (* do not extract parameters from inside of it *)
+			| _ ->
+				ret := expr :: !ret
+		in
+		loop expr;
+		(* [expr] *)
+		List.rev !ret
+	in
+
 	let expr_s w e =
 	let expr_s w e =
 		in_value := false;
 		in_value := false;
 		let rec expr_s w e =
 		let rec expr_s w e =
@@ -1431,22 +1470,14 @@ let configure gen =
 					expr_s w e
 					expr_s w e
 				| TBlock el ->
 				| TBlock el ->
 					begin_block w;
 					begin_block w;
-					(*let last_line = ref (-1) in
-					let line_directive p =
-						let cur_line = Lexer.get_error_line p in
-						let is_relative_path = (String.sub p.pfile 0 1) = "." in
-						let file = if is_relative_path then "../" ^ p.pfile else p.pfile in
-						if cur_line <> ((!last_line)+1) then begin print w "//#line %d \"%s\"" cur_line (Ast.s_escape file); newline w end;
-						last_line := cur_line in*)
 					List.iter (fun e ->
 					List.iter (fun e ->
-						in_value := false;
-						(match e.eexpr with
-						| TConst _ -> ()
-						| _ ->
+						List.iter (fun e ->
+							in_value := false;
 							line_directive w e.epos;
 							line_directive w e.epos;
 							expr_s w e;
 							expr_s w e;
-							(if has_semicolon e then write w ";");
-							newline w);
+							if has_semicolon e then write w ";";
+							newline w;
+						) (extract_statements e)
 					) el;
 					) el;
 					end_block w
 					end_block w
 				| TIf (econd, e1, Some(eelse)) when was_in_value ->
 				| TIf (econd, e1, Some(eelse)) when was_in_value ->

+ 10 - 0
tests/unit/src/unit/issues/Issue2989.hx

@@ -0,0 +1,10 @@
+package unit.issues;
+
+class Issue2989 extends Test
+{
+	public function test()
+	{
+		Std.is(null,Array);
+		new haxe.ds.Vector<Int>(10);
+	}
+}