浏览代码

[cs] Generic resolveClass and more Type API fixes

Caue Waneck 13 年之前
父节点
当前提交
765f9772f8
共有 3 个文件被更改,包括 22 次插入12 次删除
  1. 4 3
      gencommon.ml
  2. 3 3
      gencs.ml
  3. 15 6
      std/cs/_std/Type.hx

+ 4 - 3
gencommon.ml

@@ -3875,7 +3875,7 @@ struct
         
         cfield
       
-      let default_implementation gen ifaces =
+      let default_implementation gen ifaces base_generic =
         let add_iface cl = 
           gen.gadd_to_module (TClassDecl cl) (max_dep);
         in
@@ -3889,6 +3889,7 @@ struct
               iface.cl_meta <- (":hxgen", [], cl.cl_pos) :: iface.cl_meta;
               Hashtbl.add ifaces cl.cl_path iface;
               
+              iface.cl_implements <- (base_generic, []) :: iface.cl_implements;
               iface.cl_interface <- true;
               cl.cl_implements <- (iface, []) :: cl.cl_implements;
               
@@ -3948,9 +3949,9 @@ struct
       let map e = Some(traverse e) in
       gen.gsyntax_filters#add ~name:name ~priority:(PCustom priority) map
     
-    let default_config gen (dyn_tparam_cast:texpr->t->texpr) ifaces =
+    let default_config gen (dyn_tparam_cast:texpr->t->texpr) ifaces base_generic =
       configure gen (default_implementation gen dyn_tparam_cast ifaces);
-      RealTypeParamsModf.configure gen (RealTypeParamsModf.default_implementation gen ifaces)
+      RealTypeParamsModf.configure gen (RealTypeParamsModf.default_implementation gen ifaces base_generic)
     
   end;;
   

+ 3 - 3
gencs.ml

@@ -331,7 +331,7 @@ struct
 end;;
 
 (* Type Parameters Handling *)
-let handle_type_params gen ifaces =
+let handle_type_params gen ifaces base_generic =
   let basic = gen.gcon.basic in
     (*
       starting to set gtparam_cast.
@@ -426,7 +426,7 @@ let handle_type_params gen ifaces =
     Hashtbl.add gen.gtparam_cast (["cs"], "NativeArray") gtparam_cast_native_array;
     (* end set gtparam_cast *)
   
-  TypeParams.RealTypeParams.default_config gen (fun e t -> gen.gcon.warning ("Cannot cast to " ^ (debug_type t)) e.epos; mk_cast t e) ifaces
+  TypeParams.RealTypeParams.default_config gen (fun e t -> gen.gcon.warning ("Cannot cast to " ^ (debug_type t)) e.epos; mk_cast t e) ifaces base_generic
  
 let connecting_string = "?" (* ? see list here http://www.fileformat.info/info/unicode/category/index.htm and here for C# http://msdn.microsoft.com/en-us/library/aa664670.aspx *)
 let default_package = "cs" (* I'm having this separated as I'm still not happy with having a cs package. Maybe dotnet would be better? *)
@@ -1470,7 +1470,7 @@ let configure gen =
     mk_cast ecall.etype { ecall with eexpr = TCall(infer, call_args) }
   in
   
-  handle_type_params gen ifaces;
+  handle_type_params gen ifaces (get_cl (get_type gen (["haxe";"lang"], "IGenericObject")));
   
   let rcf_ctx = ReflectionCFs.new_ctx gen closure_t object_iface true rcf_on_getset_field rcf_on_call_field (fun hash hash_array ->
     { hash with eexpr = TCall(rcf_static_find, [hash; hash_array]); etype=basic.tint }

+ 15 - 6
std/cs/_std/Type.hx

@@ -85,7 +85,7 @@ enum ValueType {
 			case "System.Int32": "Int";
 			case "System.Double": "Float";
 			case "System.String": "String";
-			default: ret;
+			default: ret.split("`")[0];
 		}
 	}
 
@@ -118,9 +118,18 @@ enum ValueType {
 				case #if no-root "haxe.root.String" #else "String" #end: return String;
 				default: return null;
 			}
-		} else if (t.IsInterface && t.IsAssignableFrom(untyped __typeof__(IGenericObject))) { 
-			//return t.Get
-			return null;
+		} else if (t.IsInterface && cast(untyped __typeof__(IGenericObject), system.Type).IsAssignableFrom(t)) { 
+			t = null;
+			var i = 0;
+			var ts = "";
+			while (t == null && i < 18)
+			{
+				i++;
+				ts += (i == 1 ? "" : ",") + "System.Object";
+				t = system.Type.GetType(name + "`" + i + "[" + ts + "]");
+			}
+			
+			return Lib.fromNativeType(t);
 		} else {
 			return Lib.fromNativeType(t);
 		}
@@ -171,11 +180,11 @@ enum ValueType {
 	@:functionBody('
 		Array<object> ret = new Array<object>();
 
-        System.Reflection.MemberInfo[] mis = c.GetMembers(System.Reflection.BindingFlags.Public);
+        System.Reflection.MemberInfo[] mis = c.GetMembers(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Instance);
         for (int i = 0; i < mis.Length; i++)
         {
 			string n = mis[i].Name;
-			if (!n.StartsWith("__hx_"))
+			if (!n.StartsWith("__hx_") && n[0] != \'.\')
 				ret.push(mis[i].Name);
         }