Преглед изворни кода

[typer] support & Dynamic<T>

Simon Krajewski пре 3 година
родитељ
комит
967c979e0f
3 измењених фајлова са 16 додато и 2 уклоњено
  1. 5 1
      src/core/tFunctions.ml
  2. 6 1
      src/typing/typeload.ml
  3. 5 0
      tests/unit/src/unit/issues/Issue9825.hx

+ 5 - 1
src/core/tFunctions.ml

@@ -420,7 +420,11 @@ let apply_params ?stack cparams params t =
 			TFun (List.map (fun (s,o,t) -> s, o, loop t) tl,loop r)
 		| TAnon a ->
 			let fields = PMap.map (fun f -> { f with cf_type = loop f.cf_type }) a.a_fields in
-			mk_anon ~fields a.a_status
+			let status = match !(a.a_status) with
+				| Extend tl -> ref (Extend (List.map loop tl))
+				| _ -> a.a_status
+			in
+			mk_anon ~fields status
 		| TLazy f ->
 			let ft = lazy_type f in
 			let ft2 = loop ft in

+ 6 - 1
src/typing/typeload.ml

@@ -271,7 +271,12 @@ let make_extension_type ctx tl =
 				else fields
 			) a.a_fields fields
 		| TDynamic _ ->
-			extends_dynamic := Some t;
+			begin match !extends_dynamic with
+			| None ->
+				extends_dynamic := Some t;
+			| Some _ ->
+				display_error ctx "Can only extend one Dynamic<T>" p
+			end;
 			fields
 		| _ ->
 			error "Can only extend structures" p

+ 5 - 0
tests/unit/src/unit/issues/Issue9825.hx

@@ -6,5 +6,10 @@ typedef KnownDynamic<T> = {known:T} &
 class Issue9825 extends Test {
 	function test() {
 		var d:KnownDynamic<String> = {known: "foo", also: "bar"};
+		eq("foo", d.known);
+		eq("bar", d.also);
+		d.even = "even";
+		eq("even", d.even);
+		t(HelperMacros.typeError(d.no = 12));
 	}
 }