diff --git a/ruff_dev/src/round_trip.rs b/ruff_dev/src/round_trip.rs index fe7b9fa3a3..c528e77b5c 100644 --- a/ruff_dev/src/round_trip.rs +++ b/ruff_dev/src/round_trip.rs @@ -22,11 +22,7 @@ pub fn main(cli: &Cli) -> Result<()> { let python_ast = parser::parse_program(&contents, &cli.file.to_string_lossy())?; let locator = SourceCodeLocator::new(&contents); let stylist = SourceCodeStyleDetector::from_contents(&contents, &locator); - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = (&stylist).into(); generator.unparse_suite(&python_ast); println!("{}", generator.generate()); Ok(()) diff --git a/src/flake8_bugbear/plugins/assert_false.rs b/src/flake8_bugbear/plugins/assert_false.rs index d76125ca57..ec643d49a2 100644 --- a/src/flake8_bugbear/plugins/assert_false.rs +++ b/src/flake8_bugbear/plugins/assert_false.rs @@ -47,11 +47,7 @@ pub fn assert_false(checker: &mut Checker, stmt: &Stmt, test: &Expr, msg: Option let mut check = Check::new(CheckKind::DoNotAssertFalse, Range::from_located(test)); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_stmt(&assertion_error(msg)); check.amend(Fix::replacement( generator.generate(), diff --git a/src/flake8_bugbear/plugins/duplicate_exceptions.rs b/src/flake8_bugbear/plugins/duplicate_exceptions.rs index 0d71feab43..9a82d5533e 100644 --- a/src/flake8_bugbear/plugins/duplicate_exceptions.rs +++ b/src/flake8_bugbear/plugins/duplicate_exceptions.rs @@ -54,11 +54,7 @@ fn duplicate_handler_exceptions<'a>( Range::from_located(expr), ); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); if unique_elts.len() == 1 { generator.unparse_expr(unique_elts[0], 0); } else { diff --git a/src/flake8_bugbear/plugins/getattr_with_constant.rs b/src/flake8_bugbear/plugins/getattr_with_constant.rs index f3fdf23d3b..dc504542f1 100644 --- a/src/flake8_bugbear/plugins/getattr_with_constant.rs +++ b/src/flake8_bugbear/plugins/getattr_with_constant.rs @@ -46,11 +46,7 @@ pub fn getattr_with_constant(checker: &mut Checker, expr: &Expr, func: &Expr, ar let mut check = Check::new(CheckKind::GetAttrWithConstant, Range::from_located(expr)); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr(&attribute(obj, value), 0); check.amend(Fix::replacement( generator.generate(), diff --git a/src/flake8_bugbear/plugins/redundant_tuple_in_exception_handler.rs b/src/flake8_bugbear/plugins/redundant_tuple_in_exception_handler.rs index 2a6e28d938..0ea3542339 100644 --- a/src/flake8_bugbear/plugins/redundant_tuple_in_exception_handler.rs +++ b/src/flake8_bugbear/plugins/redundant_tuple_in_exception_handler.rs @@ -23,11 +23,7 @@ pub fn redundant_tuple_in_exception_handler(checker: &mut Checker, handlers: &[E Range::from_located(type_), ); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr(elt, 0); check.amend(Fix::replacement( generator.generate(), diff --git a/src/flake8_bugbear/plugins/setattr_with_constant.rs b/src/flake8_bugbear/plugins/setattr_with_constant.rs index 4354183994..0624729ace 100644 --- a/src/flake8_bugbear/plugins/setattr_with_constant.rs +++ b/src/flake8_bugbear/plugins/setattr_with_constant.rs @@ -27,11 +27,7 @@ fn assignment(obj: &Expr, name: &str, value: &Expr, stylist: &SourceCodeStyleDet type_comment: None, }, ); - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_stmt(&stmt); generator.generate() } diff --git a/src/flake8_pytest_style/plugins/parametrize.rs b/src/flake8_pytest_style/plugins/parametrize.rs index 5e84bd1e88..b51cfe6a36 100644 --- a/src/flake8_pytest_style/plugins/parametrize.rs +++ b/src/flake8_pytest_style/plugins/parametrize.rs @@ -30,11 +30,7 @@ fn elts_to_csv(elts: &[Expr], checker: &Checker) -> Option { return None; } - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr( &create_expr(ExprKind::Constant { value: Constant::Str(elts.iter().fold(String::new(), |mut acc, elt| { @@ -88,11 +84,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) { Range::from_located(expr), ); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr( &create_expr(ExprKind::Tuple { elts: names @@ -122,11 +114,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) { Range::from_located(expr), ); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr( &create_expr(ExprKind::List { elts: names @@ -168,11 +156,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) { Range::from_located(expr), ); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr( &create_expr(ExprKind::List { elts: elts.clone(), @@ -221,11 +205,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) { Range::from_located(expr), ); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr( &create_expr(ExprKind::Tuple { elts: elts.clone(), @@ -303,11 +283,7 @@ fn handle_single_name(checker: &mut Checker, expr: &Expr, value: &Expr) { ); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr(&create_expr(value.node.clone()), 0); check.amend(Fix::replacement( generator.generate(), diff --git a/src/flake8_simplify/plugins/ast_bool_op.rs b/src/flake8_simplify/plugins/ast_bool_op.rs index 62d8e5df83..e25bc08c54 100644 --- a/src/flake8_simplify/plugins/ast_bool_op.rs +++ b/src/flake8_simplify/plugins/ast_bool_op.rs @@ -24,11 +24,7 @@ fn is_same_expr<'a>(a: &'a Expr, b: &'a Expr) -> Option<&'a str> { /// Generate source code from an `Expr`. fn to_source(expr: &Expr, stylist: &SourceCodeStyleDetector) -> String { - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_expr(expr, 0); generator.generate() } diff --git a/src/flake8_simplify/plugins/ast_for.rs b/src/flake8_simplify/plugins/ast_for.rs index c1ea7cdfe2..3309cefc62 100644 --- a/src/flake8_simplify/plugins/ast_for.rs +++ b/src/flake8_simplify/plugins/ast_for.rs @@ -83,11 +83,7 @@ fn return_stmt( iter: &Expr, stylist: &SourceCodeStyleDetector, ) -> String { - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_stmt(&create_stmt(StmtKind::Return { value: Some(Box::new(create_expr(ExprKind::Call { func: Box::new(create_expr(ExprKind::Name { diff --git a/src/pycodestyle/plugins.rs b/src/pycodestyle/plugins.rs index d5ee169201..ec03f83960 100644 --- a/src/pycodestyle/plugins.rs +++ b/src/pycodestyle/plugins.rs @@ -28,11 +28,7 @@ fn compare( comparators: comparators.to_vec(), }, ); - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_expr(&cmp, 0); generator.generate() } @@ -295,11 +291,7 @@ fn function( type_comment: None, }, ); - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_stmt(&func); generator.generate() } diff --git a/src/pyupgrade/plugins/convert_named_tuple_functional_to_class.rs b/src/pyupgrade/plugins/convert_named_tuple_functional_to_class.rs index f636bcfb92..98fa98dd25 100644 --- a/src/pyupgrade/plugins/convert_named_tuple_functional_to_class.rs +++ b/src/pyupgrade/plugins/convert_named_tuple_functional_to_class.rs @@ -166,11 +166,7 @@ fn convert_to_class( base_class: &ExprKind, stylist: &SourceCodeStyleDetector, ) -> Fix { - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_stmt(&create_class_def_stmt(typename, body, base_class)); Fix::replacement( generator.generate(), diff --git a/src/pyupgrade/plugins/convert_typed_dict_functional_to_class.rs b/src/pyupgrade/plugins/convert_typed_dict_functional_to_class.rs index a9e34237f6..842d61328c 100644 --- a/src/pyupgrade/plugins/convert_typed_dict_functional_to_class.rs +++ b/src/pyupgrade/plugins/convert_typed_dict_functional_to_class.rs @@ -199,11 +199,7 @@ fn convert_to_class( base_class: &ExprKind, stylist: &SourceCodeStyleDetector, ) -> Fix { - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_stmt(&create_class_def_stmt( class_name, body, diff --git a/src/pyupgrade/plugins/remove_six_compat.rs b/src/pyupgrade/plugins/remove_six_compat.rs index d257a3df0d..9aed0b2623 100644 --- a/src/pyupgrade/plugins/remove_six_compat.rs +++ b/src/pyupgrade/plugins/remove_six_compat.rs @@ -134,11 +134,7 @@ fn replace_by_expr_kind( ) -> Check { let mut check = Check::new(CheckKind::RemoveSixCompat, Range::from_located(expr)); if patch { - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_expr(&create_expr(node), 0); check.amend(Fix::replacement( generator.generate(), @@ -157,11 +153,7 @@ fn replace_by_stmt_kind( ) -> Check { let mut check = Check::new(CheckKind::RemoveSixCompat, Range::from_located(expr)); if patch { - let mut generator = SourceCodeGenerator::new( - stylist.indentation(), - stylist.quote(), - stylist.line_ending(), - ); + let mut generator: SourceCodeGenerator = stylist.into(); generator.unparse_stmt(&create_stmt(node)); check.amend(Fix::replacement( generator.generate(), diff --git a/src/pyupgrade/plugins/use_pep604_annotation.rs b/src/pyupgrade/plugins/use_pep604_annotation.rs index 27980fa85a..0240c5bfb8 100644 --- a/src/pyupgrade/plugins/use_pep604_annotation.rs +++ b/src/pyupgrade/plugins/use_pep604_annotation.rs @@ -65,11 +65,7 @@ pub fn use_pep604_annotation(checker: &mut Checker, expr: &Expr, value: &Expr, s if checker.match_typing_call_path(&call_path, "Optional") { let mut check = Check::new(CheckKind::UsePEP604Annotation, Range::from_located(expr)); if checker.patch(check.kind.code()) { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr(&optional(slice), 0); check.amend(Fix::replacement( generator.generate(), @@ -86,11 +82,7 @@ pub fn use_pep604_annotation(checker: &mut Checker, expr: &Expr, value: &Expr, s // Invalid type annotation. } ExprKind::Tuple { elts, .. } => { - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr(&union(elts), 0); check.amend(Fix::replacement( generator.generate(), @@ -100,11 +92,7 @@ pub fn use_pep604_annotation(checker: &mut Checker, expr: &Expr, value: &Expr, s } _ => { // Single argument. - let mut generator = SourceCodeGenerator::new( - checker.style.indentation(), - checker.style.quote(), - checker.style.line_ending(), - ); + let mut generator: SourceCodeGenerator = checker.style.into(); generator.unparse_expr(slice, 0); check.amend(Fix::replacement( generator.generate(), diff --git a/src/source_code_generator.rs b/src/source_code_generator.rs index 290968ffec..416c1ea8a3 100644 --- a/src/source_code_generator.rs +++ b/src/source_code_generator.rs @@ -9,7 +9,7 @@ use rustpython_parser::ast::{ Operator, Stmt, StmtKind, }; -use crate::source_code_style::{Indentation, LineEnding, Quote}; +use crate::source_code_style::{Indentation, LineEnding, Quote, SourceCodeStyleDetector}; use crate::vendor::{bytes, str}; mod precedence { @@ -43,6 +43,20 @@ pub struct SourceCodeGenerator<'a> { initial: bool, } +impl<'a> From<&'a SourceCodeStyleDetector<'a>> for SourceCodeGenerator<'a> { + fn from(stylist: &'a SourceCodeStyleDetector<'a>) -> Self { + Self { + indent: stylist.indentation(), + quote: stylist.quote(), + line_ending: stylist.line_ending(), + buffer: Vec::new(), + indent_depth: 0, + num_newlines: 0, + initial: true, + } + } +} + impl<'a> SourceCodeGenerator<'a> { pub fn new(indent: &'a Indentation, quote: &'a Quote, line_ending: &'a LineEnding) -> Self { SourceCodeGenerator {