Browse Source

[python] support runtime call on split for strings typed as anons or dynamic, closes #6379

frabbit 8 năm trước cách đây
mục cha
commit
89f9fbae22

+ 1 - 1
src/generators/genpy.ml

@@ -1621,7 +1621,7 @@ module Printer = struct
 					"print(" ^ (print_expr pctx e) ^ ")"
 				else
 					"print(str(" ^ (print_expr pctx e) ^ "))"
-			| TField(e1,((FAnon {cf_name = (("join" | "push" | "map" | "filter") as s)}) | FDynamic (("join" | "push" | "map" | "filter") as s))), [x] ->
+			| TField(e1,((FAnon {cf_name = (("split" | "join" | "push" | "map" | "filter") as s)}) | FDynamic (("split" | "join" | "push" | "map" | "filter") as s))), [x] ->
 				Printf.sprintf "HxOverrides.%s(%s, %s)" s (print_expr pctx e1) (print_expr pctx x)
 			| TField(e1,((FAnon {cf_name = (("iterator" | "toUpperCase" | "toLowerCase" | "pop" | "shift") as s)}) | FDynamic (("iterator" | "toUpperCase" | "toLowerCase" | "pop" | "shift") as s))), [] ->
 				Printf.sprintf "HxOverrides.%s(%s)" s (print_expr pctx e1)

+ 3 - 3
std/python/_std/String.hx

@@ -26,9 +26,9 @@ import python.internal.StringImpl;
 @:native("str")
 extern class String {
 	var length(default,null) : Int;
-	
+
 	function new(string:String) : Void;
-	
+
 	@:runtime public inline function toUpperCase() : String {
 		return StringImpl.toUpperCase(this);
 	}
@@ -55,7 +55,7 @@ extern class String {
 		return StringImpl.lastIndexOf(this, str, startIndex);
 	}
 
-	inline function split( delimiter : String ) : Array<String> {
+	@:runtime inline function split( delimiter : String ) : Array<String> {
 		return StringImpl.split(this, delimiter);
 	}
 

+ 8 - 0
std/python/internal/HxOverrides.hx

@@ -117,6 +117,14 @@ class HxOverrides {
 		return Syntax.callField(x, "toLowerCase");
 	}
 
+	@:ifFeature("dynamic_read.split", "anon_optional_read.split", "anon_read.split")
+	static public function split(x:Dynamic, delimiter:String) {
+		if (Boot.isString(x)) {
+			return (x:String).split(delimiter);
+		}
+		return Syntax.callField(x, "split", delimiter);
+	}
+
 	@:ifFeature("dynamic_read.length", "anon_optional_read.length", "anon_read.length")
 	static public function length(x:Dynamic) {
 		if (Boot.isString(x)) {

+ 13 - 0
tests/unit/src/unit/issues/Issue6379.hx

@@ -0,0 +1,13 @@
+package unit.issues;
+
+class Issue6379 extends unit.Test {
+	function test() {
+        eq(g("x_x").length, 2);
+    }
+
+	function g(s) {
+		var r = s.split("_");
+		g.bind("");
+        return r;
+	}
+}