Skip to content

Commit 03056b0

Browse files
pradeep90facebook-github-bot
authored andcommitted
Replace local tuple variadics.
Summary: We are yet to support `Callable` or `Union`. Reviewed By: grievejia Differential Revision: D26520885 fbshipit-source-id: 29c1ed0895a0e2e399900d930a6e7fc48546c321
1 parent 77681fc commit 03056b0

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

source/analysis/test/typeTest.ml

+50
Original file line numberDiff line numberDiff line change
@@ -1691,6 +1691,9 @@ let test_convert_all_escaped_free_variables_to_anys _ =
16911691
let test_replace_all _ =
16921692
let free_variable = Type.Variable (Type.Variable.Unary.create "T") in
16931693
let annotation = Type.parametric "p" ![free_variable; Type.integer] in
1694+
let assert_equal actual expected =
1695+
assert_equal ~cmp:Type.equal ~printer:Type.show expected actual
1696+
in
16941697
assert_equal
16951698
(Type.Variable.GlobalTransforms.Unary.replace_all (fun _ -> Some Type.integer) annotation)
16961699
(Type.parametric "p" ![Type.integer; Type.integer]);
@@ -1727,6 +1730,53 @@ let test_replace_all _ =
17271730
CallableParameters
17281731
(Defined [Named { name = "p"; annotation = Type.integer; default = false }]);
17291732
]);
1733+
1734+
(* Variadic tuples. *)
1735+
let variadic = Type.Variable.Variadic.Tuple.create "Ts" in
1736+
let variadic2 = Type.Variable.Variadic.Tuple.create "Ts2" in
1737+
let assert_replaced ~replace annotation expected =
1738+
let aliases ?replace_unbound_parameters_with_any:_ = function
1739+
| "Ts" -> Some (Type.VariableAlias (Type.Variable.TupleVariadic variadic))
1740+
| "Ts2" -> Some (Type.VariableAlias (Type.Variable.TupleVariadic variadic2))
1741+
| _ -> None
1742+
in
1743+
assert_equal
1744+
(Type.Variable.GlobalTransforms.TupleVariadic.replace_all
1745+
replace
1746+
(Type.create ~aliases (parse_single_expression ~preprocess:true annotation)))
1747+
(Type.create ~aliases (parse_single_expression ~preprocess:true expected))
1748+
in
1749+
let replace_with_concrete given =
1750+
Option.some_if
1751+
(Type.Variable.Variadic.Tuple.equal given variadic)
1752+
(Type.OrderedTypes.Concrete [Type.bool; Type.bool])
1753+
in
1754+
let replace_with_concatenation _ =
1755+
Some
1756+
(Type.OrderedTypes.Concatenation
1757+
(Type.OrderedTypes.Concatenation.create ~prefix:[Type.bool] ~suffix:[Type.bool] variadic))
1758+
in
1759+
assert_replaced
1760+
~replace:replace_with_concrete
1761+
"Foo[int, pyre_extensions.Unpack[Ts], str]"
1762+
"Foo[int, bool, bool, str]";
1763+
assert_replaced
1764+
~replace:replace_with_concatenation
1765+
"Foo[int, pyre_extensions.Unpack[Ts], str]"
1766+
"Foo[int, bool, pyre_extensions.Unpack[Ts], bool, str]";
1767+
assert_replaced
1768+
~replace:replace_with_concrete
1769+
"Foo[Bar[int, pyre_extensions.Unpack[Ts], str], Bar[int, pyre_extensions.Unpack[Ts2], str]]"
1770+
"Foo[Bar[int, bool, bool, str], Bar[int, pyre_extensions.Unpack[Ts2], str]]";
1771+
assert_replaced ~replace:replace_with_concrete "typing.Tuple[int, str]" "typing.Tuple[int, str]";
1772+
assert_replaced
1773+
~replace:replace_with_concrete
1774+
"typing.Tuple[int, pyre_extensions.Unpack[Ts], str]"
1775+
"typing.Tuple[int, bool, bool, str]";
1776+
assert_replaced
1777+
~replace:replace_with_concatenation
1778+
"typing.Tuple[int, pyre_extensions.Unpack[Ts], str]"
1779+
"typing.Tuple[int, bool, pyre_extensions.Unpack[Ts], bool, str]";
17301780
()
17311781
17321782

source/analysis/type.ml

+26-2
Original file line numberDiff line numberDiff line change
@@ -3757,8 +3757,32 @@ end = struct
37573757
| _ -> []
37583758

37593759

3760-
(* TODO(T84854853): Implement. *)
3761-
let local_replace _ annotation = Some annotation
3760+
let local_replace replacement = function
3761+
| Parametric ({ parameters; _ } as parametric) ->
3762+
let replace parameter =
3763+
let replaced =
3764+
match parameter with
3765+
| Parameter.Unpacked (Variadic variadic) ->
3766+
replacement variadic >>| OrderedTypes.to_parameters
3767+
| _ -> None
3768+
in
3769+
Option.value ~default:[parameter] replaced
3770+
in
3771+
Parametric { parametric with parameters = List.concat_map parameters ~f:replace }
3772+
|> Option.some
3773+
| Tuple (Bounded (Concatenation { prefix; middle = Variadic variadic; suffix })) ->
3774+
let expand_ordered_type_within_concatenation = function
3775+
| OrderedTypes.Concrete annotations ->
3776+
OrderedTypes.Concrete (prefix @ annotations @ suffix)
3777+
| Concatenation { prefix = new_prefix; middle; suffix = new_suffix } ->
3778+
Concatenation
3779+
{ prefix = prefix @ new_prefix; middle; suffix = new_suffix @ suffix }
3780+
in
3781+
replacement variadic
3782+
>>| expand_ordered_type_within_concatenation
3783+
>>| fun ordered_type -> Tuple (Bounded ordered_type)
3784+
| _ -> None
3785+
37623786

37633787
let dequalify ({ name; _ } as variable) ~dequalify_map =
37643788
{ variable with name = dequalify_identifier dequalify_map name }

0 commit comments

Comments
 (0)