Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Broadcast on variadics #338

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions analysis/analysisError.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1228,8 +1228,10 @@ let rec messages ~concise ~signature location kind =
in
let actual =
match actual with
| Group actual ->
Format.asprintf "type parameter group `[%a]`" Type.OrderedTypes.pp_concise actual
| VariadicExpression (Group actual) ->
Format.asprintf "type parameter group `[%a]`" Type.OrderedTypes.pp_concise_record actual
| VariadicExpression expression ->
Format.asprintf "type parameter group `%a`" Type.OrderedTypes.pp_concise expression
| Single actual -> Format.asprintf "single type `%a`" Type.pp actual
| CallableParameters actual ->
Format.asprintf "callable parameters `%a`" Type.Callable.pp_parameters actual
Expand Down
23 changes: 13 additions & 10 deletions analysis/attributeResolution.ml
Original file line number Diff line number Diff line change
Expand Up @@ -887,22 +887,22 @@ class base class_metadata_environment dependency =
else
Type.Parameter.Single given, None
| Unary _, CallableParameters _
| Unary _, Type.Parameter.Group _ ->
| Unary _, Type.Parameter.VariadicExpression (Group _) ->
( Single Any,
Some
{ name; kind = UnexpectedKind { expected = generic; actual = given } } )
| ListVariadic _, CallableParameters _
| ListVariadic _, Single _ ->
( Group Any,
( VariadicExpression (Group Any),
Some
{ name; kind = UnexpectedKind { expected = generic; actual = given } } )
| ParameterVariadic _, Single _
| ParameterVariadic _, Group _ ->
| ParameterVariadic _, VariadicExpression (Group _) ->
( CallableParameters Undefined,
Some
{ name; kind = UnexpectedKind { expected = generic; actual = given } } )
| ParameterVariadic _, CallableParameters _
| ListVariadic _, Group _ ->
| _, VariadicExpression _ ->
(* TODO(T47346673): accept w/ new kind of validation *)
given, None
in
Expand All @@ -920,7 +920,7 @@ class base class_metadata_environment dependency =
name
(List.map generics ~f:(function
| Type.Variable.Unary _ -> Type.Parameter.Single Type.Any
| ListVariadic _ -> Group Any
| ListVariadic _ -> VariadicExpression (Group Any)
| ParameterVariadic _ -> CallableParameters Undefined)),
false )
in
Expand Down Expand Up @@ -1740,6 +1740,7 @@ class base class_metadata_environment dependency =
match generics with
| [ListVariadic variable] ->
let meta_generics =
let variable = Type.OrderedTypes.Concatenation.Middle.Variadic variable in
Type.OrderedTypes.Concatenation.Middle.create ~variable ~mappers:["type"]
|> Type.OrderedTypes.Concatenation.create
in
Expand All @@ -1764,7 +1765,7 @@ class base class_metadata_environment dependency =
(* TODO:(T60536033) We'd really like to take FiniteList[Ts], but
without that we can't actually return the correct metatype, which
is a bummer *)
Type.Parameter.Group Any, Type.Any
Type.Parameter.VariadicExpression (Group Any), Type.Any
| ParameterVariadic _ ->
(* TODO:(T60536033) We'd really like to take FiniteList[Ts], but
without that we can't actually return the correct metatype, which
Expand Down Expand Up @@ -3155,10 +3156,12 @@ class base class_metadata_environment dependency =
match kind with
| SingleStar -> (
match resolved with
| Type.Tuple (Bounded ordered_types) -> Either.First ordered_types
| Type.Tuple (Bounded ordered_types) ->
Either.First (Type.OrderedTypes.Group ordered_types)
(* We don't support expanding indefinite containers into ListVariadics *)
| annotation -> Either.Second { expression; annotation } )
| _ -> Either.First (Type.OrderedTypes.Concrete [resolved])
| _ ->
Either.First (Type.OrderedTypes.Group (Type.OrderedTypes.Concrete [resolved]))
in
List.rev arguments |> List.partition_map ~f:extract
in
Expand All @@ -3172,7 +3175,7 @@ class base class_metadata_environment dependency =
let concatenate extracted =
let concatenated =
match extracted with
| [] -> Some (Type.OrderedTypes.Concrete [])
| [] -> Some (Type.OrderedTypes.Group (Type.OrderedTypes.Concrete []))
| head :: tail ->
let concatenate sofar next =
sofar >>= fun left -> Type.OrderedTypes.concatenate ~left ~right:next
Expand Down Expand Up @@ -3212,7 +3215,7 @@ class base class_metadata_environment dependency =
match key, data with
| Parameter.Variable (Concatenation concatenation), arguments ->
bind_arguments_to_variadic
~expected:(Type.OrderedTypes.Concatenation concatenation)
~expected:(Type.OrderedTypes.Group (Type.OrderedTypes.Concatenation concatenation))
~arguments
| Parameter.Variable _, []
| Parameter.Keywords _, [] ->
Expand Down
51 changes: 30 additions & 21 deletions analysis/classHierarchy.ml
Original file line number Diff line number Diff line change
Expand Up @@ -174,17 +174,17 @@ let immediate_parents (module Handler : Handler) class_name =


let clean not_clean =
let open Type.OrderedTypes.Concatenation in
List.map not_clean ~f:(function
| Type.Parameter.Single (Type.Variable variable) -> Some (Type.Variable.Unary variable)
| Group (Type.OrderedTypes.Concatenation concatenation) ->
unwrap_if_only_middle concatenation
>>= Middle.unwrap_if_bare
>>| fun variable -> Type.Variable.ListVariadic variable
| Type.Parameter.Single (Type.Variable variable) -> [Type.Variable.Unary variable]
| VariadicExpression expression ->
Type.Variable.GlobalTransforms.ListVariadic.collect_all
(Type.Parametric { name = ""; parameters = [VariadicExpression expression] })
|> List.map ~f:(fun variable -> Type.Variable.ListVariadic variable)
| CallableParameters (ParameterVariadicTypeVariable { head = []; variable }) ->
Some (ParameterVariadic variable)
| _ -> None)
|> Option.all
[ParameterVariadic variable]
| _ -> [])
|> List.concat
|> Option.some


let variables ?(default = None) (module Handler : Handler) = function
Expand Down Expand Up @@ -303,7 +303,7 @@ let instantiate_successors_parameters ((module Handler : Handler) as handler) ~s
| Type.Bottom ->
let to_any = function
| Type.Variable.Unary _ -> Type.Parameter.Single Type.Any
| ListVariadic _ -> Group Any
| ListVariadic _ -> VariadicExpression (Group Any)
| ParameterVariadic _ -> CallableParameters Undefined
in
index_of target
Expand All @@ -315,12 +315,13 @@ let instantiate_successors_parameters ((module Handler : Handler) as handler) ~s
let split =
match Type.split source with
| Primitive primitive, _ when not (contains handler primitive) -> None
| Primitive "tuple", [Type.Parameter.Group parameters] ->
| Primitive "tuple", [Type.Parameter.VariadicExpression (Group parameters)] ->
Some
( "tuple",
[
Type.Parameter.Single
(Type.weaken_literals (Type.OrderedTypes.union_upper_bound parameters));
(Type.weaken_literals
(Type.OrderedTypes.union_upper_bound (Type.OrderedTypes.Group parameters)));
] )
| Primitive "tuple", [Type.Parameter.Single parameter] ->
Some ("tuple", [Type.Parameter.Single (Type.weaken_literals parameter)])
Expand Down Expand Up @@ -351,24 +352,25 @@ let instantiate_successors_parameters ((module Handler : Handler) as handler) ~s
| Type.Parameter.Single parameter, Type.Variable.Unary variable ->
Type.Variable.UnaryPair (variable, parameter)
| CallableParameters _, Unary variable
| Group _, Unary variable ->
| VariadicExpression _, Unary variable ->
Type.Variable.UnaryPair (variable, Type.Any)
| Group parameter, ListVariadic variable ->
Type.Variable.ListVariadicPair (variable, parameter)
| VariadicExpression variadic_expression, ListVariadic variable ->
Type.Variable.ListVariadicPair (variable, variadic_expression)
| CallableParameters _, ListVariadic variable
| Single _, ListVariadic variable ->
Type.Variable.ListVariadicPair (variable, Any)
Type.Variable.ListVariadicPair (variable, Type.OrderedTypes.Group Any)
| CallableParameters parameters, ParameterVariadic variable ->
Type.Variable.ParameterVariadicPair (variable, parameters)
| Single _, ParameterVariadic variable
| Group _, ParameterVariadic variable ->
| VariadicExpression _, ParameterVariadic variable ->
Type.Variable.ParameterVariadicPair (variable, Undefined)
in
let replacement =
let to_any = function
| Type.Variable.Unary variable -> Type.Variable.UnaryPair (variable, Type.Any)
| ListVariadic variable ->
Type.Variable.ListVariadicPair (variable, Type.OrderedTypes.Any)
Type.Variable.ListVariadicPair
(variable, Type.OrderedTypes.Group Type.OrderedTypes.Any)
| ParameterVariadic variable ->
Type.Variable.ParameterVariadicPair (variable, Undefined)
in
Expand All @@ -385,9 +387,16 @@ let instantiate_successors_parameters ((module Handler : Handler) as handler) ~s
| Type.Parameter.Single single ->
Type.Parameter.Single
(TypeConstraints.Solution.instantiate replacement single)
| Group group ->
Group
(TypeConstraints.Solution.instantiate_ordered_types replacement group)
| VariadicExpression expression ->
let instantiated_expression =
Type.OrderedTypes.transform_variadic_expression
expression
~f:(fun group ->
TypeConstraints.Solution.instantiate_ordered_types
replacement
(Type.OrderedTypes.Group group))
in
VariadicExpression instantiated_expression
| CallableParameters parameters ->
CallableParameters
(TypeConstraints.Solution.instantiate_callable_parameters
Expand Down
Loading