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

add haxe.runtime.FieldHost and use it for Reflect.fields

Simon Krajewski 5 сар өмнө
parent
commit
d5444db3ab

+ 4 - 4
std/Reflect.hx

@@ -98,14 +98,14 @@ extern class Reflect {
 	static function callMethod(o:Dynamic, func:haxe.Constraints.Function, args:Array<Dynamic>):Dynamic;
 
 	/**
-		Returns the fields of structure `o`.
+		Returns the fields of anonymous structure or class instance `o`.
 
-		This method is only guaranteed to work on anonymous structures. Refer to
-		`Type.getInstanceFields` for a function supporting class instances.
+		On flash, this method is only guaranteed to work on anonymous structures.
+		Refer to `Type.getInstanceFields` for a function supporting class instances.
 
 		If `o` is null, the result is unspecified.
 	**/
-	static function fields(o:Dynamic):Array<String>;
+	static function fields(o:haxe.runtime.FieldHost):Array<String>;
 
 	/**
 		Returns true if `f` is a function, false otherwise.

+ 2 - 2
std/cpp/_std/Reflect.hx

@@ -59,7 +59,7 @@ class Reflect {
 		return untyped func.__Run(args);
 	}
 
-	public static function fields(o:Dynamic):Array<String> untyped {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> untyped {
 		if (o == null)
 			return new Array();
 		var a:Array<String> = [];
@@ -108,7 +108,7 @@ class Reflect {
 		if (untyped o.__GetType() == ObjectType.vtArray)
 			return untyped o.__Field("copy", untyped __cpp__("::hx::paccDynamic"))();
 		var o2:Dynamic = {};
-		for (f in Reflect.fields(o))
+		for (f in Reflect.fields(cast o))
 			Reflect.setField(o2, f, Reflect.field(o, f));
 		return o2;
 	}

+ 2 - 2
std/flash/_std/Reflect.hx

@@ -55,7 +55,7 @@
 		return func.apply(o, args);
 	}
 
-	public static function fields(o:Dynamic):Array<String> untyped {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> untyped {
 		if (o == null)
 			return new Array();
 		var i = 0;
@@ -107,7 +107,7 @@
 		if (o == null)
 			return null;
 		var o2:Dynamic = {};
-		for (f in Reflect.fields(o))
+		for (f in Reflect.fields(cast o))
 			Reflect.setField(o2, f, Reflect.field(o, f));
 		return o2;
 	}

+ 6 - 0
std/haxe/runtime/FieldHost.hx

@@ -0,0 +1,6 @@
+package haxe.runtime;
+
+@:transitive
+abstract FieldHost(Dynamic) from {}
+	from Dynamic<Dynamic>
+	#if (jvm || neko || js) from Class<Dynamic>#end {}

+ 1 - 1
std/hl/_std/Reflect.hx

@@ -87,7 +87,7 @@ class Reflect {
 		return null;
 	}
 
-	public static function fields(o:Dynamic):Array<String> {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> {
 		var fields = getObjectFields(o);
 		if (fields == null)
 			return [];

+ 2 - 2
std/js/_std/Reflect.hx

@@ -55,7 +55,7 @@
 		return (cast func : js.lib.Function).apply(o, args);
 	}
 
-	public static function fields(o:Dynamic):Array<String> {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> {
 		var a = [];
 		if (o != null) untyped {
 			var hasOwnProperty = js.lib.Object.prototype.hasOwnProperty;
@@ -104,7 +104,7 @@
 		if (o == null)
 			return null;
 		var o2:Dynamic = {};
-		for (f in Reflect.fields(o))
+		for (f in Reflect.fields(cast o))
 			Reflect.setField(o2, f, Reflect.field(o, f));
 		return o2;
 	}

+ 3 - 3
std/jvm/_std/Reflect.hx

@@ -77,12 +77,12 @@ class Reflect {
 		return Jvm.call(cast func, @:privateAccess args.getNative());
 	}
 
-	public static function fields(o:Dynamic):Array<String> {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> {
 		if (!Jvm.instanceof(o, jvm.DynamicObject)) {
 			if (Jvm.instanceof(o, java.lang.Class)) {
-				return Type.getClassFields(o);
+				return Type.getClassFields(cast o);
 			}
-			var c = (o : java.lang.Object).getClass();
+			var c = (cast o : java.lang.Object).getClass();
 			var ret = [];
 			for (f in c.getDeclaredFields()) {
 				if (java.lang.reflect.Modifier.isStatic(f.getModifiers()) == false && !f.isSynthetic()) {

+ 1 - 1
std/lua/_std/Reflect.hx

@@ -83,7 +83,7 @@ import lua.TableTools;
 		}
 	}
 
-	public static function fields(o:Dynamic):Array<String> {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> {
 		if (lua.Lua.type(o) == "string") {
 			return Reflect.fields(untyped String.prototype);
 		} else {

+ 1 - 1
std/neko/_std/Reflect.hx

@@ -62,7 +62,7 @@
 		return $call(func, o, a);
 	}
 
-	public static function fields(o:Dynamic):Array<String> untyped {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> untyped {
 		if ($typeof(o) != $tobject)
 			return new Array<String>();
 		else {

+ 2 - 2
std/php/_std/Reflect.hx

@@ -113,9 +113,9 @@ using php.Global;
 		return Global.call_user_func_array(func, @:privateAccess args.arr);
 	}
 
-	public static function fields(o:Dynamic):Array<String> {
+	public static function fields(o:haxe.runtime.FieldHost):Array<String> {
 		if (Global.is_object(o)) {
-			return @:privateAccess Array.wrap(Global.get_object_vars(o).array_keys());
+			return @:privateAccess Array.wrap(Global.get_object_vars(cast o).array_keys());
 		}
 		return [];
 	}

+ 2 - 2
std/python/_std/Reflect.hx

@@ -76,7 +76,7 @@ class Reflect {
 		return if (UBuiltins.callable(func)) func(python.Syntax.varArgs(args)) else null;
 	}
 
-	public static inline function fields(o:Dynamic):Array<String> {
+	public static inline function fields(o:haxe.runtime.FieldHost):Array<String> {
 		return python.Boot.fields(o);
 	}
 
@@ -131,7 +131,7 @@ class Reflect {
 		if (o == null)
 			return null;
 		var o2:Dynamic = {};
-		for (f in Reflect.fields(o))
+		for (f in Reflect.fields(cast o))
 			Reflect.setField(o2, f, Reflect.field(o, f));
 		return o2;
 	}