simplify Typing_union
commit5ad91a491e7464890541b9560765bed613802d20
authorCatherine Gasnier <catg@fb.com>
Fri, 13 Sep 2019 10:00:37 +0000 (13 03:00 -0700)
committerHhvm Bot <hhvm-bot@users.noreply.github.com>
Fri, 13 Sep 2019 10:03:00 +0000 (13 03:03 -0700)
tree0f4bcc076b5f17169700fd1af3e699f666db3a23
parent0ad75ecaaaa31808ddc60c06e89a3038f49d793e
simplify Typing_union

Summary:
There is some redundancy in the treatment of null, options, unions and intersections in Typing_union, which appear both in `union_` and `union_lists`. This diff makes `union` call directly into `union_list` so as to get rid of the cases in `union_` dealing with null, options, unions, intersections.

We however then need to simplify away nonnull when the result is nullable, which is done in `make_union`. See doc comments for more details.

We also get rid of exception `Not_equiv` to replace it with returning an option.

Reviewed By: andrewjkennedy

Differential Revision: D17208027

fbshipit-source-id: aeda3c753d7e74bc67575b75105d7b31a6319453
100 files changed:
hphp/hack/src/typing/typing_union.ml
hphp/hack/test/typecheck/argument_unpacking/unpack_call11.php.like_types.exp
hphp/hack/test/typecheck/arithmetic_any.php.like_types.exp
hphp/hack/test/typecheck/array/array_as_tuple_bad.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/array/safe_vector_array/disallow_darray_with_non_arraykey_keys.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/array/tuple_as_array_bad.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/array_append_map_element.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/array_filter_explicitly_typed.php.like_types.exp
hphp/hack/test/typecheck/array_map2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/array_map3.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/array_map4.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/as_expression/vec3.php.like_types.exp
hphp/hack/test/typecheck/assign_map_element.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/await_in_expressions8.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/coalesce_bug.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/constraints/bad_contra_constraint_2.php.like_types.exp
hphp/hack/test/typecheck/constraints/contravariance_constraint_bad_2.php.like_types.exp
hphp/hack/test/typecheck/constraints/recursive_constraint_bad_4.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/constraints/recursive_constraint_bad_5.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/covariant_this_type.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/double_nullable.php.like_types.exp
hphp/hack/test/typecheck/double_nullable2.php.like_types.exp
hphp/hack/test/typecheck/dynamic/coercion/append.php.exp
hphp/hack/test/typecheck/dynamic/coercion/awaitable_non_async.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/dynamic/mixed_isnt_dynamic/in_vec.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/enum_stringish_bad_1.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/enum_stringish_bad_2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/erling_loop5.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/generic_this_chain.php.like_types.exp
hphp/hack/test/typecheck/generics_restrictions/contravariance_inout_2.php.like_types.exp
hphp/hack/test/typecheck/inout/inout_hint1.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/inout/inout_hint2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/key_exists_refines_union_bad.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/lambda/lambda15.php.like_types.exp
hphp/hack/test/typecheck/lambda/lambda_reduce.php.like_types.exp
hphp/hack/test/typecheck/lambda/new_map_lambda.php.like_types.exp
hphp/hack/test/typecheck/lambda/sort_by.php.like_types.exp
hphp/hack/test/typecheck/lambda/variadics/lambda_unpacked_parameters.php.like_types.exp
hphp/hack/test/typecheck/like_types/dynamic_coercion/like_not_subtype.php.exp
hphp/hack/test/typecheck/like_types/dynamic_coercion/t_as_like.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/like_types/pessimization/t_as_like.php.like_types.exp
hphp/hack/test/typecheck/list_array2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/list_varray.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/array_filter_then_invoke.php.like_types.exp
hphp/hack/test/typecheck/new_inference/disjunctions/newtype_sub_nullable_tvar.php.like_types.exp
hphp/hack/test/typecheck/new_inference/eager_solve/array_append_bad.php.like_types.exp
hphp/hack/test/typecheck/new_inference/eager_solve/nullable_predicate_lambda.php.like_types.exp
hphp/hack/test/typecheck/new_inference/eager_solve/shapes_toarray.php.like_types.exp
hphp/hack/test/typecheck/new_inference/eager_solve/varargs.php.like_types.exp
hphp/hack/test/typecheck/new_inference/empty_map_update.php.like_types.exp
hphp/hack/test/typecheck/new_inference/idx_bug.php.like_types.exp
hphp/hack/test/typecheck/new_inference/inout_invariant.php.like_types.exp
hphp/hack/test/typecheck/new_inference/instance_of_refinement.php.like_types.exp
hphp/hack/test/typecheck/new_inference/tconst/generic_tc_invalid1.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/tconst/tconst_on_generics4.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/tconst/tconst_on_generics7.php.like_types.exp
hphp/hack/test/typecheck/new_inference/tparam_constraints2.php.like_types.exp
hphp/hack/test/typecheck/new_inference/transitive_error.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/transitive_error2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/transitive_error_4.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/transitive_simplify_2bis.php.like_types.exp
hphp/hack/test/typecheck/new_inference/typehole/merge_tvars2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/typehole/t30337175.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/new_inference/untypeable/closure.php.like_types.exp
hphp/hack/test/typecheck/new_inference/variance_transfer.php.like_types.exp
hphp/hack/test/typecheck/newtype1.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/nonnull/fully_opaque_newtype.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/nonnull/newtype_constrained_by_nullable_type.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/nonnull/unconstrained_abstract_type_constant.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/nonnull/unconstrained_generic_type_parameter.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/not_an_array.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/shape/key_exists_refines_bad1.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/shape_key_exists6.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/shape_unification_disallows_providing_optional_field_where_required_field_is_consumed.php.like_types.exp
hphp/hack/test/typecheck/shape_unification_disallows_providing_required_field_where_optional_field_is_consumed.php.like_types.exp
hphp/hack/test/typecheck/subtype_bug_1.php.like_types.exp
hphp/hack/test/typecheck/subtype_bug_2.php.like_types.exp
hphp/hack/test/typecheck/subtype_bug_3.php.like_types.exp
hphp/hack/test/typecheck/subtype_bug_4.php.like_types.exp
hphp/hack/test/typecheck/tconst/generic_tc_invalid1.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/test_array3.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/test_array4.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/this_tparam2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/typeconst_default_selected_only_in_concrete_class.php.like_types.exp
hphp/hack/test/typecheck/typing_good_xhp.php.like_types.exp
hphp/hack/test/typecheck/union/map_corner_case.php.like_types.exp
hphp/hack/test/typecheck/union/nonnull.php.like_types.exp
hphp/hack/test/typecheck/union/null_inter_nonnull.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/unresolved_container2.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/vec_not_an_array.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/xhp/generic_attr1.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/xhp/this_type_attr.php.like_types.exp
hphp/hack/test/typecheck/xhp_attr_12.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/xhp_attr_13.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/xhp_attr_22.php.like_types.exp
hphp/hack/test/typecheck/xhp_attr_24.php.like_types.exp
hphp/hack/test/typecheck/xhp_attr_4.php.like_types.exp [new file with mode: 0644]
hphp/hack/test/typecheck/xhp_attr_spread_4.php.like_types.exp
hphp/hack/test/typecheck/xhp_attr_spread_generic.php.like_types.exp
hphp/hack/test/typecheck/xhp_attr_spread_localize.php.like_types.exp