-
Notifications
You must be signed in to change notification settings - Fork 2.2k
[red-knot] Class literal __new__ function callable subtyping
#17533
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
Changes from 2 commits
ba52d1d
3c17670
e4bf1f7
519dacb
24e63fa
f5c0a8e
1fc7bf0
a3ab945
c3dd673
0745192
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -1152,6 +1152,21 @@ impl<'db> Type<'db> { | |||||||
| let new_function = new_function.into_callable_type(db); | ||||||||
| return new_function.is_subtype_of(db, target); | ||||||||
| } | ||||||||
|
|
||||||||
| let new_function_symbol = self | ||||||||
| .member_lookup_with_policy( | ||||||||
| db, | ||||||||
| "__new__".into(), | ||||||||
| MemberLookupPolicy::MRO_NO_OBJECT_FALLBACK | ||||||||
| | MemberLookupPolicy::META_CLASS_NO_TYPE_FALLBACK, | ||||||||
| ) | ||||||||
| .symbol; | ||||||||
|
|
||||||||
| if let Symbol::Type(Type::FunctionLiteral(new_function), _) = new_function_symbol { | ||||||||
| let new_function = new_function.into_bound_method_type(db, self); | ||||||||
| return new_function.is_subtype_of(db, target); | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit:
Suggested change
|
||||||||
| } | ||||||||
|
|
||||||||
|
MatthewMckee4 marked this conversation as resolved.
Outdated
|
||||||||
| false | ||||||||
| } | ||||||||
|
|
||||||||
|
|
@@ -5904,6 +5919,15 @@ impl<'db> FunctionType<'db> { | |||||||
| )) | ||||||||
| } | ||||||||
|
|
||||||||
| /// Convert the `FunctionType` into a [`Type::BoundMethod`]. | ||||||||
| pub(crate) fn into_bound_method_type( | ||||||||
|
MatthewMckee4 marked this conversation as resolved.
|
||||||||
| self, | ||||||||
| db: &'db dyn Db, | ||||||||
| self_instance: Type<'db>, | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The parameter name is a bit misleading because in this PR above where this is being called it's not an instance of the class but the class itself. This is also the case for the field name on Regardless, this shouldn't block this PR and something that could be done in a follow-up instead. |
||||||||
| ) -> Type<'db> { | ||||||||
| Type::BoundMethod(BoundMethodType::new(db, self, self_instance)) | ||||||||
| } | ||||||||
|
|
||||||||
| /// Returns the [`FileRange`] of the function's name. | ||||||||
| pub fn focus_range(self, db: &dyn Db) -> FileRange { | ||||||||
| FileRange::new( | ||||||||
|
|
||||||||
Uh oh!
There was an error while loading. Please reload this page.