Skip to content

Commit d912f13

Browse files
authored
[ty] Do not bind self to non-positional parameters (#20850)
## Summary closes astral-sh/ty#1333 ## Test Plan Regression test
1 parent 71f8389 commit d912f13

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

crates/ty_python_semantic/resources/mdtest/annotations/self.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,4 +473,18 @@ class C:
473473
reveal_type(generic_context(C.f)) # revealed: None
474474
```
475475

476+
## Non-positional first parameters
477+
478+
This makes sure that we don't bind `self` if it's not a positional parameter:
479+
480+
```py
481+
from ty_extensions import CallableTypeOf
482+
483+
class C:
484+
def method(*args, **kwargs) -> None: ...
485+
486+
def _(c: CallableTypeOf[C().method]):
487+
reveal_type(c) # revealed: (...) -> None
488+
```
489+
476490
[self attribute]: https://typing.python.org/en/latest/spec/generics.html#use-in-attribute-annotations

crates/ty_python_semantic/src/types/signatures.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,15 @@ impl<'db> Signature<'db> {
579579
}
580580

581581
pub(crate) fn bind_self(&self, db: &'db dyn Db, self_type: Option<Type<'db>>) -> Self {
582-
let mut parameters = Parameters::new(self.parameters().iter().skip(1).cloned());
582+
let mut parameters = self.parameters.iter().cloned().peekable();
583+
584+
// TODO: Theoretically, for a signature like `f(*args: *tuple[MyClass, int, *tuple[str, ...]])` with
585+
// a variadic first parameter, we should also "skip the first parameter" by modifying the tuple type.
586+
if parameters.peek().is_some_and(Parameter::is_positional) {
587+
parameters.next();
588+
}
589+
590+
let mut parameters = Parameters::new(parameters);
583591
let mut return_ty = self.return_ty;
584592
if let Some(self_type) = self_type {
585593
parameters = parameters.apply_type_mapping_impl(

0 commit comments

Comments
 (0)