ソースを参照

[cs][java] follow typedefs on types normalization
fixes #8589; related #6635

Aleksandr Kuzmenko 5 年 前
コミット
7f02724c91

+ 20 - 16
src/codegen/gencommon/normalize.ml

@@ -29,41 +29,45 @@ open Gencommon
 		as it will help normalize the AST
 *)
 
-let rec filter_param t =
+let rec filter_param stack t =
 	match t with
 	| TInst({ cl_kind = KTypeParameter _ } as c,_) when Meta.has Meta.EnumConstructorParam c.cl_meta ->
 		t_dynamic
 	| TMono r ->
 		(match !r with
 		| None -> t_dynamic
-		| Some t -> filter_param t)
-	| TInst(_,[]) | TEnum(_,[]) | TType(_,[]) | TAbstract(_,[]) ->
+		| Some t -> filter_param stack t)
+	| TInst(_,[]) | TEnum(_,[]) | TAbstract(_,[]) ->
 		t
-	| TType(t,tl) ->
-		TType(t,List.map filter_param tl)
+	| TType(td,tl) when Meta.has Meta.Semantics td.t_meta || Meta.has Meta.Strict td.t_meta || List.memq t stack ->
+		TType(td,List.map (filter_param stack) tl)
+	| TType(td,tl) ->
+		filter_param (t :: stack) (apply_params td.t_params tl td.t_type)
 	| TInst(c,tl) ->
-		TInst(c,List.map filter_param tl)
+		TInst(c,List.map (filter_param stack) tl)
 	| TEnum(e,tl) ->
-		TEnum(e,List.map filter_param tl)
+		TEnum(e,List.map (filter_param stack) tl)
 	| TAbstract({ a_path = (["haxe";"extern"],"Rest") } as a,tl) ->
-		TAbstract(a, List.map filter_param tl)
+		TAbstract(a, List.map (filter_param stack) tl)
 	| TAbstract({a_path = [],"Null"} as a,[t]) ->
-		TAbstract(a,[filter_param t])
-	| TAbstract(a,tl) when (Meta.has Meta.MultiType a.a_meta) ->
-		filter_param (Abstract.get_underlying_type a tl)
+		TAbstract(a,[filter_param stack t])
+	| TAbstract(a,tl) when not (Meta.has Meta.CoreType a.a_meta) ->
+		filter_param stack (Abstract.get_underlying_type a tl)
 	| TAbstract(a,tl) ->
-		TAbstract(a, List.map filter_param tl)
+		TAbstract(a, List.map (filter_param stack) tl)
 	| TAnon a ->
 		TAnon {
-			a_fields = PMap.map (fun f -> { f with cf_type = filter_param f.cf_type }) a.a_fields;
-			a_status = a.a_status;
+			a_fields = PMap.map (fun f -> { f with cf_type = filter_param stack f.cf_type }) a.a_fields;
+			a_status = a.a_status
 		}
 	| TFun(args,ret) ->
-		TFun(List.map (fun (n,o,t) -> (n,o,filter_param t)) args, filter_param ret)
+		TFun(List.map (fun (n,o,t) -> (n,o,filter_param stack t)) args, filter_param stack ret)
 	| TDynamic _ ->
 		t
 	| TLazy f ->
-		filter_param (lazy_type f)
+		filter_param stack (lazy_type f)
+
+let filter_param t = filter_param [] t
 
 let init_expr_filter allowed_metas =
 	let rec run e =

+ 13 - 0
tests/misc/cs/projects/Issue6635/Main.hx

@@ -0,0 +1,13 @@
+abstract A<V>(String) {}
+
+typedef S = {a:A<Int>};
+
+class Main {
+	function new(s:S) {}
+
+	static function getS():S return null;
+
+	static function main() {
+		new Main(getS());
+	}
+}

+ 3 - 0
tests/misc/cs/projects/Issue6635/compile.hxml

@@ -0,0 +1,3 @@
+-main Main
+-cs bin
+-D no-compilation

+ 0 - 0
tests/misc/cs/projects/Issue6635/compile.hxml.stderr


+ 10 - 0
tests/misc/cs/projects/Issue8589/Main.hx

@@ -0,0 +1,10 @@
+import cs.system.collections.generic.List_1;
+
+typedef T = {id:String};
+
+class Main {
+	public static function main() {
+		var list:List_1<T> = new List_1();
+		list.ConvertAll((t:T) -> t.id);
+	}
+}

+ 3 - 0
tests/misc/cs/projects/Issue8589/compile.hxml

@@ -0,0 +1,3 @@
+-main Main
+-cs bin
+-D no-compilation

+ 0 - 0
tests/misc/cs/projects/Issue8589/compile.hxml.stderr


+ 0 - 24
tests/unit/src/unit/issues/Issue6635.hx

@@ -1,24 +0,0 @@
-package unit.issues;
-
-class Issue6635 extends Test
-{
-  public function test()
-  {
-    var t = Main.main();
-	noAssert();
-  }
-}
-
-@:keep private abstract A<V>(String) {}
-
-private typedef S = {a:A<Int>};
-
-@:keep private class Main {
-	function new(s:S) {}
-
-	static function getS():S return null;
-
-	public static function main() {
-		return new Main(getS());
-	}
-}