@@ -1411,14 +1411,25 @@ struct
14111411 ( _,
14121412 {
14131413 opaque_id = Opaque. UserDefinedOpaqueTypeId (opaque_id, _);
1414- underlying_t = Some t ;
1414+ underlying_t = Opaque. NormalUnderlying { t } ;
14151415 _;
14161416 }
14171417 ),
14181418 ToStringT { reason; t_out; _ }
14191419 )
14201420 when ALoc. source (opaque_id :> ALoc.t ) = Some (Context. file cx) ->
14211421 rec_flow cx trace (t, ToStringT { orig_t = Some l; reason; t_out })
1422+ | ( OpaqueT
1423+ ( _,
1424+ {
1425+ opaque_id = Opaque. UserDefinedOpaqueTypeId _;
1426+ underlying_t = Opaque. FullyTransparentForCustomError { t; custom_error_loc = _ };
1427+ _;
1428+ }
1429+ ),
1430+ ToStringT { reason; t_out; _ }
1431+ ) ->
1432+ rec_flow cx trace (t, ToStringT { orig_t = Some l; reason; t_out })
14221433 (* Use the upper bound of OpaqueT if it's available, for operations that must be
14231434 * performed on some concretized types. *)
14241435 | (OpaqueT (_, { upper_t = Some t; _ }), ObjKitT _)
@@ -1434,14 +1445,25 @@ struct
14341445 ( _,
14351446 {
14361447 opaque_id = Opaque. UserDefinedOpaqueTypeId (opaque_id, _);
1437- underlying_t = Some t ;
1448+ underlying_t = Opaque. NormalUnderlying { t; _ } ;
14381449 _;
14391450 }
14401451 ),
14411452 _
14421453 )
14431454 when ALoc. source (opaque_id :> ALoc.t ) = Some (Context. file cx) ->
14441455 rec_flow cx trace (t, u)
1456+ | ( OpaqueT
1457+ ( _,
1458+ {
1459+ opaque_id = Opaque. UserDefinedOpaqueTypeId _;
1460+ underlying_t = Opaque. FullyTransparentForCustomError { t; custom_error_loc = _ };
1461+ _;
1462+ }
1463+ ),
1464+ _
1465+ ) ->
1466+ rec_flow cx trace (t, u)
14451467 (* ****************************************************)
14461468 (* keys (NOTE: currently we only support string keys *)
14471469 (* ****************************************************)
@@ -5528,10 +5550,17 @@ struct
55285550 )
55295551 )
55305552 | OpaqueT (r , ({ underlying_t; lower_t; upper_t; opaque_type_args; _ } as opaquetype )) ->
5553+ let underlying_t =
5554+ match underlying_t with
5555+ | Opaque. FullyOpaque -> Opaque. FullyOpaque
5556+ | Opaque. FullyTransparentForCustomError { t; custom_error_loc } ->
5557+ Opaque. FullyTransparentForCustomError { t = only_any t; custom_error_loc }
5558+ | Opaque. NormalUnderlying { t } -> Opaque. NormalUnderlying { t = only_any t }
5559+ in
55315560 let opaquetype =
55325561 {
55335562 opaquetype with
5534- underlying_t = Base.Option. (underlying_t >> | only_any) ;
5563+ underlying_t;
55355564 lower_t = Base.Option. (lower_t >> | only_any);
55365565 upper_t = Base.Option. (upper_t >> | only_any);
55375566 opaque_type_args =
@@ -6412,7 +6441,13 @@ struct
64126441 * lower_t to be inspectable *)
64136442 eagerly_eval_destructor_if_resolved cx ~trace use_op reason t d tvar
64146443 in
6415- let underlying_t = Base.Option. map ~f: eval_t underlying_t in
6444+ let underlying_t =
6445+ match underlying_t with
6446+ | Opaque. FullyOpaque -> Opaque. FullyOpaque
6447+ | Opaque. FullyTransparentForCustomError { t; custom_error_loc } ->
6448+ Opaque. FullyTransparentForCustomError { t = eval_t t; custom_error_loc }
6449+ | Opaque. NormalUnderlying { t } -> Opaque. NormalUnderlying { t = eval_t t }
6450+ in
64166451 let lower_t = Base.Option. map ~f: eval_t lower_t in
64176452 let upper_t = Base.Option. map ~f: eval_t upper_t in
64186453 let opaque_t = OpaqueT (r, { opaquetype with underlying_t; lower_t; upper_t }) in
@@ -6438,7 +6473,7 @@ struct
64386473 ( _,
64396474 {
64406475 opaque_id = Opaque. UserDefinedOpaqueTypeId (opaque_id, _);
6441- underlying_t = Some t ;
6476+ underlying_t = Opaque. NormalUnderlying { t } ;
64426477 _;
64436478 }
64446479 );
@@ -6458,13 +6493,57 @@ struct
64586493 (GenericT { bound = t; reason = r; id; name; no_infer })
64596494 d
64606495 tout
6496+ | ( GenericT
6497+ {
6498+ bound =
6499+ OpaqueT
6500+ ( _,
6501+ {
6502+ opaque_id = Opaque. UserDefinedOpaqueTypeId _;
6503+ underlying_t =
6504+ Opaque. FullyTransparentForCustomError { t; custom_error_loc = _ };
6505+ _;
6506+ }
6507+ );
6508+ reason = r;
6509+ id;
6510+ name;
6511+ no_infer;
6512+ },
6513+ _
6514+ ) ->
6515+ eval_destructor
6516+ cx
6517+ ~trace
6518+ use_op
6519+ reason
6520+ (GenericT { bound = t; reason = r; id; name; no_infer })
6521+ d
6522+ tout
64616523 | (OpaqueT (r , opaquetype ), ReactDRO _ ) -> destruct_and_preserve_opaque_t r opaquetype
64626524 | ( OpaqueT
6463- (_, { opaque_id = Opaque. UserDefinedOpaqueTypeId (id, _); underlying_t = Some t; _ }),
6525+ ( _,
6526+ {
6527+ opaque_id = Opaque. UserDefinedOpaqueTypeId (id, _);
6528+ underlying_t = Opaque. NormalUnderlying { t };
6529+ _;
6530+ }
6531+ ),
64646532 _
64656533 )
64666534 when ALoc. source (id :> ALoc.t ) = Some (Context. file cx) ->
64676535 eval_destructor cx ~trace use_op reason t d tout
6536+ | ( OpaqueT
6537+ ( _,
6538+ {
6539+ opaque_id = Opaque. UserDefinedOpaqueTypeId _;
6540+ underlying_t = Opaque. FullyTransparentForCustomError { t; custom_error_loc = _ };
6541+ _;
6542+ }
6543+ ),
6544+ _
6545+ ) ->
6546+ eval_destructor cx ~trace use_op reason t d tout
64686547 (* Specialize TypeAppTs before evaluating them so that we can handle special
64696548 cases. Like the union case below. mk_typeapp_instance will return an AnnotT
64706549 which will be fully resolved using the AnnotT case above. *)
@@ -6836,7 +6915,7 @@ struct
68366915 ( reason,
68376916 {
68386917 opaque_id = Opaque. StuckEval stuck_eval_kind;
6839- underlying_t = None ;
6918+ underlying_t = Opaque. FullyOpaque ;
68406919 lower_t = None ;
68416920 upper_t;
68426921 opaque_type_args;
@@ -9195,11 +9274,27 @@ struct
91959274 UnionT (r, rep)
91969275 | OpaqueT (r , opaquetype ) ->
91979276 let r = mod_reason r in
9277+ let underlying_t =
9278+ match opaquetype.underlying_t with
9279+ | Opaque. FullyOpaque -> opaquetype.underlying_t
9280+ | Opaque. NormalUnderlying { t } ->
9281+ let t' = recurse seen t in
9282+ if t == t' then
9283+ opaquetype.underlying_t
9284+ else
9285+ Opaque. NormalUnderlying { t = t' }
9286+ | Opaque. FullyTransparentForCustomError { t; custom_error_loc } ->
9287+ let t' = recurse seen t in
9288+ if t == t' then
9289+ opaquetype.underlying_t
9290+ else
9291+ Opaque. FullyTransparentForCustomError { t = t'; custom_error_loc }
9292+ in
91989293 OpaqueT
91999294 ( r,
92009295 {
92019296 opaquetype with
9202- underlying_t = OptionUtils. ident_map (recurse seen) opaquetype.underlying_t ;
9297+ underlying_t;
92039298 lower_t = OptionUtils. ident_map (recurse seen) opaquetype.lower_t;
92049299 upper_t = OptionUtils. ident_map (recurse seen) opaquetype.upper_t;
92059300 }
0 commit comments