Skip to content

Commit

Permalink
Use dedicated error; fix Parameters location
Browse files Browse the repository at this point in the history
  • Loading branch information
ilevkivskyi committed Aug 25, 2023
1 parent bfd5488 commit c874edd
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
26 changes: 22 additions & 4 deletions mypy/typeanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -465,9 +465,23 @@ def pack_paramspec_args(self, an_args: Sequence[Type]) -> list[Type]:
# I didn't find this in the PEP, but it sounds reasonable.
return list(an_args)
if any(isinstance(a, (Parameters, ParamSpecType)) for a in an_args):
# Nested parameter specifications are not allowed.
if len(an_args) > 1:
first_wrong = next(
arg for arg in an_args if isinstance(arg, (Parameters, ParamSpecType))
)
self.fail(
"Nested parameter specifications are not allowed",
first_wrong,
code=codes.VALID_TYPE,
)
return [AnyType(TypeOfAny.from_error)]
return list(an_args)
return [Parameters(an_args, [ARG_POS] * count, [None] * count)]
first = an_args[0]
return [
Parameters(
an_args, [ARG_POS] * count, [None] * count, line=first.line, column=first.column
)
]

def cannot_resolve_type(self, t: UnboundType) -> None:
# TODO: Move error message generation to messages.py. We'd first
Expand Down Expand Up @@ -508,7 +522,11 @@ def apply_concatenate_operator(self, t: UnboundType) -> Type:
names: list[str | None] = [None] * len(args)

pre = Parameters(
args + pre.arg_types, [ARG_POS] * len(args) + pre.arg_kinds, names + pre.arg_names
args + pre.arg_types,
[ARG_POS] * len(args) + pre.arg_kinds,
names + pre.arg_names,
line=t.line,
column=t.column,
)
return ps.copy_modified(prefix=pre) if isinstance(ps, ParamSpecType) else pre

Expand Down Expand Up @@ -918,7 +936,7 @@ def visit_type_list(self, t: TypeList) -> Type:
if params:
ts, kinds, names = params
# bind these types
return Parameters(self.anal_array(ts), kinds, names)
return Parameters(self.anal_array(ts), kinds, names, line=t.line, column=t.column)
else:
return AnyType(TypeOfAny.from_error)
else:
Expand Down
10 changes: 10 additions & 0 deletions test-data/unit/check-parameter-specification.test
Original file line number Diff line number Diff line change
Expand Up @@ -1754,3 +1754,13 @@ def dec(fn: Callable[P, T]) -> Alias[P, T]: ... # type: ignore
f: Any
dec(f) # No crash
[builtins fixtures/paramspec.pyi]

[case testParamSpecErrorNestedParams]
from typing import Generic
from typing_extensions import ParamSpec

P = ParamSpec("P")
class C(Generic[P]): ...
c: C[int, [int, str], str] # E: Nested parameter specifications are not allowed
reveal_type(c) # N: Revealed type is "__main__.C[Any]"
[builtins fixtures/paramspec.pyi]

0 comments on commit c874edd

Please sign in to comment.