@@ -5319,7 +5319,7 @@ struct
5319
5319
(* ********)
5320
5320
(* enums *)
5321
5321
(* ********)
5322
- | ( DefT (enum_reason, EnumObjectT enum_info),
5322
+ | ( DefT (enum_reason, EnumObjectT { enum_value_t; enum_info = ConcreteEnum enum_info } ),
5323
5323
GetPropT
5324
5324
{
5325
5325
use_op;
@@ -5332,7 +5332,6 @@ struct
5332
5332
}
5333
5333
) ->
5334
5334
let access = (use_op, access_reason, None , (prop_reason, member_name)) in
5335
- let enum_value_t = mk_enum_type enum_reason enum_info in
5336
5335
GetPropTKit. on_EnumObjectT
5337
5336
cx
5338
5337
trace
@@ -5359,13 +5358,17 @@ struct
5359
5358
hint;
5360
5359
}
5361
5360
)
5362
- | ( DefT (enum_reason , EnumObjectT enum_info),
5361
+ | ( DefT (_ , EnumObjectT { enum_value_t; enum_info } ),
5363
5362
MethodT (use_op, call_reason, lookup_reason, (Named _ as propref), action)
5364
5363
) ->
5365
5364
let t =
5366
5365
Tvar. mk_no_wrap_where cx lookup_reason (fun tout ->
5367
- let enum_value_t = mk_enum_type enum_reason enum_info in
5368
- let { representation_t; _ } = enum_info in
5366
+ let representation_t =
5367
+ match enum_info with
5368
+ | ConcreteEnum { representation_t; _ }
5369
+ | AbstractEnum { representation_t } ->
5370
+ representation_t
5371
+ in
5369
5372
rec_flow
5370
5373
cx
5371
5374
trace
@@ -5560,6 +5563,25 @@ struct
5560
5563
continue cx trace (GenericT { reason; id; name; bound = l; no_infer }) cont
5561
5564
| (GenericT { reason; bound; _ } , _ ) ->
5562
5565
rec_flow cx trace (reposition_reason cx reason bound, u)
5566
+ (* ***********)
5567
+ (* GetEnumT *)
5568
+ (* ***********)
5569
+ | ( DefT (enum_reason, EnumValueT enum_info),
5570
+ GetEnumT { use_op; orig_t; kind = `GetEnumObject ; tout; _ }
5571
+ ) ->
5572
+ let enum_value_t = Base.Option. value ~default: l orig_t in
5573
+ rec_flow
5574
+ cx
5575
+ trace
5576
+ (DefT (enum_reason, EnumObjectT { enum_value_t; enum_info }), UseT (use_op, tout))
5577
+ | (_ , GetEnumT { use_op; kind = `GetEnumObject ; tout; _ } ) ->
5578
+ rec_flow cx trace (l, UseT (use_op, tout))
5579
+ | ( DefT (_, EnumObjectT { enum_value_t; _ }),
5580
+ GetEnumT { use_op; kind = `GetEnumValue ; tout; _ }
5581
+ ) ->
5582
+ rec_flow cx trace (enum_value_t, UseT (use_op, tout))
5583
+ | (_ , GetEnumT { use_op; kind = `GetEnumValue ; tout; _ } ) ->
5584
+ rec_flow cx trace (l, UseT (use_op, tout))
5563
5585
(* *********************************)
5564
5586
(* Flow Enums exhaustive checking *)
5565
5587
(* *********************************)
@@ -5586,6 +5608,8 @@ struct
5586
5608
~default_case
5587
5609
~incomplete_out
5588
5610
~discriminant_after_check
5611
+ | (DefT (enum_reason , EnumValueT (AbstractEnum _ )), EnumExhaustiveCheckT { reason; _ } ) ->
5612
+ add_output cx (Error_message. EEnumInvalidAbstractUse { reason; enum_reason })
5589
5613
(* Resolving the case tests. *)
5590
5614
| ( _,
5591
5615
EnumExhaustiveCheckT
@@ -5607,7 +5631,7 @@ struct
5607
5631
let { enum_id = enum_id_discriminant; members; _ } = discriminant_enum in
5608
5632
let checks =
5609
5633
match l with
5610
- | DefT (_, EnumObjectT { enum_id = enum_id_check; _ })
5634
+ | DefT (_, EnumObjectT { enum_info = ConcreteEnum { enum_id = enum_id_check; _ } ; _ })
5611
5635
when ALoc. equal_id enum_id_discriminant enum_id_check && SMap. mem member_name members
5612
5636
->
5613
5637
check :: checks
@@ -5626,7 +5650,7 @@ struct
5626
5650
~default_case
5627
5651
~incomplete_out
5628
5652
~discriminant_after_check
5629
- | ( DefT (enum_reason, EnumValueT ( ConcreteEnum { members; _ }) ),
5653
+ | ( DefT (enum_reason, EnumValueT enum_info ),
5630
5654
EnumExhaustiveCheckT
5631
5655
{
5632
5656
reason;
@@ -5635,7 +5659,11 @@ struct
5635
5659
discriminant_after_check = _;
5636
5660
}
5637
5661
) ->
5638
- let example_member = SMap. choose_opt members |> Base.Option. map ~f: fst in
5662
+ let example_member =
5663
+ match enum_info with
5664
+ | ConcreteEnum { members; _ } -> SMap. choose_opt members |> Base.Option. map ~f: fst
5665
+ | AbstractEnum _ -> None
5666
+ in
5639
5667
List. iter
5640
5668
(fun reason ->
5641
5669
add_output cx (Error_message. EEnumInvalidCheck { reason; enum_reason; example_member }))
@@ -6812,6 +6840,7 @@ struct
6812
6840
| AssertExportIsTypeT _
6813
6841
| ImplicitVoidReturnT _
6814
6842
| GetElemT _
6843
+ | GetEnumT _
6815
6844
| GetKeysT _
6816
6845
| GetPrivatePropT _
6817
6846
| GetPropT _
@@ -7883,6 +7912,8 @@ struct
7883
7912
OpenT tout
7884
7913
)
7885
7914
)
7915
+ | EnumType ->
7916
+ GetEnumT { use_op; reason; orig_t = Some t; kind = `GetEnumObject ; tout = OpenT tout }
7886
7917
))
7887
7918
7888
7919
and eagerly_eval_destructor_if_resolved cx ~trace use_op reason t d tvar =
0 commit comments