[flake8-pyi] Rename PYI019 and improve its diagnostic message (#15885)

This commit is contained in:
Alex Waygood 2025-02-03 14:23:58 +00:00 committed by GitHub
parent 83243de93d
commit 9c64d65552
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 207 additions and 222 deletions

View file

@ -23,7 +23,7 @@ pub(crate) fn bindings(checker: &mut Checker) {
Rule::UsedDummyVariable, Rule::UsedDummyVariable,
Rule::PytestUnittestRaisesAssertion, Rule::PytestUnittestRaisesAssertion,
Rule::ForLoopWrites, Rule::ForLoopWrites,
Rule::CustomTypeVarReturnType, Rule::CustomTypeVarForSelf,
]) { ]) {
return; return;
} }
@ -116,9 +116,9 @@ pub(crate) fn bindings(checker: &mut Checker) {
checker.diagnostics.push(diagnostic); checker.diagnostics.push(diagnostic);
} }
} }
if checker.enabled(Rule::CustomTypeVarReturnType) { if checker.enabled(Rule::CustomTypeVarForSelf) {
if let Some(diagnostic) = if let Some(diagnostic) =
flake8_pyi::rules::custom_type_var_return_type(checker, binding) flake8_pyi::rules::custom_type_var_instead_of_self(checker, binding)
{ {
checker.diagnostics.push(diagnostic); checker.diagnostics.push(diagnostic);
} }

View file

@ -765,7 +765,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> {
(Flake8Pyi, "016") => (RuleGroup::Stable, rules::flake8_pyi::rules::DuplicateUnionMember), (Flake8Pyi, "016") => (RuleGroup::Stable, rules::flake8_pyi::rules::DuplicateUnionMember),
(Flake8Pyi, "017") => (RuleGroup::Stable, rules::flake8_pyi::rules::ComplexAssignmentInStub), (Flake8Pyi, "017") => (RuleGroup::Stable, rules::flake8_pyi::rules::ComplexAssignmentInStub),
(Flake8Pyi, "018") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnusedPrivateTypeVar), (Flake8Pyi, "018") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnusedPrivateTypeVar),
(Flake8Pyi, "019") => (RuleGroup::Stable, rules::flake8_pyi::rules::CustomTypeVarReturnType), (Flake8Pyi, "019") => (RuleGroup::Stable, rules::flake8_pyi::rules::CustomTypeVarForSelf),
(Flake8Pyi, "020") => (RuleGroup::Stable, rules::flake8_pyi::rules::QuotedAnnotationInStub), (Flake8Pyi, "020") => (RuleGroup::Stable, rules::flake8_pyi::rules::QuotedAnnotationInStub),
(Flake8Pyi, "021") => (RuleGroup::Stable, rules::flake8_pyi::rules::DocstringInStub), (Flake8Pyi, "021") => (RuleGroup::Stable, rules::flake8_pyi::rules::DocstringInStub),
(Flake8Pyi, "024") => (RuleGroup::Stable, rules::flake8_pyi::rules::CollectionsNamedTuple), (Flake8Pyi, "024") => (RuleGroup::Stable, rules::flake8_pyi::rules::CollectionsNamedTuple),

View file

@ -136,9 +136,9 @@ mod tests {
Ok(()) Ok(())
} }
#[test_case(Rule::CustomTypeVarReturnType, Path::new("PYI019_0.py"))] #[test_case(Rule::CustomTypeVarForSelf, Path::new("PYI019_0.py"))]
#[test_case(Rule::CustomTypeVarReturnType, Path::new("PYI019_0.pyi"))] #[test_case(Rule::CustomTypeVarForSelf, Path::new("PYI019_0.pyi"))]
#[test_case(Rule::CustomTypeVarReturnType, Path::new("PYI019_1.pyi"))] #[test_case(Rule::CustomTypeVarForSelf, Path::new("PYI019_1.pyi"))]
fn custom_classmethod_rules(rule_code: Rule, path: &Path) -> Result<()> { fn custom_classmethod_rules(rule_code: Rule, path: &Path) -> Result<()> {
let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy());
let diagnostics = test_path( let diagnostics = test_path(
@ -155,8 +155,8 @@ mod tests {
Ok(()) Ok(())
} }
#[test_case(Rule::CustomTypeVarReturnType, Path::new("PYI019_0.pyi"))] #[test_case(Rule::CustomTypeVarForSelf, Path::new("PYI019_0.pyi"))]
#[test_case(Rule::CustomTypeVarReturnType, Path::new("PYI019_1.pyi"))] #[test_case(Rule::CustomTypeVarForSelf, Path::new("PYI019_1.pyi"))]
fn custom_classmethod_rules_preview(rule_code: Rule, path: &Path) -> Result<()> { fn custom_classmethod_rules_preview(rule_code: Rule, path: &Path) -> Result<()> {
let snapshot = format!( let snapshot = format!(
"preview_{}_{}", "preview_{}_{}",

View file

@ -14,8 +14,8 @@ use crate::importer::{ImportRequest, ResolutionError};
use crate::settings::types::PythonVersion; use crate::settings::types::PythonVersion;
/// ## What it does /// ## What it does
/// Checks for methods that define a custom `TypeVar` for their return type /// Checks for methods that use custom `TypeVar`s in their annotations
/// annotation instead of using `Self`. /// when they could use `Self` instead.
/// ///
/// ## Why is this bad? /// ## Why is this bad?
/// While the semantics are often identical, using `Self` is more intuitive /// While the semantics are often identical, using `Self` is more intuitive
@ -24,7 +24,8 @@ use crate::settings::types::PythonVersion;
/// on the `self` and `cls` arguments. /// on the `self` and `cls` arguments.
/// ///
/// This check currently applies to instance methods that return `self`, /// This check currently applies to instance methods that return `self`,
/// class methods that return an instance of `cls`, and `__new__` methods. /// class methods that return an instance of `cls`, class methods that return
/// `cls`, and `__new__` methods.
/// ///
/// ## Example /// ## Example
/// ///
@ -59,26 +60,31 @@ use crate::settings::types::PythonVersion;
/// [PEP 673]: https://peps.python.org/pep-0673/#motivation /// [PEP 673]: https://peps.python.org/pep-0673/#motivation
/// [PEP 695]: https://peps.python.org/pep-0695/ /// [PEP 695]: https://peps.python.org/pep-0695/
#[derive(ViolationMetadata)] #[derive(ViolationMetadata)]
pub(crate) struct CustomTypeVarReturnType { pub(crate) struct CustomTypeVarForSelf {
method_name: String, typevar_name: String,
} }
impl Violation for CustomTypeVarReturnType { impl Violation for CustomTypeVarForSelf {
const FIX_AVAILABILITY: FixAvailability = FixAvailability::Sometimes; const FIX_AVAILABILITY: FixAvailability = FixAvailability::Sometimes;
#[derive_message_formats] #[derive_message_formats]
fn message(&self) -> String { fn message(&self) -> String {
let method_name = &self.method_name; format!(
format!("Methods like `{method_name}` should return `Self` instead of a custom `TypeVar`") "Use `Self` instead of custom TypeVar `{}`",
&self.typevar_name
)
} }
fn fix_title(&self) -> Option<String> { fn fix_title(&self) -> Option<String> {
Some("Replace with `Self`".to_string()) Some(format!(
"Replace TypeVar `{}` with `Self`",
&self.typevar_name
))
} }
} }
/// PYI019 /// PYI019
pub(crate) fn custom_type_var_return_type( pub(crate) fn custom_type_var_instead_of_self(
checker: &Checker, checker: &Checker,
binding: &Binding, binding: &Binding,
) -> Option<Diagnostic> { ) -> Option<Diagnostic> {
@ -133,13 +139,11 @@ pub(crate) fn custom_type_var_return_type(
}), }),
}; };
if !method.uses_custom_var(semantic, binding.scope) { let custom_typevar_name = method.custom_typevar(semantic, binding.scope)?;
return None;
}
let mut diagnostic = Diagnostic::new( let mut diagnostic = Diagnostic::new(
CustomTypeVarReturnType { CustomTypeVarForSelf {
method_name: function_name.to_string(), typevar_name: custom_typevar_name.to_string(),
}, },
returns.range(), returns.range(),
); );
@ -164,10 +168,10 @@ enum Method<'a> {
} }
impl Method<'_> { impl Method<'_> {
fn uses_custom_var(&self, semantic: &SemanticModel, scope: ScopeId) -> bool { fn custom_typevar(&self, semantic: &SemanticModel, scope: ScopeId) -> Option<&str> {
match self { match self {
Self::Class(class_method) => class_method.uses_custom_var(semantic, scope), Self::Class(class_method) => class_method.custom_typevar(semantic, scope),
Self::Instance(instance_method) => instance_method.uses_custom_var(), Self::Instance(instance_method) => instance_method.custom_typevar(),
} }
} }
} }
@ -180,58 +184,45 @@ struct ClassMethod<'a> {
} }
impl ClassMethod<'_> { impl ClassMethod<'_> {
/// Returns `true` if the class method is annotated with /// Returns `Some(typevar_name)` if the class method is annotated with
/// a custom `TypeVar` that is likely private. /// a custom `TypeVar` that is likely private.
fn uses_custom_var(&self, semantic: &SemanticModel, scope: ScopeId) -> bool { fn custom_typevar(&self, semantic: &SemanticModel, scope: ScopeId) -> Option<&str> {
let ast::Expr::Subscript(ast::ExprSubscript { let ast::ExprSubscript {
value: cls_annotation_value, value: cls_annotation_value,
slice: cls_annotation_typevar, slice: cls_annotation_typevar,
.. ..
}) = self.cls_annotation } = self.cls_annotation.as_subscript_expr()?;
else {
return false;
};
let ast::Expr::Name(cls_annotation_typevar) = &**cls_annotation_typevar else { let cls_annotation_typevar = &cls_annotation_typevar.as_name_expr()?.id;
return false; let ast::ExprName { id, .. } = cls_annotation_value.as_name_expr()?;
};
let cls_annotation_typevar = &cls_annotation_typevar.id;
let ast::Expr::Name(ast::ExprName { id, .. }) = &**cls_annotation_value else {
return false;
};
if id != "type" { if id != "type" {
return false; return None;
} }
if !semantic.has_builtin_binding_in_scope("type", scope) { if !semantic.has_builtin_binding_in_scope("type", scope) {
return false; return None;
} }
let return_annotation_typevar = match self.returns { let return_annotation_typevar = match self.returns {
ast::Expr::Name(ast::ExprName { id, .. }) => id, ast::Expr::Name(ast::ExprName { id, .. }) => id,
ast::Expr::Subscript(ast::ExprSubscript { value, slice, .. }) => { ast::Expr::Subscript(ast::ExprSubscript { value, slice, .. }) => {
let ast::Expr::Name(return_annotation_typevar) = &**slice else { let return_annotation_typevar = slice.as_name_expr()?;
return false; let ast::ExprName { id, .. } = value.as_name_expr()?;
};
let ast::Expr::Name(ast::ExprName { id, .. }) = &**value else {
return false;
};
if id != "type" { if id != "type" {
return false; return None;
} }
&return_annotation_typevar.id &return_annotation_typevar.id
} }
_ => return false, _ => return None,
}; };
if cls_annotation_typevar != return_annotation_typevar { if cls_annotation_typevar != return_annotation_typevar {
return false; return None;
} }
is_likely_private_typevar(cls_annotation_typevar, self.type_params) is_likely_private_typevar(cls_annotation_typevar, self.type_params)
.then_some(cls_annotation_typevar)
} }
} }
@ -243,28 +234,22 @@ struct InstanceMethod<'a> {
} }
impl InstanceMethod<'_> { impl InstanceMethod<'_> {
/// Returns `true` if the instance method is annotated with /// Returns `Some(typevar_name)` if the instance method is annotated with
/// a custom `TypeVar` that is likely private. /// a custom `TypeVar` that is likely private.
fn uses_custom_var(&self) -> bool { fn custom_typevar(&self) -> Option<&str> {
let ast::Expr::Name(ast::ExprName { let ast::ExprName {
id: first_arg_type, .. id: first_arg_type, ..
}) = self.self_annotation } = self.self_annotation.as_name_expr()?;
else {
return false;
};
let ast::Expr::Name(ast::ExprName { let ast::ExprName {
id: return_type, .. id: return_type, ..
}) = self.returns } = self.returns.as_name_expr()?;
else {
return false;
};
if first_arg_type != return_type { if first_arg_type != return_type {
return false; return None;
} }
is_likely_private_typevar(first_arg_type, self.type_params) is_likely_private_typevar(first_arg_type, self.type_params).then_some(first_arg_type)
} }
} }

