Avoid flagging builtins for OSError rewrites (#1800)

Related to (but does not fix) #1790.
This commit is contained in:
Charlie Marsh 2023-01-11 18:49:25 -05:00 committed by GitHub
parent fb2382fbc3
commit c56f263618
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 14 deletions

View file

@ -0,0 +1,8 @@
class SocketError(Exception):
pass
try:
raise SocketError()
except SocketError:
pass

View file

@ -1207,7 +1207,7 @@ where
} }
if self.settings.enabled.contains(&RuleCode::UP024) { if self.settings.enabled.contains(&RuleCode::UP024) {
if let Some(item) = exc { if let Some(item) = exc {
pyupgrade::rules::os_error_alias(self, item); pyupgrade::rules::os_error_alias(self, &item);
} }
} }
} }
@ -1333,7 +1333,7 @@ where
flake8_bugbear::rules::redundant_tuple_in_exception_handler(self, handlers); flake8_bugbear::rules::redundant_tuple_in_exception_handler(self, handlers);
} }
if self.settings.enabled.contains(&RuleCode::UP024) { if self.settings.enabled.contains(&RuleCode::UP024) {
pyupgrade::rules::os_error_alias(self, handlers); pyupgrade::rules::os_error_alias(self, &handlers);
} }
if self.settings.enabled.contains(&RuleCode::PT017) { if self.settings.enabled.contains(&RuleCode::PT017) {
self.diagnostics.extend( self.diagnostics.extend(
@ -1921,7 +1921,7 @@ where
pyupgrade::rules::replace_stdout_stderr(self, expr, keywords); pyupgrade::rules::replace_stdout_stderr(self, expr, keywords);
} }
if self.settings.enabled.contains(&RuleCode::UP024) { if self.settings.enabled.contains(&RuleCode::UP024) {
pyupgrade::rules::os_error_alias(self, expr); pyupgrade::rules::os_error_alias(self, &expr);
} }
// flake8-print // flake8-print

View file

@ -44,6 +44,7 @@ mod tests {
#[test_case(RuleCode::UP024, Path::new("UP024_0.py"); "UP024_0")] #[test_case(RuleCode::UP024, Path::new("UP024_0.py"); "UP024_0")]
#[test_case(RuleCode::UP024, Path::new("UP024_1.py"); "UP024_1")] #[test_case(RuleCode::UP024, Path::new("UP024_1.py"); "UP024_1")]
#[test_case(RuleCode::UP024, Path::new("UP024_2.py"); "UP024_2")] #[test_case(RuleCode::UP024, Path::new("UP024_2.py"); "UP024_2")]
#[test_case(RuleCode::UP024, Path::new("UP024_3.py"); "UP024_3")]
#[test_case(RuleCode::UP025, Path::new("UP025.py"); "UP025")] #[test_case(RuleCode::UP025, Path::new("UP025.py"); "UP025")]
#[test_case(RuleCode::UP026, Path::new("UP026.py"); "UP026")] #[test_case(RuleCode::UP026, Path::new("UP026.py"); "UP026")]
#[test_case(RuleCode::UP027, Path::new("UP027.py"); "UP027")] #[test_case(RuleCode::UP027, Path::new("UP027.py"); "UP027")]

View file

@ -1,5 +1,3 @@
#![allow(clippy::len_zero, clippy::needless_pass_by_value)]
use itertools::Itertools; use itertools::Itertools;
use rustpython_ast::{Excepthandler, ExcepthandlerKind, Expr, ExprKind, Located}; use rustpython_ast::{Excepthandler, ExcepthandlerKind, Expr, ExprKind, Located};
@ -13,8 +11,11 @@ use crate::violations;
const ERROR_NAMES: &[&str] = &["EnvironmentError", "IOError", "WindowsError"]; const ERROR_NAMES: &[&str] = &["EnvironmentError", "IOError", "WindowsError"];
const ERROR_MODULES: &[&str] = &["mmap", "select", "socket"]; const ERROR_MODULES: &[&str] = &["mmap", "select", "socket"];
fn get_correct_name(original: &str) -> String { fn corrected_name(checker: &Checker, original: &str) -> String {
if ERROR_NAMES.contains(&original) { if ERROR_NAMES.contains(&original)
&& checker.is_builtin(original)
&& checker.is_builtin("OSError")
{
"OSError".to_string() "OSError".to_string()
} else { } else {
original.to_string() original.to_string()
@ -64,7 +65,7 @@ fn handle_name_or_attribute(
replacements.extend(temp_replacements); replacements.extend(temp_replacements);
before_replace.extend(temp_before_replace); before_replace.extend(temp_before_replace);
if replacements.is_empty() { if replacements.is_empty() {
let new_name = get_correct_name(id); let new_name = corrected_name(checker, id);
replacements.push(new_name); replacements.push(new_name);
before_replace.push(id.to_string()); before_replace.push(id.to_string());
} }
@ -102,7 +103,7 @@ fn handle_except_block(checker: &mut Checker, handler: &Located<ExcepthandlerKin
for elt in elts { for elt in elts {
match &elt.node { match &elt.node {
ExprKind::Name { id, .. } => { ExprKind::Name { id, .. } => {
let new_name = get_correct_name(id); let new_name = corrected_name(checker, id);
replacements.push(new_name); replacements.push(new_name);
} }
ExprKind::Attribute { .. } => { ExprKind::Attribute { .. } => {
@ -138,7 +139,7 @@ fn handle_making_changes(
before_replace: &[String], before_replace: &[String],
replacements: &[String], replacements: &[String],
) { ) {
if before_replace != replacements && replacements.len() > 0 { if before_replace != replacements && !replacements.is_empty() {
let range = Range::new(target.location, target.end_location.unwrap()); let range = Range::new(target.location, target.end_location.unwrap());
let contents = checker.locator.slice_source_code_range(&range); let contents = checker.locator.slice_source_code_range(&range);
// Pyyupgrade does not want imports changed if a module only is // Pyyupgrade does not want imports changed if a module only is
@ -171,8 +172,6 @@ fn handle_making_changes(
} }
} }
// This is a hacky way to handle the different variable types we get since
// raise and try are very different. Would love input on a cleaner way
pub trait OSErrorAliasChecker { pub trait OSErrorAliasChecker {
fn check_error(&self, checker: &mut Checker) fn check_error(&self, checker: &mut Checker)
where where
@ -181,7 +180,6 @@ pub trait OSErrorAliasChecker {
impl OSErrorAliasChecker for &Vec<Excepthandler> { impl OSErrorAliasChecker for &Vec<Excepthandler> {
fn check_error(&self, checker: &mut Checker) { fn check_error(&self, checker: &mut Checker) {
// Each separate except block is a separate error and fix
for handler in self.iter() { for handler in self.iter() {
handle_except_block(checker, handler); handle_except_block(checker, handler);
} }
@ -233,6 +231,6 @@ impl OSErrorAliasChecker for &Expr {
} }
/// UP024 /// UP024
pub fn os_error_alias<U: OSErrorAliasChecker>(checker: &mut Checker, handlers: U) { pub fn os_error_alias<U: OSErrorAliasChecker>(checker: &mut Checker, handlers: &U) {
handlers.check_error(checker); handlers.check_error(checker);
} }

View file

@ -0,0 +1,6 @@
---
source: src/pyupgrade/mod.rs
expression: diagnostics
---
[]