Procházet zdrojové kódy

[cs] Fixed dynamic array access on native classes. Prepare test for optionals.

Cauê Waneck před 10 roky
rodič
revize
6702276558

+ 18 - 1
std/cs/internal/Runtime.hx

@@ -302,6 +302,9 @@ import cs.system.Object;
 			if (prop == null)
 			{
 				System.Reflection.MemberInfo[] m = t.GetMember(field, bf);
+				if (m.Length == 0 && (field == "__get" || field == "__set"))
+					m = t.GetMember(field == "__get" ? "get_Item" : "set_Item", bf);
+
 				if (m.Length > 0)
 				{
 					return new haxe.lang.Closure(obj != null ? obj : t, field, 0);
@@ -566,12 +569,26 @@ import cs.system.Object;
 		int last = 0;
 		for (int i = 0; i < mis.Length; i++)
 		{
-			if (mis[i].Name.Equals(field))
+			string name = mis[i].Name;
+			if (name.Equals(field))
 			{
 				mis[last++] = mis[i];
 			}
 		}
 
+		if (last == 0 && (field == "__get" || field == "__set"))
+		{
+			field = field == "__get" ? "get_Item" : "set_Item";
+			for (int i = 0; i < mis.Length; i++)
+			{
+				string name = mis[i].Name;
+				if (name.Equals(field))
+				{
+					mis[last++] = mis[i];
+				}
+			}
+		}
+
 		if (last == 0)
 		{
 			throw haxe.lang.HaxeException.wrap("Method \'" + field + "\' not found on type " + t);

+ 23 - 0
tests/unit/native_cs/src/haxe/test/Base.cs

@@ -26,6 +26,29 @@ public class Base
 		return -1;
 	}
 
+	public string prop 
+	{
+		get
+		{
+			return "SomeValue";
+		}
+	}
+
+	public int this[int i]
+	{
+		get { return i * 20; }
+	}
+
+	public int this[int i, int j]
+	{
+		get { return i * j; }
+	}
+
+	public int optional(int i=42)
+	{
+		return i * 10;
+	}
+
 	public virtual int nameClash()
 	{
 		return 1;

+ 31 - 0
tests/unit/src/unit/TestCSharp.hx

@@ -52,6 +52,37 @@ class TestCSharp extends Test
 		t(l.works);
 	}
 
+	function testGetItem()
+	{
+		var b = new Base();
+		eq(b[1], 20);
+		eq(b.get_Item(2,3), 6);
+		var dyn:Dynamic = b;
+		eq(dyn[1], 20);
+		eq(dyn.get_Item(2,3), 6);
+
+		var b:Base = new Base_InnerClass();
+		eq(b[1], 20);
+		eq(b.get_Item(2,3), 6);
+		var dyn:Dynamic = b;
+		eq(dyn[1], 20);
+		eq(dyn.get_Item(2,3), 6);
+	}
+
+	// function testOptional()
+	// {
+	// 	eq(new Base().optional(), 420);
+	// 	eq(new Base().optional(10), 100);
+	// }
+
+	function testProp()
+	{
+		var b = new Base();
+		eq(b.prop, "SomeValue");
+		var dyn:Dynamic = b;
+		eq(dyn.prop, "SomeValue");
+	}
+
 #if unsafe
 	@:unsafe function testBoxedPointer()
 	{