View file

@ -7,7 +7,7 @@ pub(crate) use bytestring_usage::*;
pub(crate) use collections_named_tuple::*; pub(crate) use collections_named_tuple::*;
pub(crate) use complex_assignment_in_stub::*; pub(crate) use complex_assignment_in_stub::*;
pub(crate) use complex_if_statement_in_stub::*; pub(crate) use complex_if_statement_in_stub::*;
pub(crate) use custom_type_var_return_type::*; pub(crate) use custom_type_var_for_self::*;
pub(crate) use docstring_in_stubs::*; pub(crate) use docstring_in_stubs::*;
pub(crate) use duplicate_literal_member::*; pub(crate) use duplicate_literal_member::*;
pub(crate) use duplicate_union_member::*; pub(crate) use duplicate_union_member::*;
@ -50,7 +50,7 @@ mod bytestring_usage;
mod collections_named_tuple; mod collections_named_tuple;
mod complex_assignment_in_stub; mod complex_assignment_in_stub;
mod complex_if_statement_in_stub; mod complex_if_statement_in_stub;
mod custom_type_var_return_type; mod custom_type_var_for_self;
mod docstring_in_stubs; mod docstring_in_stubs;
mod duplicate_literal_member; mod duplicate_literal_member;
mod duplicate_union_member; mod duplicate_union_member;

