Nicolas Cannasse 19 years ago
parent
commit
2cb139c136
1 changed files with 211 additions and 0 deletions
  1. 211 0
      std/Type.hx

+ 211 - 0
std/Type.hx

@@ -0,0 +1,211 @@
+
+/**
+	An abstract type that represents a Class.
+**/
+enum Class {
+}
+
+/**
+	An abstract type that represents an Enum.
+**/
+enum Enum {
+}
+
+class Type {
+
+	/**
+		Returns the class of an object
+	**/
+	public static function getClass( o : Dynamic ) : Class untyped {
+		#if flash9
+			var cname = __global__["flash.utils.getQualifiedClassName"](o);
+			if( cname == "null" || cname == "Object" || cname.substr(0,8) == "builtin." )
+				return null;
+			if( o.hasOwnProperty("prototype") )
+				return null;
+			var c = __global__["flash.utils.getDefinitionByName"](cname);
+			if( c.__isenum )
+				return null;
+			return c;
+		#else flash
+			return o.__class__;
+		#else js
+			if( o == null )
+				return null;
+			return o.__class__;
+		#else neko
+			if( __dollar__typeof(o) != __dollar__tobject )
+				return null;
+			var p = __dollar__objgetproto(o);
+			if( p == null )
+				return null;
+			return p.__class__;
+		#else error
+		#end
+	}
+
+	/**
+		Returns the class of an object
+	**/
+	public static function getEnum( o : Dynamic ) : Enum untyped {
+		#if flash9
+			var cname = __global__["flash.utils.getQualifiedClassName"](o);
+			if( cname == "null" || cname == "Object" || cname.substr(0,8) == "builtin." )
+				return null;
+			// getClass(Class) should be null
+			if( o.hasOwnProperty("prototype") )
+				return null;
+			var c = __global__["flash.utils.getDefinitionByName"](cname);
+			if( !c.__isenum )
+				return null;
+			return c;
+		#else flash
+			return o.__enum__;
+		#else js
+			if( o == null )
+				return null;
+			return o.__enum__;
+		#else neko
+			if( __dollar__typeof(o) != __dollar__tobject )
+				return null;
+			return o.__enum__;
+		#else error
+		#end
+	}
+
+
+	/**
+		Returns the super-class of a class
+	**/
+	public static function getSuperClass( c : Class ) : Class untyped {
+		#if flash9
+			var cname = __global__["flash.utils.getQualifiedSuperclassName"](c);
+			if( cname == "Object" )
+				return null;
+			return __global__["flash.utils.getDefinitionByName"](cname);
+		#else true
+			return c.__super__;
+		#end
+	}
+
+
+	/**
+		Returns the complete name of the class of an object
+	**/
+	public static function getClassName( c : Class ) : String {
+		#if flash9
+			var n = untyped __global__["flash.utils.getQualifiedClassName"](c);
+			return switch( n ) {
+			case "int": "Int";
+			case "Number": "Float";
+			case "Boolean": "Bool";
+			default: n;
+			}
+		#else true
+			return untyped c.__name__.join(".");
+		#end
+	}
+
+	/**
+		Returns the complete name of the class of an object
+	**/
+	public static function getEnumName( e : Enum ) : String {
+		#if flash9
+			var n = untyped __global__["flash.utils.getQualifiedClassName"](e);
+			return n;
+		#else true
+			return untyped e.__ename__.join(".");
+		#end
+	}
+
+	/**
+		Evaluates a class from a name
+	**/
+	public static function resolveClass( name : String ) : Class {
+		var cl : Class;
+		untyped {
+		#if flash9
+			try {
+				cl = __global__["flash.utils.getDefinitionByName"](name);
+				if( cl.__isenum )
+					return null;
+				return cl; // skip test below
+			} catch( e : Dynamic ) {
+				return null;
+			}
+		#else flash
+			cl = __eval__(name);
+		#else js
+			cl = eval(name);
+		#else neko
+			var path = name.split(".");
+			cl = Reflect.field(untyped neko.Boot.__classes,path[0]);
+			var i = 1;
+			while( cl != null && i < path.length ) {
+				cl = Reflect.field(cl,name[i]);
+				i += 1;
+			}
+		#else error
+		#end
+		// ensure that this is a class
+		if( cl == null || cl.__interfaces__ == null )
+			return null;
+		}
+		return cl;
+	}
+
+
+	/**
+		Evaluates an enum from a name
+	**/
+	public static function resolveEnum( name : String ) : Enum {
+		var e : Dynamic;
+		untyped {
+		#if flash9
+			try {
+				e = __global__["flash.utils.getDefinitionByName"](name);
+				if( !e.__isenum )
+					return null;
+				return e;
+			} catch( e : Dynamic ) {
+				return null;
+			}
+		#else flash
+			e = __eval__(name);
+		#else js
+			e = eval(name);
+		#else neko
+			var path = name.split(".");
+			e = untyped field(neko.Boot.__classes,path[0]);
+			var i = 1;
+			while( e != null && i < path.length ) {
+				e = field(cl,path[i]);
+				i += 1;
+			}
+		#else error
+		#end
+		if( e == null || e.__ename__ == null )
+			return null;
+		}
+		return e;
+	}
+
+
+	/**
+		Change the class prototype of an object
+	**/
+	public static function setPrototype( obj : Dynamic, proto : Dynamic ) {
+		#if flash9
+			throw "Not implemented";
+		#else flash
+			obj.__proto__ = proto;
+		#else js
+			obj.__proto__ = proto;
+		#else neko
+			untyped __dollar__objsetproto(obj,proto);
+		#else error
+		#end
+	}
+
+}
+