@@ -2925,8 +2925,12 @@ end
|
2925 | 2925 | and InterRep : sig
|
2926 | 2926 | type t
|
2927 | 2927 |
|
| 2928 | +type inter_kind = |
| 2929 | +| ImplicitInstiationKind |
| 2930 | +| UnknownKind |
| 2931 | + |
2928 | 2932 | (** build rep from list of members *)
|
2929 |
| -val make : TypeTerm.t -> TypeTerm.t -> TypeTerm.t list -> t |
| 2933 | +val make : ?kind:inter_kind -> TypeTerm.t -> TypeTerm.t -> TypeTerm.t list -> t |
2930 | 2934 |
|
2931 | 2935 | (** member list in declaration order *)
|
2932 | 2936 | val members : t -> TypeTerm.t list
|
@@ -2936,33 +2940,39 @@ and InterRep : sig
|
2936 | 2940 | (** map rep r to rep r' along type mapping f. drops history *)
|
2937 | 2941 | val map : (TypeTerm.t -> TypeTerm.t) -> t -> t
|
2938 | 2942 |
|
2939 |
| -val append : TypeTerm.t list -> t -> t |
| 2943 | +val append : ?kind:inter_kind -> TypeTerm.t list -> t -> t |
2940 | 2944 |
|
2941 | 2945 | (** map rep r to rep r' along type mapping f. drops history. if nothing would
|
2942 | 2946 | be changed, returns the physically-identical rep. *)
|
2943 | 2947 | val ident_map : (TypeTerm.t -> TypeTerm.t) -> t -> t
|
| 2948 | + |
| 2949 | +val inter_kind : t -> inter_kind |
2944 | 2950 | end = struct
|
| 2951 | +type inter_kind = |
| 2952 | +| ImplicitInstiationKind |
| 2953 | +| UnknownKind |
| 2954 | + |
2945 | 2955 | (** intersection rep is:
|
2946 | 2956 | - member list in declaration order
|
2947 | 2957 | *)
|
2948 |
| -type t = TypeTerm.t * TypeTerm.t * TypeTerm.t list |
| 2958 | +type t = TypeTerm.t * TypeTerm.t * TypeTerm.t list * inter_kind |
2949 | 2959 |
|
2950 |
| -let make t0 t1 ts = (t0, t1, ts) |
| 2960 | +let make ?(kind = UnknownKind) t0 t1 ts = (t0, t1, ts, kind) |
2951 | 2961 |
|
2952 |
| -let members (t0, t1, ts) = t0 :: t1 :: ts |
| 2962 | +let members (t0, t1, ts, _) = t0 :: t1 :: ts |
2953 | 2963 |
|
2954 |
| -let members_nel (t0, t1, ts) = (t0, (t1, ts)) |
| 2964 | +let members_nel (t0, t1, ts, _) = (t0, (t1, ts)) |
2955 | 2965 |
|
2956 |
| -let map f (t0, t1, ts) = make (f t0) (f t1) (Base.List.map ~f ts) |
| 2966 | +let map f (t0, t1, ts, kind) = make ~kind (f t0) (f t1) (Base.List.map ~f ts) |
2957 | 2967 |
|
2958 |
| -let mem t (t0, t1, ts) = t = t0 || t = t1 || Base.List.mem ts t ~equal:( = ) |
| 2968 | +let mem t (t0, t1, ts, _) = t = t0 || t = t1 || Base.List.mem ts t ~equal:( = ) |
2959 | 2969 |
|
2960 |
| -let append ts2 rep = |
| 2970 | +let append ?(kind = UnknownKind) ts2 rep = |
2961 | 2971 | let ts2 = Base.List.filter ts2 ~f:(fun t -> not (mem t rep)) in
|
2962 |
| -let (t0, t1, ts1) = rep in |
2963 |
| -make t0 t1 (Base.List.append ts1 ts2) |
| 2972 | +let (t0, t1, ts1, _) = rep in |
| 2973 | +make ~kind t0 t1 (Base.List.append ts1 ts2) |
2964 | 2974 |
|
2965 |
| -let ident_map f ((t0, t1, ts) as rep) = |
| 2975 | +let ident_map f ((t0, t1, ts, kind) as rep) = |
2966 | 2976 | let t0_ = f t0 in
|
2967 | 2977 | let t1_ = f t1 in
|
2968 | 2978 | let changed = t0_ != t0 || t1_ != t1 in
|
@@ -2975,9 +2985,11 @@ end = struct
|
2975 | 2985 | ts
|
2976 | 2986 | in
|
2977 | 2987 | if changed then
|
2978 |
| -make t0_ t1_ (List.rev rev_ts) |
| 2988 | +make ~kind t0_ t1_ (List.rev rev_ts) |
2979 | 2989 | else
|
2980 | 2990 | rep
|
| 2991 | + |
| 2992 | +let inter_kind (_, _, _, kind) = kind |
2981 | 2993 | end
|
2982 | 2994 |
|
2983 | 2995 | and Object : sig
|
|
0 commit comments