Browse Source

add EqDoNotFollowNull and `can_follow` to `type_eq`

Simon Krajewski 10 years ago
parent
commit
08a4aba1dd
1 changed files with 8 additions and 2 deletions
  1. 8 2
      type.ml

+ 8 - 2
type.ml

@@ -1194,8 +1194,14 @@ type eq_kind =
 	| EqCoreType
 	| EqRightDynamic
 	| EqBothDynamic
+	| EqDoNotFollowNull (* like EqStrict, but does not follow Null<T> *)
 
 let rec type_eq param a b =
+	let can_follow t = match param with
+		| EqCoreType -> false
+		| EqDoNotFollowNull -> not (is_null t)
+		| _ -> true
+	in
 	if a == b then
 		()
 	else match a , b with
@@ -1211,9 +1217,9 @@ let rec type_eq param a b =
 		| Some t -> type_eq param a t)
 	| TType (t1,tl1), TType (t2,tl2) when (t1 == t2 || (param = EqCoreType && t1.t_path = t2.t_path)) && List.length tl1 = List.length tl2 ->
 		List.iter2 (type_eq param) tl1 tl2
-	| TType (t,tl) , _ when param <> EqCoreType ->
+	| TType (t,tl) , _ when can_follow a ->
 		type_eq param (apply_params t.t_params tl t.t_type) b
-	| _ , TType (t,tl) when param <> EqCoreType ->
+	| _ , TType (t,tl) when can_follow b ->
 		if List.exists (fun (a2,b2) -> fast_eq a a2 && fast_eq b b2) (!eq_stack) then
 			()
 		else begin