Flag private member accesses on calls et al (#2753)

This commit is contained in:
Charlie Marsh 2023-02-10 19:23:22 -05:00 committed by GitHub
parent 9f84c497f9
commit dadbfea497
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 31 deletions

View File

@ -33,6 +33,8 @@ class Foo(metaclass=BazMeta):
def get_bar(): def get_bar():
if self.bar._private: # SLF001 if self.bar._private: # SLF001
return None return None
if self.bar()._private: # SLF001
return None
return self.bar return self.bar
def public_func(self): def public_func(self):
@ -51,9 +53,11 @@ print(foo.public_thing)
print(foo.public_func()) print(foo.public_func())
print(foo.__dict__) print(foo.__dict__)
print(foo.__str__()) print(foo.__str__())
print(foo().__class__)
print(foo._private_thing) # SLF001 print(foo._private_thing) # SLF001
print(foo.__really_private_thing) # SLF001 print(foo.__really_private_thing) # SLF001
print(foo._private_func()) # SLF001 print(foo._private_func()) # SLF001
print(foo.__really_private_func(1)) # SLF001 print(foo.__really_private_func(1)) # SLF001
print(foo.bar._private) # SLF001 print(foo.bar._private) # SLF001
print(foo()._private_thing) # SLF001

View File

@ -1,6 +1,8 @@
use ruff_macros::{define_violation, derive_message_formats};
use rustpython_parser::ast::{Expr, ExprKind}; use rustpython_parser::ast::{Expr, ExprKind};
use ruff_macros::{define_violation, derive_message_formats};
use crate::ast::helpers::collect_call_path;
use crate::ast::types::Range; use crate::ast::types::Range;
use crate::checkers::ast::Checker; use crate::checkers::ast::Checker;
use crate::registry::Diagnostic; use crate::registry::Diagnostic;
@ -25,20 +27,17 @@ const VALID_IDS: [&str; 3] = ["self", "cls", "mcs"];
pub fn private_member_access(checker: &mut Checker, expr: &Expr) { pub fn private_member_access(checker: &mut Checker, expr: &Expr) {
if let ExprKind::Attribute { value, attr, .. } = &expr.node { if let ExprKind::Attribute { value, attr, .. } = &expr.node {
if !attr.ends_with("__") && (attr.starts_with('_') || attr.starts_with("__")) { if !attr.ends_with("__") && (attr.starts_with('_') || attr.starts_with("__")) {
let id = match &value.node { let call_path = collect_call_path(value);
ExprKind::Name { id, .. } => id, if VALID_IDS.iter().any(|id| call_path.as_slice() == [*id]) {
ExprKind::Attribute { attr, .. } => attr, return;
_ => return, }
};
if !VALID_IDS.contains(&id.as_str()) {
checker.diagnostics.push(Diagnostic::new( checker.diagnostics.push(Diagnostic::new(
PrivateMemberAccess { PrivateMemberAccess {
access: format!("{}.{}", id, attr), access: attr.to_string(),
}, },
Range::from_located(expr), Range::from_located(expr),
)); ));
} }
} }
}
} }

View File

@ -1,10 +1,10 @@
--- ---
source: src/rules/flake8_self/mod.rs source: crates/ruff/src/rules/flake8_self/mod.rs
expression: diagnostics expression: diagnostics
--- ---
- kind: - kind:
PrivateMemberAccess: PrivateMemberAccess:
access: bar._private access: _private
location: location:
row: 34 row: 34
column: 11 column: 11
@ -15,57 +15,79 @@ expression: diagnostics
parent: ~ parent: ~
- kind: - kind:
PrivateMemberAccess: PrivateMemberAccess:
access: foo._private_thing access: _private
location: location:
row: 55 row: 36
column: 11
end_location:
row: 36
column: 30
fix: ~
parent: ~
- kind:
PrivateMemberAccess:
access: _private_thing
location:
row: 58
column: 6 column: 6
end_location: end_location:
row: 55 row: 58
column: 24 column: 24
fix: ~ fix: ~
parent: ~ parent: ~
- kind: - kind:
PrivateMemberAccess: PrivateMemberAccess:
access: foo.__really_private_thing access: __really_private_thing
location: location:
row: 56 row: 59
column: 6 column: 6
end_location: end_location:
row: 56 row: 59
column: 32 column: 32
fix: ~ fix: ~
parent: ~ parent: ~
- kind: - kind:
PrivateMemberAccess: PrivateMemberAccess:
access: foo._private_func access: _private_func
location: location:
row: 57 row: 60
column: 6 column: 6
end_location: end_location:
row: 57 row: 60
column: 23 column: 23
fix: ~ fix: ~
parent: ~ parent: ~
- kind: - kind:
PrivateMemberAccess: PrivateMemberAccess:
access: foo.__really_private_func access: __really_private_func
location: location:
row: 58 row: 61
column: 6 column: 6
end_location: end_location:
row: 58 row: 61
column: 31 column: 31
fix: ~ fix: ~
parent: ~ parent: ~
- kind: - kind:
PrivateMemberAccess: PrivateMemberAccess:
access: bar._private access: _private
location: location:
row: 59 row: 62
column: 6 column: 6
end_location: end_location:
row: 59 row: 62
column: 22 column: 22
fix: ~ fix: ~
parent: ~ parent: ~
- kind:
PrivateMemberAccess:
access: _private_thing
location:
row: 63
column: 6
end_location:
row: 63
column: 26
fix: ~
parent: ~