2
0
Эх сурвалжийг харах

deal with non-optional enum args after optional ones (closes #https://github.com/frabbit/hx2python/issues/21)

Simon Krajewski 11 жил өмнө
parent
commit
95296ed913
2 өөрчлөгдсөн 36 нэмэгдсэн , 1 устгасан
  1. 17 1
      genpy.ml
  2. 19 0
      tests/unit/TestPython.hx

+ 17 - 1
genpy.ml

@@ -1672,7 +1672,23 @@ module Generator = struct
 			let f = handle_keywords ef.ef_name in
 			begin match follow ef.ef_type with
 				| TFun(args,_) ->
-					let param_str = (String.concat "," (List.map (fun (n,o,_) -> Printf.sprintf "%s%s" (handle_keywords n) (if o then " = None" else "")) args)) in
+					let print_args args =
+						let had_optional = ref false in
+						let sl = List.map (fun (n,o,_) ->
+							let name = handle_keywords n in
+							let arg_value = if !had_optional then
+								"= None"
+							else if o then begin
+								had_optional := true;
+								" = None"
+							end else
+								""
+							in
+							Printf.sprintf "%s%s" name arg_value
+						) args in
+						String.concat "," sl
+					in
+					let param_str = print_args args in
 					let args_str = String.concat "," (List.map (fun (n,_,_) -> handle_keywords n) args) in
 					print ctx "def _%s_statics_%s (%s):\n" p f param_str;
 					print ctx "\treturn %s(\"%s\", %i, [%s])\n" p ef.ef_name ef.ef_index args_str;

+ 19 - 0
tests/unit/TestPython.hx

@@ -7,6 +7,12 @@ private typedef T = {
 	var value:Int;
 	@:optional var maybeValue:Int;
 }
+
+private enum MyEnum {
+	A(?x:Int, b:String);
+	B;
+}
+
 class TestPython extends Test {
 
 	public function testDoWhileAsExpression () {
@@ -77,6 +83,19 @@ class TestPython extends Test {
 		eq(12, a[0]);
 	}
 
+	function testOptionalEnumArguments() {
+		var a1 = 1;
+		var a2 = null;
+		switch(A("foo")) {
+			case A(i, b):
+				a1 = i;
+				a2 = b;
+			case _:
+		}
+		eq(null, a1);
+		eq("foo", a2);
+	}
+
 	/*
 	function testSys () {