View file

@ -1,63 +1,63 @@
--- ---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
--- ---
PYI019_0.py:7:62: PYI019 Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:7:62: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
6 | class BadClass: 6 | class BadClass:
7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019 7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.py:10:54: PYI019 Methods like `bad_instance_method` should return `Self` instead of a custom `TypeVar` PYI019_0.py:10:54: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019 10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.py:14:54: PYI019 Methods like `bad_class_method` should return `Self` instead of a custom `TypeVar` PYI019_0.py:14:54: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
13 | @classmethod 13 | @classmethod
14 | def bad_class_method(cls: type[_S], arg: int) -> _S: ... # PYI019 14 | def bad_class_method(cls: type[_S], arg: int) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.py:18:55: PYI019 Methods like `bad_posonly_class_method` should return `Self` instead of a custom `TypeVar` PYI019_0.py:18:55: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
17 | @classmethod 17 | @classmethod
18 | def bad_posonly_class_method(cls: type[_S], /) -> _S: ... # PYI019 18 | def bad_posonly_class_method(cls: type[_S], /) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.py:39:63: PYI019 Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:39:63: PYI019 Use `Self` instead of custom TypeVar `S`
| |
37 | # Python > 3.12 37 | # Python > 3.12
38 | class PEP695BadDunderNew[T]: 38 | class PEP695BadDunderNew[T]:
39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019 39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:42:46: PYI019 Methods like `generic_instance_method` should return `Self` instead of a custom `TypeVar` PYI019_0.py:42:46: PYI019 Use `Self` instead of custom TypeVar `S`
| |
42 | def generic_instance_method[S](self: S) -> S: ... # PYI019 42 | def generic_instance_method[S](self: S) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:54:32: PYI019 Methods like `foo` should return `Self` instead of a custom `TypeVar` PYI019_0.py:54:32: PYI019 Use `Self` instead of custom TypeVar `S`
| |
52 | # in the settings for this test: 52 | # in the settings for this test:
53 | @foo_classmethod 53 | @foo_classmethod
54 | def foo[S](cls: type[S]) -> S: ... # PYI019 54 | def foo[S](cls: type[S]) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:61:48: PYI019 Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:61:48: PYI019 Use `Self` instead of custom TypeVar `S`
| |
59 | # Only .pyi gets fixes, no fixes for .py 59 | # Only .pyi gets fixes, no fixes for .py
60 | class PEP695Fix: 60 | class PEP695Fix:
@ -66,9 +66,9 @@ PYI019_0.py:61:48: PYI019 Methods like `__new__` should return `Self` instead of
62 | 62 |
63 | def __init_subclass__[S](cls: type[S]) -> S: ... 63 | def __init_subclass__[S](cls: type[S]) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:63:47: PYI019 Methods like `__init_subclass__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:63:47: PYI019 Use `Self` instead of custom TypeVar `S`
| |
61 | def __new__[S: PEP695Fix](cls: type[S]) -> S: ... 61 | def __new__[S: PEP695Fix](cls: type[S]) -> S: ...
62 | 62 |
@ -77,9 +77,9 @@ PYI019_0.py:63:47: PYI019 Methods like `__init_subclass__` should return `Self`
64 | 64 |
65 | def __neg__[S: PEP695Fix](self: S) -> S: ... 65 | def __neg__[S: PEP695Fix](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:65:43: PYI019 Methods like `__neg__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:65:43: PYI019 Use `Self` instead of custom TypeVar `S`
| |
63 | def __init_subclass__[S](cls: type[S]) -> S: ... 63 | def __init_subclass__[S](cls: type[S]) -> S: ...
64 | 64 |
@ -88,9 +88,9 @@ PYI019_0.py:65:43: PYI019 Methods like `__neg__` should return `Self` instead of
66 | 66 |
67 | def __pos__[S](self: S) -> S: ... 67 | def __pos__[S](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:67:32: PYI019 Methods like `__pos__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:67:32: PYI019 Use `Self` instead of custom TypeVar `S`
| |
65 | def __neg__[S: PEP695Fix](self: S) -> S: ... 65 | def __neg__[S: PEP695Fix](self: S) -> S: ...
66 | 66 |
@ -99,9 +99,9 @@ PYI019_0.py:67:32: PYI019 Methods like `__pos__` should return `Self` instead of
68 | 68 |
69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ... 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:69:53: PYI019 Methods like `__add__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:69:53: PYI019 Use `Self` instead of custom TypeVar `S`
| |
67 | def __pos__[S](self: S) -> S: ... 67 | def __pos__[S](self: S) -> S: ...
68 | 68 |
@ -110,9 +110,9 @@ PYI019_0.py:69:53: PYI019 Methods like `__add__` should return `Self` instead of
70 | 70 |
71 | def __sub__[S](self: S, other: S) -> S: ... 71 | def __sub__[S](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:71:42: PYI019 Methods like `__sub__` should return `Self` instead of a custom `TypeVar` PYI019_0.py:71:42: PYI019 Use `Self` instead of custom TypeVar `S`
| |
69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ... 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ...
70 | 70 |
@ -121,9 +121,9 @@ PYI019_0.py:71:42: PYI019 Methods like `__sub__` should return `Self` instead of
72 | 72 |
73 | @classmethod 73 | @classmethod
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:74:59: PYI019 Methods like `class_method_bound` should return `Self` instead of a custom `TypeVar` PYI019_0.py:74:59: PYI019 Use `Self` instead of custom TypeVar `S`
| |
73 | @classmethod 73 | @classmethod
74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ... 74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ...
@ -131,9 +131,9 @@ PYI019_0.py:74:59: PYI019 Methods like `class_method_bound` should return `Self`
75 | 75 |
76 | @classmethod 76 | @classmethod
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:77:50: PYI019 Methods like `class_method_unbound` should return `Self` instead of a custom `TypeVar` PYI019_0.py:77:50: PYI019 Use `Self` instead of custom TypeVar `S`
| |
76 | @classmethod 76 | @classmethod
77 | def class_method_unbound[S](cls: type[S]) -> S: ... 77 | def class_method_unbound[S](cls: type[S]) -> S: ...
@ -141,9 +141,9 @@ PYI019_0.py:77:50: PYI019 Methods like `class_method_unbound` should return `Sel
78 | 78 |
79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ... 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:79:57: PYI019 Methods like `instance_method_bound` should return `Self` instead of a custom `TypeVar` PYI019_0.py:79:57: PYI019 Use `Self` instead of custom TypeVar `S`
| |
77 | def class_method_unbound[S](cls: type[S]) -> S: ... 77 | def class_method_unbound[S](cls: type[S]) -> S: ...
78 | 78 |
@ -152,9 +152,9 @@ PYI019_0.py:79:57: PYI019 Methods like `instance_method_bound` should return `Se
80 | 80 |
81 | def instance_method_unbound[S](self: S) -> S: ... 81 | def instance_method_unbound[S](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:81:48: PYI019 Methods like `instance_method_unbound` should return `Self` instead of a custom `TypeVar` PYI019_0.py:81:48: PYI019 Use `Self` instead of custom TypeVar `S`
| |
79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ... 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ...
80 | 80 |
@ -163,9 +163,9 @@ PYI019_0.py:81:48: PYI019 Methods like `instance_method_unbound` should return `
82 | 82 |
83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ... 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:83:90: PYI019 Methods like `instance_method_bound_with_another_parameter` should return `Self` instead of a custom `TypeVar` PYI019_0.py:83:90: PYI019 Use `Self` instead of custom TypeVar `S`
| |
81 | def instance_method_unbound[S](self: S) -> S: ... 81 | def instance_method_unbound[S](self: S) -> S: ...
82 | 82 |
@ -174,9 +174,9 @@ PYI019_0.py:83:90: PYI019 Methods like `instance_method_bound_with_another_param
84 | 84 |
85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ... 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:85:81: PYI019 Methods like `instance_method_unbound_with_another_parameter` should return `Self` instead of a custom `TypeVar` PYI019_0.py:85:81: PYI019 Use `Self` instead of custom TypeVar `S`
| |
83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ... 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ...
84 | 84 |
@ -185,9 +185,9 @@ PYI019_0.py:85:81: PYI019 Methods like `instance_method_unbound_with_another_par
86 | 86 |
87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ... 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:87:94: PYI019 Methods like `multiple_type_vars` should return `Self` instead of a custom `TypeVar` PYI019_0.py:87:94: PYI019 Use `Self` instead of custom TypeVar `S`
| |
85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ... 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ...
86 | 86 |
@ -196,22 +196,22 @@ PYI019_0.py:87:94: PYI019 Methods like `multiple_type_vars` should return `Self`
88 | 88 |
89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ... 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.py:89:75: PYI019 Methods like `mixing_old_and_new_style_type_vars` should return `Self` instead of a custom `TypeVar` PYI019_0.py:89:75: PYI019 Use `Self` instead of custom TypeVar `_S695`
| |
87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ... 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ...
88 | 88 |
89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ... 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ...
| ^^^^^ PYI019 | ^^^^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S695` with `Self`
PYI019_0.py:114:31: PYI019 Methods like `m` should return `Self` instead of a custom `TypeVar` PYI019_0.py:114:31: PYI019 Use `Self` instead of custom TypeVar `S`
| |
112 | class SubscriptReturnType: 112 | class SubscriptReturnType:
113 | @classmethod 113 | @classmethod
114 | def m[S](cls: type[S]) -> type[S]: ... # PYI019, but no autofix (yet) 114 | def m[S](cls: type[S]) -> type[S]: ... # PYI019, but no autofix (yet)
| ^^^^^^^ PYI019 | ^^^^^^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`

View file

@ -1,63 +1,63 @@
--- ---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
--- ---
PYI019_0.pyi:7:62: PYI019 Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:7:62: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
6 | class BadClass: 6 | class BadClass:
7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019 7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.pyi:10:54: PYI019 Methods like `bad_instance_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:10:54: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019 10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.pyi:14:54: PYI019 Methods like `bad_class_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:14:54: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
13 | @classmethod 13 | @classmethod
14 | def bad_class_method(cls: type[_S], arg: int) -> _S: ... # PYI019 14 | def bad_class_method(cls: type[_S], arg: int) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.pyi:18:55: PYI019 Methods like `bad_posonly_class_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:18:55: PYI019 Use `Self` instead of custom TypeVar `_S`
| |
17 | @classmethod 17 | @classmethod
18 | def bad_posonly_class_method(cls: type[_S], /) -> _S: ... # PYI019 18 | def bad_posonly_class_method(cls: type[_S], /) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
PYI019_0.pyi:39:63: PYI019 Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:39:63: PYI019 Use `Self` instead of custom TypeVar `S`
| |
37 | # Python > 3.12 37 | # Python > 3.12
38 | class PEP695BadDunderNew[T]: 38 | class PEP695BadDunderNew[T]:
39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019 39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:42:46: PYI019 Methods like `generic_instance_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:42:46: PYI019 Use `Self` instead of custom TypeVar `S`
| |
42 | def generic_instance_method[S](self: S) -> S: ... # PYI019 42 | def generic_instance_method[S](self: S) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:54:32: PYI019 Methods like `foo` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:54:32: PYI019 Use `Self` instead of custom TypeVar `S`
| |
52 | # in the settings for this test: 52 | # in the settings for this test:
53 | @foo_classmethod 53 | @foo_classmethod
54 | def foo[S](cls: type[S]) -> S: ... # PYI019 54 | def foo[S](cls: type[S]) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:61:48: PYI019 Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:61:48: PYI019 Use `Self` instead of custom TypeVar `S`
| |
59 | # Only .pyi gets fixes, no fixes for .py 59 | # Only .pyi gets fixes, no fixes for .py
60 | class PEP695Fix: 60 | class PEP695Fix:
@ -66,9 +66,9 @@ PYI019_0.pyi:61:48: PYI019 Methods like `__new__` should return `Self` instead o
62 | 62 |
63 | def __init_subclass__[S](cls: type[S]) -> S: ... 63 | def __init_subclass__[S](cls: type[S]) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:63:47: PYI019 Methods like `__init_subclass__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:63:47: PYI019 Use `Self` instead of custom TypeVar `S`
| |
61 | def __new__[S: PEP695Fix](cls: type[S]) -> S: ... 61 | def __new__[S: PEP695Fix](cls: type[S]) -> S: ...
62 | 62 |
@ -77,9 +77,9 @@ PYI019_0.pyi:63:47: PYI019 Methods like `__init_subclass__` should return `Self`
64 | 64 |
65 | def __neg__[S: PEP695Fix](self: S) -> S: ... 65 | def __neg__[S: PEP695Fix](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:65:43: PYI019 Methods like `__neg__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:65:43: PYI019 Use `Self` instead of custom TypeVar `S`
| |
63 | def __init_subclass__[S](cls: type[S]) -> S: ... 63 | def __init_subclass__[S](cls: type[S]) -> S: ...
64 | 64 |
@ -88,9 +88,9 @@ PYI019_0.pyi:65:43: PYI019 Methods like `__neg__` should return `Self` instead o
66 | 66 |
67 | def __pos__[S](self: S) -> S: ... 67 | def __pos__[S](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:67:32: PYI019 Methods like `__pos__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:67:32: PYI019 Use `Self` instead of custom TypeVar `S`
| |
65 | def __neg__[S: PEP695Fix](self: S) -> S: ... 65 | def __neg__[S: PEP695Fix](self: S) -> S: ...
66 | 66 |
@ -99,9 +99,9 @@ PYI019_0.pyi:67:32: PYI019 Methods like `__pos__` should return `Self` instead o
68 | 68 |
69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ... 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:69:53: PYI019 Methods like `__add__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:69:53: PYI019 Use `Self` instead of custom TypeVar `S`
| |
67 | def __pos__[S](self: S) -> S: ... 67 | def __pos__[S](self: S) -> S: ...
68 | 68 |
@ -110,9 +110,9 @@ PYI019_0.pyi:69:53: PYI019 Methods like `__add__` should return `Self` instead o
70 | 70 |
71 | def __sub__[S](self: S, other: S) -> S: ... 71 | def __sub__[S](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:71:42: PYI019 Methods like `__sub__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:71:42: PYI019 Use `Self` instead of custom TypeVar `S`
| |
69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ... 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ...
70 | 70 |
@ -121,9 +121,9 @@ PYI019_0.pyi:71:42: PYI019 Methods like `__sub__` should return `Self` instead o
72 | 72 |
73 | @classmethod 73 | @classmethod
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:74:59: PYI019 Methods like `class_method_bound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:74:59: PYI019 Use `Self` instead of custom TypeVar `S`
| |
73 | @classmethod 73 | @classmethod
74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ... 74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ...
@ -131,9 +131,9 @@ PYI019_0.pyi:74:59: PYI019 Methods like `class_method_bound` should return `Self
75 | 75 |
76 | @classmethod 76 | @classmethod
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:77:50: PYI019 Methods like `class_method_unbound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:77:50: PYI019 Use `Self` instead of custom TypeVar `S`
| |
76 | @classmethod 76 | @classmethod
77 | def class_method_unbound[S](cls: type[S]) -> S: ... 77 | def class_method_unbound[S](cls: type[S]) -> S: ...
@ -141,9 +141,9 @@ PYI019_0.pyi:77:50: PYI019 Methods like `class_method_unbound` should return `Se
78 | 78 |
79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ... 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:79:57: PYI019 Methods like `instance_method_bound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:79:57: PYI019 Use `Self` instead of custom TypeVar `S`
| |
77 | def class_method_unbound[S](cls: type[S]) -> S: ... 77 | def class_method_unbound[S](cls: type[S]) -> S: ...
78 | 78 |
@ -152,9 +152,9 @@ PYI019_0.pyi:79:57: PYI019 Methods like `instance_method_bound` should return `S
80 | 80 |
81 | def instance_method_unbound[S](self: S) -> S: ... 81 | def instance_method_unbound[S](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:81:48: PYI019 Methods like `instance_method_unbound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:81:48: PYI019 Use `Self` instead of custom TypeVar `S`
| |
79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ... 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ...
80 | 80 |
@ -163,9 +163,9 @@ PYI019_0.pyi:81:48: PYI019 Methods like `instance_method_unbound` should return
82 | 82 |
83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ... 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:83:90: PYI019 Methods like `instance_method_bound_with_another_parameter` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:83:90: PYI019 Use `Self` instead of custom TypeVar `S`
| |
81 | def instance_method_unbound[S](self: S) -> S: ... 81 | def instance_method_unbound[S](self: S) -> S: ...
82 | 82 |
@ -174,9 +174,9 @@ PYI019_0.pyi:83:90: PYI019 Methods like `instance_method_bound_with_another_para
84 | 84 |
85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ... 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:85:81: PYI019 Methods like `instance_method_unbound_with_another_parameter` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:85:81: PYI019 Use `Self` instead of custom TypeVar `S`
| |
83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ... 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ...
84 | 84 |
@ -185,9 +185,9 @@ PYI019_0.pyi:85:81: PYI019 Methods like `instance_method_unbound_with_another_pa
86 | 86 |
87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ... 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:87:94: PYI019 Methods like `multiple_type_vars` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:87:94: PYI019 Use `Self` instead of custom TypeVar `S`
| |
85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ... 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ...
86 | 86 |
@ -196,44 +196,44 @@ PYI019_0.pyi:87:94: PYI019 Methods like `multiple_type_vars` should return `Self
88 | 88 |
89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ... 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:89:75: PYI019 Methods like `mixing_old_and_new_style_type_vars` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:89:75: PYI019 Use `Self` instead of custom TypeVar `_S695`
| |
87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ... 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ...
88 | 88 |
89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ... 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ...
| ^^^^^ PYI019 | ^^^^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S695` with `Self`
PYI019_0.pyi:114:31: PYI019 Methods like `m` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:114:31: PYI019 Use `Self` instead of custom TypeVar `S`
| |
112 | class SubscriptReturnType: 112 | class SubscriptReturnType:
113 | @classmethod 113 | @classmethod
114 | def m[S](cls: type[S]) -> type[S]: ... # PYI019, but no autofix (yet) 114 | def m[S](cls: type[S]) -> type[S]: ... # PYI019, but no autofix (yet)
| ^^^^^^^ PYI019 | ^^^^^^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:118:29: PYI019 Methods like `f` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:118:29: PYI019 Use `Self` instead of custom TypeVar `S`
| |
117 | class PEP695TypeParameterAtTheVeryEndOfTheList: 117 | class PEP695TypeParameterAtTheVeryEndOfTheList:
118 | def f[T, S](self: S) -> S: ... 118 | def f[T, S](self: S) -> S: ...
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:122:100: PYI019 Methods like `mixing_and_nested` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:122:100: PYI019 Use `Self` instead of custom TypeVar `_S695`
| |
121 | class PEP695Again: 121 | class PEP695Again:
122 | def mixing_and_nested[T](self: _S695, a: list[_S695], b: dict[_S695, str | T | set[_S695]]) -> _S695: ... 122 | def mixing_and_nested[T](self: _S695, a: list[_S695], b: dict[_S695, str | T | set[_S695]]) -> _S695: ...
| ^^^^^ PYI019 | ^^^^^ PYI019
123 | def also_uses_s695_but_should_not_be_edited(self, v: set[tuple[_S695]]) -> _S695: ... 123 | def also_uses_s695_but_should_not_be_edited(self, v: set[tuple[_S695]]) -> _S695: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `_S695` with `Self`
PYI019_0.pyi:132:10: PYI019 Methods like `comment_in_fix_range` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:132:10: PYI019 Use `Self` instead of custom TypeVar `S`
| |
130 | a: T, 130 | a: T,
131 | b: tuple[S, T] 131 | b: tuple[S, T]
@ -242,13 +242,13 @@ PYI019_0.pyi:132:10: PYI019 Methods like `comment_in_fix_range` should return `S
133 | 133 |
134 | def comment_outside_fix_range[T, S]( 134 | def comment_outside_fix_range[T, S](
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:141:10: PYI019 Methods like `comment_outside_fix_range` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:141:10: PYI019 Use `Self` instead of custom TypeVar `S`
| |
139 | S, T 139 | S, T
140 | ] 140 | ]
141 | ) -> S: ... 141 | ) -> S: ...
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`

View file

@ -1,10 +1,10 @@
--- ---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
--- ---
PYI019_1.pyi:4:26: PYI019 Methods like `m` should return `Self` instead of a custom `TypeVar` PYI019_1.pyi:4:26: PYI019 Use `Self` instead of custom TypeVar `S`
| |
3 | class F: 3 | class F:
4 | def m[S](self: S) -> S: ... 4 | def m[S](self: S) -> S: ...
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`

View file

@ -1,13 +1,13 @@
--- ---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
--- ---
PYI019_0.pyi:7:62: PYI019 [*] Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:7:62: PYI019 [*] Use `Self` instead of custom TypeVar `_S`
| |
6 | class BadClass: 6 | class BadClass:
7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019 7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
Safe fix Safe fix
4 4 | _S2 = TypeVar("_S2", BadClass, GoodClass) 4 4 | _S2 = TypeVar("_S2", BadClass, GoodClass)
@ -19,12 +19,12 @@ PYI019_0.pyi:7:62: PYI019 [*] Methods like `__new__` should return `Self` instea
9 9 | 9 9 |
10 10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019 10 10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019
PYI019_0.pyi:10:54: PYI019 [*] Methods like `bad_instance_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:10:54: PYI019 [*] Use `Self` instead of custom TypeVar `_S`
| |
10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019 10 | def bad_instance_method(self: _S, arg: bytes) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
Safe fix Safe fix
7 7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019 7 7 | def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ... # PYI019
@ -36,13 +36,13 @@ PYI019_0.pyi:10:54: PYI019 [*] Methods like `bad_instance_method` should return
12 12 | 12 12 |
13 13 | @classmethod 13 13 | @classmethod
PYI019_0.pyi:14:54: PYI019 [*] Methods like `bad_class_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:14:54: PYI019 [*] Use `Self` instead of custom TypeVar `_S`
| |
13 | @classmethod 13 | @classmethod
14 | def bad_class_method(cls: type[_S], arg: int) -> _S: ... # PYI019 14 | def bad_class_method(cls: type[_S], arg: int) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
Safe fix Safe fix
11 11 | 11 11 |
@ -54,13 +54,13 @@ PYI019_0.pyi:14:54: PYI019 [*] Methods like `bad_class_method` should return `Se
16 16 | 16 16 |
17 17 | @classmethod 17 17 | @classmethod
PYI019_0.pyi:18:55: PYI019 [*] Methods like `bad_posonly_class_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:18:55: PYI019 [*] Use `Self` instead of custom TypeVar `_S`
| |
17 | @classmethod 17 | @classmethod
18 | def bad_posonly_class_method(cls: type[_S], /) -> _S: ... # PYI019 18 | def bad_posonly_class_method(cls: type[_S], /) -> _S: ... # PYI019
| ^^ PYI019 | ^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S` with `Self`
Safe fix Safe fix
15 15 | 15 15 |
@ -72,14 +72,14 @@ PYI019_0.pyi:18:55: PYI019 [*] Methods like `bad_posonly_class_method` should re
20 20 | 20 20 |
21 21 | @classmethod 21 21 | @classmethod
PYI019_0.pyi:39:63: PYI019 [*] Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:39:63: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
37 | # Python > 3.12 37 | # Python > 3.12
38 | class PEP695BadDunderNew[T]: 38 | class PEP695BadDunderNew[T]:
39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019 39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
36 36 | 36 36 |
@ -91,12 +91,12 @@ PYI019_0.pyi:39:63: PYI019 [*] Methods like `__new__` should return `Self` inste
41 41 | 41 41 |
42 42 | def generic_instance_method[S](self: S) -> S: ... # PYI019 42 42 | def generic_instance_method[S](self: S) -> S: ... # PYI019
PYI019_0.pyi:42:46: PYI019 [*] Methods like `generic_instance_method` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:42:46: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
42 | def generic_instance_method[S](self: S) -> S: ... # PYI019 42 | def generic_instance_method[S](self: S) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
39 39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019 39 39 | def __new__[S](cls: type[S], *args: Any, ** kwargs: Any) -> S: ... # PYI019
@ -108,14 +108,14 @@ PYI019_0.pyi:42:46: PYI019 [*] Methods like `generic_instance_method` should ret
44 44 | 44 44 |
45 45 | class PEP695GoodDunderNew[T]: 45 45 | class PEP695GoodDunderNew[T]:
PYI019_0.pyi:54:32: PYI019 [*] Methods like `foo` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:54:32: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
52 | # in the settings for this test: 52 | # in the settings for this test:
53 | @foo_classmethod 53 | @foo_classmethod
54 | def foo[S](cls: type[S]) -> S: ... # PYI019 54 | def foo[S](cls: type[S]) -> S: ... # PYI019
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
51 51 | # due to `foo_classmethod being listed in `pep8_naming.classmethod-decorators` 51 51 | # due to `foo_classmethod being listed in `pep8_naming.classmethod-decorators`
@ -127,7 +127,7 @@ PYI019_0.pyi:54:32: PYI019 [*] Methods like `foo` should return `Self` instead o
56 56 | 56 56 |
57 57 | _S695 = TypeVar("_S695", bound="PEP695Fix") 57 57 | _S695 = TypeVar("_S695", bound="PEP695Fix")
PYI019_0.pyi:61:48: PYI019 [*] Methods like `__new__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:61:48: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
59 | # Only .pyi gets fixes, no fixes for .py 59 | # Only .pyi gets fixes, no fixes for .py
60 | class PEP695Fix: 60 | class PEP695Fix:
@ -136,7 +136,7 @@ PYI019_0.pyi:61:48: PYI019 [*] Methods like `__new__` should return `Self` inste
62 | 62 |
63 | def __init_subclass__[S](cls: type[S]) -> S: ... 63 | def __init_subclass__[S](cls: type[S]) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
58 58 | 58 58 |
@ -148,7 +148,7 @@ PYI019_0.pyi:61:48: PYI019 [*] Methods like `__new__` should return `Self` inste
63 63 | def __init_subclass__[S](cls: type[S]) -> S: ... 63 63 | def __init_subclass__[S](cls: type[S]) -> S: ...
64 64 | 64 64 |
PYI019_0.pyi:63:47: PYI019 [*] Methods like `__init_subclass__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:63:47: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
61 | def __new__[S: PEP695Fix](cls: type[S]) -> S: ... 61 | def __new__[S: PEP695Fix](cls: type[S]) -> S: ...
62 | 62 |
@ -157,7 +157,7 @@ PYI019_0.pyi:63:47: PYI019 [*] Methods like `__init_subclass__` should return `S
64 | 64 |
65 | def __neg__[S: PEP695Fix](self: S) -> S: ... 65 | def __neg__[S: PEP695Fix](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
60 60 | class PEP695Fix: 60 60 | class PEP695Fix:
@ -169,7 +169,7 @@ PYI019_0.pyi:63:47: PYI019 [*] Methods like `__init_subclass__` should return `S
65 65 | def __neg__[S: PEP695Fix](self: S) -> S: ... 65 65 | def __neg__[S: PEP695Fix](self: S) -> S: ...
66 66 | 66 66 |
PYI019_0.pyi:65:43: PYI019 [*] Methods like `__neg__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:65:43: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
63 | def __init_subclass__[S](cls: type[S]) -> S: ... 63 | def __init_subclass__[S](cls: type[S]) -> S: ...
64 | 64 |
@ -178,7 +178,7 @@ PYI019_0.pyi:65:43: PYI019 [*] Methods like `__neg__` should return `Self` inste
66 | 66 |
67 | def __pos__[S](self: S) -> S: ... 67 | def __pos__[S](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
62 62 | 62 62 |
@ -190,7 +190,7 @@ PYI019_0.pyi:65:43: PYI019 [*] Methods like `__neg__` should return `Self` inste
67 67 | def __pos__[S](self: S) -> S: ... 67 67 | def __pos__[S](self: S) -> S: ...
68 68 | 68 68 |
PYI019_0.pyi:67:32: PYI019 [*] Methods like `__pos__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:67:32: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
65 | def __neg__[S: PEP695Fix](self: S) -> S: ... 65 | def __neg__[S: PEP695Fix](self: S) -> S: ...
66 | 66 |
@ -199,7 +199,7 @@ PYI019_0.pyi:67:32: PYI019 [*] Methods like `__pos__` should return `Self` inste
68 | 68 |
69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ... 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
64 64 | 64 64 |
@ -211,7 +211,7 @@ PYI019_0.pyi:67:32: PYI019 [*] Methods like `__pos__` should return `Self` inste
69 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ... 69 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ...
70 70 | 70 70 |
PYI019_0.pyi:69:53: PYI019 [*] Methods like `__add__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:69:53: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
67 | def __pos__[S](self: S) -> S: ... 67 | def __pos__[S](self: S) -> S: ...
68 | 68 |
@ -220,7 +220,7 @@ PYI019_0.pyi:69:53: PYI019 [*] Methods like `__add__` should return `Self` inste
70 | 70 |
71 | def __sub__[S](self: S, other: S) -> S: ... 71 | def __sub__[S](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
66 66 | 66 66 |
@ -232,7 +232,7 @@ PYI019_0.pyi:69:53: PYI019 [*] Methods like `__add__` should return `Self` inste
71 71 | def __sub__[S](self: S, other: S) -> S: ... 71 71 | def __sub__[S](self: S, other: S) -> S: ...
72 72 | 72 72 |
PYI019_0.pyi:71:42: PYI019 [*] Methods like `__sub__` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:71:42: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ... 69 | def __add__[S: PEP695Fix](self: S, other: S) -> S: ...
70 | 70 |
@ -241,7 +241,7 @@ PYI019_0.pyi:71:42: PYI019 [*] Methods like `__sub__` should return `Self` inste
72 | 72 |
73 | @classmethod 73 | @classmethod
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
68 68 | 68 68 |
@ -253,7 +253,7 @@ PYI019_0.pyi:71:42: PYI019 [*] Methods like `__sub__` should return `Self` inste
73 73 | @classmethod 73 73 | @classmethod
74 74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ... 74 74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ...
PYI019_0.pyi:74:59: PYI019 [*] Methods like `class_method_bound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:74:59: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
73 | @classmethod 73 | @classmethod
74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ... 74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ...
@ -261,7 +261,7 @@ PYI019_0.pyi:74:59: PYI019 [*] Methods like `class_method_bound` should return `
75 | 75 |
76 | @classmethod 76 | @classmethod
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
71 71 | def __sub__[S](self: S, other: S) -> S: ... 71 71 | def __sub__[S](self: S, other: S) -> S: ...
@ -273,7 +273,7 @@ PYI019_0.pyi:74:59: PYI019 [*] Methods like `class_method_bound` should return `
76 76 | @classmethod 76 76 | @classmethod
77 77 | def class_method_unbound[S](cls: type[S]) -> S: ... 77 77 | def class_method_unbound[S](cls: type[S]) -> S: ...
PYI019_0.pyi:77:50: PYI019 [*] Methods like `class_method_unbound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:77:50: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
76 | @classmethod 76 | @classmethod
77 | def class_method_unbound[S](cls: type[S]) -> S: ... 77 | def class_method_unbound[S](cls: type[S]) -> S: ...
@ -281,7 +281,7 @@ PYI019_0.pyi:77:50: PYI019 [*] Methods like `class_method_unbound` should return
78 | 78 |
79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ... 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
74 74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ... 74 74 | def class_method_bound[S: PEP695Fix](cls: type[S]) -> S: ...
@ -293,7 +293,7 @@ PYI019_0.pyi:77:50: PYI019 [*] Methods like `class_method_unbound` should return
79 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ... 79 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ...
80 80 | 80 80 |
PYI019_0.pyi:79:57: PYI019 [*] Methods like `instance_method_bound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:79:57: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
77 | def class_method_unbound[S](cls: type[S]) -> S: ... 77 | def class_method_unbound[S](cls: type[S]) -> S: ...
78 | 78 |
@ -302,7 +302,7 @@ PYI019_0.pyi:79:57: PYI019 [*] Methods like `instance_method_bound` should retur
80 | 80 |
81 | def instance_method_unbound[S](self: S) -> S: ... 81 | def instance_method_unbound[S](self: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
76 76 | @classmethod 76 76 | @classmethod
@ -314,7 +314,7 @@ PYI019_0.pyi:79:57: PYI019 [*] Methods like `instance_method_bound` should retur
81 81 | def instance_method_unbound[S](self: S) -> S: ... 81 81 | def instance_method_unbound[S](self: S) -> S: ...
82 82 | 82 82 |
PYI019_0.pyi:81:48: PYI019 [*] Methods like `instance_method_unbound` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:81:48: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ... 79 | def instance_method_bound[S: PEP695Fix](self: S) -> S: ...
80 | 80 |
@ -323,7 +323,7 @@ PYI019_0.pyi:81:48: PYI019 [*] Methods like `instance_method_unbound` should ret
82 | 82 |
83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ... 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
78 78 | 78 78 |
@ -335,7 +335,7 @@ PYI019_0.pyi:81:48: PYI019 [*] Methods like `instance_method_unbound` should ret
83 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ... 83 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ...
84 84 | 84 84 |
PYI019_0.pyi:83:90: PYI019 [*] Methods like `instance_method_bound_with_another_parameter` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:83:90: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
81 | def instance_method_unbound[S](self: S) -> S: ... 81 | def instance_method_unbound[S](self: S) -> S: ...
82 | 82 |
@ -344,7 +344,7 @@ PYI019_0.pyi:83:90: PYI019 [*] Methods like `instance_method_bound_with_another_
84 | 84 |
85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ... 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
80 80 | 80 80 |
@ -356,7 +356,7 @@ PYI019_0.pyi:83:90: PYI019 [*] Methods like `instance_method_bound_with_another_
85 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ... 85 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ...
86 86 | 86 86 |
PYI019_0.pyi:85:81: PYI019 [*] Methods like `instance_method_unbound_with_another_parameter` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:85:81: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ... 83 | def instance_method_bound_with_another_parameter[S: PEP695Fix](self: S, other: S) -> S: ...
84 | 84 |
@ -365,7 +365,7 @@ PYI019_0.pyi:85:81: PYI019 [*] Methods like `instance_method_unbound_with_anothe
86 | 86 |
87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ... 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
82 82 | 82 82 |
@ -377,7 +377,7 @@ PYI019_0.pyi:85:81: PYI019 [*] Methods like `instance_method_unbound_with_anothe
87 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ... 87 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ...
88 88 | 88 88 |
PYI019_0.pyi:87:94: PYI019 [*] Methods like `multiple_type_vars` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:87:94: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ... 85 | def instance_method_unbound_with_another_parameter[S](self: S, other: S) -> S: ...
86 | 86 |
@ -386,7 +386,7 @@ PYI019_0.pyi:87:94: PYI019 [*] Methods like `multiple_type_vars` should return `
88 | 88 |
89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ... 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
84 84 | 84 84 |
@ -398,14 +398,14 @@ PYI019_0.pyi:87:94: PYI019 [*] Methods like `multiple_type_vars` should return `
89 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ... 89 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ...
90 90 | 90 90 |
PYI019_0.pyi:89:75: PYI019 [*] Methods like `mixing_old_and_new_style_type_vars` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:89:75: PYI019 [*] Use `Self` instead of custom TypeVar `_S695`
| |
87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ... 87 | def multiple_type_vars[S, *Ts, T](self: S, other: S, /, *args: *Ts, a: T, b: list[T]) -> S: ...
88 | 88 |
89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ... 89 | def mixing_old_and_new_style_type_vars[T](self: _S695, a: T, b: T) -> _S695: ...
| ^^^^^ PYI019 | ^^^^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `_S695` with `Self`
Safe fix Safe fix
86 86 | 86 86 |
@ -417,22 +417,22 @@ PYI019_0.pyi:89:75: PYI019 [*] Methods like `mixing_old_and_new_style_type_vars`
91 91 | 91 91 |
92 92 | class InvalidButWeDoNotPanic: 92 92 | class InvalidButWeDoNotPanic:
PYI019_0.pyi:114:31: PYI019 Methods like `m` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:114:31: PYI019 Use `Self` instead of custom TypeVar `S`
| |
112 | class SubscriptReturnType: 112 | class SubscriptReturnType:
113 | @classmethod 113 | @classmethod
114 | def m[S](cls: type[S]) -> type[S]: ... # PYI019, but no autofix (yet) 114 | def m[S](cls: type[S]) -> type[S]: ... # PYI019, but no autofix (yet)
| ^^^^^^^ PYI019 | ^^^^^^^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
PYI019_0.pyi:118:29: PYI019 [*] Methods like `f` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:118:29: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
117 | class PEP695TypeParameterAtTheVeryEndOfTheList: 117 | class PEP695TypeParameterAtTheVeryEndOfTheList:
118 | def f[T, S](self: S) -> S: ... 118 | def f[T, S](self: S) -> S: ...
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
115 115 | 115 115 |
@ -444,14 +444,14 @@ PYI019_0.pyi:118:29: PYI019 [*] Methods like `f` should return `Self` instead of
120 120 | 120 120 |
121 121 | class PEP695Again: 121 121 | class PEP695Again:
PYI019_0.pyi:122:100: PYI019 [*] Methods like `mixing_and_nested` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:122:100: PYI019 [*] Use `Self` instead of custom TypeVar `_S695`
| |
121 | class PEP695Again: 121 | class PEP695Again:
122 | def mixing_and_nested[T](self: _S695, a: list[_S695], b: dict[_S695, str | T | set[_S695]]) -> _S695: ... 122 | def mixing_and_nested[T](self: _S695, a: list[_S695], b: dict[_S695, str | T | set[_S695]]) -> _S695: ...
| ^^^^^ PYI019 | ^^^^^ PYI019
123 | def also_uses_s695_but_should_not_be_edited(self, v: set[tuple[_S695]]) -> _S695: ... 123 | def also_uses_s695_but_should_not_be_edited(self, v: set[tuple[_S695]]) -> _S695: ...
| |
= help: Replace with `Self` = help: Replace TypeVar `_S695` with `Self`
Safe fix Safe fix
119 119 | 119 119 |
@ -463,7 +463,7 @@ PYI019_0.pyi:122:100: PYI019 [*] Methods like `mixing_and_nested` should return
124 124 | 124 124 |
125 125 | @classmethod 125 125 | @classmethod
PYI019_0.pyi:132:10: PYI019 [*] Methods like `comment_in_fix_range` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:132:10: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
130 | a: T, 130 | a: T,
131 | b: tuple[S, T] 131 | b: tuple[S, T]
@ -472,7 +472,7 @@ PYI019_0.pyi:132:10: PYI019 [*] Methods like `comment_in_fix_range` should retur
133 | 133 |
134 | def comment_outside_fix_range[T, S]( 134 | def comment_outside_fix_range[T, S](
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Unsafe fix Unsafe fix
123 123 | def also_uses_s695_but_should_not_be_edited(self, v: set[tuple[_S695]]) -> _S695: ... 123 123 | def also_uses_s695_but_should_not_be_edited(self, v: set[tuple[_S695]]) -> _S695: ...
@ -493,14 +493,14 @@ PYI019_0.pyi:132:10: PYI019 [*] Methods like `comment_in_fix_range` should retur
134 132 | def comment_outside_fix_range[T, S]( 134 132 | def comment_outside_fix_range[T, S](
135 133 | self: S, 135 133 | self: S,
PYI019_0.pyi:141:10: PYI019 [*] Methods like `comment_outside_fix_range` should return `Self` instead of a custom `TypeVar` PYI019_0.pyi:141:10: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
139 | S, T 139 | S, T
140 | ] 140 | ]
141 | ) -> S: ... 141 | ) -> S: ...
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
131 131 | b: tuple[S, T] 131 131 | b: tuple[S, T]

View file

@ -1,13 +1,13 @@
--- ---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
--- ---
PYI019_1.pyi:4:26: PYI019 [*] Methods like `m` should return `Self` instead of a custom `TypeVar` PYI019_1.pyi:4:26: PYI019 [*] Use `Self` instead of custom TypeVar `S`
| |
3 | class F: 3 | class F:
4 | def m[S](self: S) -> S: ... 4 | def m[S](self: S) -> S: ...
| ^ PYI019 | ^ PYI019
| |
= help: Replace with `Self` = help: Replace TypeVar `S` with `Self`
Safe fix Safe fix
1 1 | import typing 1 1 | import typing