Skip to content

Commit fe67a0d

Browse files
Implement From conversion for style detector-to-generator (#1678)
1 parent 8caa73d commit fe67a0d

15 files changed

+38
-116
lines changed

ruff_dev/src/round_trip.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,7 @@ pub fn main(cli: &Cli) -> Result<()> {
2222
let python_ast = parser::parse_program(&contents, &cli.file.to_string_lossy())?;
2323
let locator = SourceCodeLocator::new(&contents);
2424
let stylist = SourceCodeStyleDetector::from_contents(&contents, &locator);
25-
let mut generator = SourceCodeGenerator::new(
26-
stylist.indentation(),
27-
stylist.quote(),
28-
stylist.line_ending(),
29-
);
25+
let mut generator: SourceCodeGenerator = (&stylist).into();
3026
generator.unparse_suite(&python_ast);
3127
println!("{}", generator.generate());
3228
Ok(())

src/flake8_bugbear/plugins/assert_false.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,7 @@ pub fn assert_false(checker: &mut Checker, stmt: &Stmt, test: &Expr, msg: Option
4747

4848
let mut check = Check::new(CheckKind::DoNotAssertFalse, Range::from_located(test));
4949
if checker.patch(check.kind.code()) {
50-
let mut generator = SourceCodeGenerator::new(
51-
checker.style.indentation(),
52-
checker.style.quote(),
53-
checker.style.line_ending(),
54-
);
50+
let mut generator: SourceCodeGenerator = checker.style.into();
5551
generator.unparse_stmt(&assertion_error(msg));
5652
check.amend(Fix::replacement(
5753
generator.generate(),

src/flake8_bugbear/plugins/duplicate_exceptions.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,7 @@ fn duplicate_handler_exceptions<'a>(
5454
Range::from_located(expr),
5555
);
5656
if checker.patch(check.kind.code()) {
57-
let mut generator = SourceCodeGenerator::new(
58-
checker.style.indentation(),
59-
checker.style.quote(),
60-
checker.style.line_ending(),
61-
);
57+
let mut generator: SourceCodeGenerator = checker.style.into();
6258
if unique_elts.len() == 1 {
6359
generator.unparse_expr(unique_elts[0], 0);
6460
} else {

src/flake8_bugbear/plugins/getattr_with_constant.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,7 @@ pub fn getattr_with_constant(checker: &mut Checker, expr: &Expr, func: &Expr, ar
4646

4747
let mut check = Check::new(CheckKind::GetAttrWithConstant, Range::from_located(expr));
4848
if checker.patch(check.kind.code()) {
49-
let mut generator = SourceCodeGenerator::new(
50-
checker.style.indentation(),
51-
checker.style.quote(),
52-
checker.style.line_ending(),
53-
);
49+
let mut generator: SourceCodeGenerator = checker.style.into();
5450
generator.unparse_expr(&attribute(obj, value), 0);
5551
check.amend(Fix::replacement(
5652
generator.generate(),

src/flake8_bugbear/plugins/redundant_tuple_in_exception_handler.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,7 @@ pub fn redundant_tuple_in_exception_handler(checker: &mut Checker, handlers: &[E
2323
Range::from_located(type_),
2424
);
2525
if checker.patch(check.kind.code()) {
26-
let mut generator = SourceCodeGenerator::new(
27-
checker.style.indentation(),
28-
checker.style.quote(),
29-
checker.style.line_ending(),
30-
);
26+
let mut generator: SourceCodeGenerator = checker.style.into();
3127
generator.unparse_expr(elt, 0);
3228
check.amend(Fix::replacement(
3329
generator.generate(),

src/flake8_bugbear/plugins/setattr_with_constant.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ fn assignment(obj: &Expr, name: &str, value: &Expr, stylist: &SourceCodeStyleDet
2727
type_comment: None,
2828
},
2929
);
30-
let mut generator = SourceCodeGenerator::new(
31-
stylist.indentation(),
32-
stylist.quote(),
33-
stylist.line_ending(),
34-
);
30+
let mut generator: SourceCodeGenerator = stylist.into();
3531
generator.unparse_stmt(&stmt);
3632
generator.generate()
3733
}

src/flake8_pytest_style/plugins/parametrize.rs

+6-30
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,7 @@ fn elts_to_csv(elts: &[Expr], checker: &Checker) -> Option<String> {
3030
return None;
3131
}
3232

33-
let mut generator = SourceCodeGenerator::new(
34-
checker.style.indentation(),
35-
checker.style.quote(),
36-
checker.style.line_ending(),
37-
);
33+
let mut generator: SourceCodeGenerator = checker.style.into();
3834
generator.unparse_expr(
3935
&create_expr(ExprKind::Constant {
4036
value: Constant::Str(elts.iter().fold(String::new(), |mut acc, elt| {
@@ -88,11 +84,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) {
8884
Range::from_located(expr),
8985
);
9086
if checker.patch(check.kind.code()) {
91-
let mut generator = SourceCodeGenerator::new(
92-
checker.style.indentation(),
93-
checker.style.quote(),
94-
checker.style.line_ending(),
95-
);
87+
let mut generator: SourceCodeGenerator = checker.style.into();
9688
generator.unparse_expr(
9789
&create_expr(ExprKind::Tuple {
9890
elts: names
@@ -122,11 +114,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) {
122114
Range::from_located(expr),
123115
);
124116
if checker.patch(check.kind.code()) {
125-
let mut generator = SourceCodeGenerator::new(
126-
checker.style.indentation(),
127-
checker.style.quote(),
128-
checker.style.line_ending(),
129-
);
117+
let mut generator: SourceCodeGenerator = checker.style.into();
130118
generator.unparse_expr(
131119
&create_expr(ExprKind::List {
132120
elts: names
@@ -168,11 +156,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) {
168156
Range::from_located(expr),
169157
);
170158
if checker.patch(check.kind.code()) {
171-
let mut generator = SourceCodeGenerator::new(
172-
checker.style.indentation(),
173-
checker.style.quote(),
174-
checker.style.line_ending(),
175-
);
159+
let mut generator: SourceCodeGenerator = checker.style.into();
176160
generator.unparse_expr(
177161
&create_expr(ExprKind::List {
178162
elts: elts.clone(),
@@ -221,11 +205,7 @@ fn check_names(checker: &mut Checker, expr: &Expr) {
221205
Range::from_located(expr),
222206
);
223207
if checker.patch(check.kind.code()) {
224-
let mut generator = SourceCodeGenerator::new(
225-
checker.style.indentation(),
226-
checker.style.quote(),
227-
checker.style.line_ending(),
228-
);
208+
let mut generator: SourceCodeGenerator = checker.style.into();
229209
generator.unparse_expr(
230210
&create_expr(ExprKind::Tuple {
231211
elts: elts.clone(),
@@ -303,11 +283,7 @@ fn handle_single_name(checker: &mut Checker, expr: &Expr, value: &Expr) {
303283
);
304284

305285
if checker.patch(check.kind.code()) {
306-
let mut generator = SourceCodeGenerator::new(
307-
checker.style.indentation(),
308-
checker.style.quote(),
309-
checker.style.line_ending(),
310-
);
286+
let mut generator: SourceCodeGenerator = checker.style.into();
311287
generator.unparse_expr(&create_expr(value.node.clone()), 0);
312288
check.amend(Fix::replacement(
313289
generator.generate(),

src/flake8_simplify/plugins/ast_bool_op.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@ fn is_same_expr<'a>(a: &'a Expr, b: &'a Expr) -> Option<&'a str> {
2424

2525
/// Generate source code from an `Expr`.
2626
fn to_source(expr: &Expr, stylist: &SourceCodeStyleDetector) -> String {
27-
let mut generator = SourceCodeGenerator::new(
28-
stylist.indentation(),
29-
stylist.quote(),
30-
stylist.line_ending(),
31-
);
27+
let mut generator: SourceCodeGenerator = stylist.into();
3228
generator.unparse_expr(expr, 0);
3329
generator.generate()
3430
}

src/flake8_simplify/plugins/ast_for.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ fn return_stmt(
8383
iter: &Expr,
8484
stylist: &SourceCodeStyleDetector,
8585
) -> String {
86-
let mut generator = SourceCodeGenerator::new(
87-
stylist.indentation(),
88-
stylist.quote(),
89-
stylist.line_ending(),
90-
);
86+
let mut generator: SourceCodeGenerator = stylist.into();
9187
generator.unparse_stmt(&create_stmt(StmtKind::Return {
9288
value: Some(Box::new(create_expr(ExprKind::Call {
9389
func: Box::new(create_expr(ExprKind::Name {

src/pycodestyle/plugins.rs

+2-10
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,7 @@ fn compare(
2828
comparators: comparators.to_vec(),
2929
},
3030
);
31-
let mut generator = SourceCodeGenerator::new(
32-
stylist.indentation(),
33-
stylist.quote(),
34-
stylist.line_ending(),
35-
);
31+
let mut generator: SourceCodeGenerator = stylist.into();
3632
generator.unparse_expr(&cmp, 0);
3733
generator.generate()
3834
}
@@ -295,11 +291,7 @@ fn function(
295291
type_comment: None,
296292
},
297293
);
298-
let mut generator = SourceCodeGenerator::new(
299-
stylist.indentation(),
300-
stylist.quote(),
301-
stylist.line_ending(),
302-
);
294+
let mut generator: SourceCodeGenerator = stylist.into();
303295
generator.unparse_stmt(&func);
304296
generator.generate()
305297
}

src/pyupgrade/plugins/convert_named_tuple_functional_to_class.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,7 @@ fn convert_to_class(
166166
base_class: &ExprKind,
167167
stylist: &SourceCodeStyleDetector,
168168
) -> Fix {
169-
let mut generator = SourceCodeGenerator::new(
170-
stylist.indentation(),
171-
stylist.quote(),
172-
stylist.line_ending(),
173-
);
169+
let mut generator: SourceCodeGenerator = stylist.into();
174170
generator.unparse_stmt(&create_class_def_stmt(typename, body, base_class));
175171
Fix::replacement(
176172
generator.generate(),

src/pyupgrade/plugins/convert_typed_dict_functional_to_class.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,7 @@ fn convert_to_class(
199199
base_class: &ExprKind,
200200
stylist: &SourceCodeStyleDetector,
201201
) -> Fix {
202-
let mut generator = SourceCodeGenerator::new(
203-
stylist.indentation(),
204-
stylist.quote(),
205-
stylist.line_ending(),
206-
);
202+
let mut generator: SourceCodeGenerator = stylist.into();
207203
generator.unparse_stmt(&create_class_def_stmt(
208204
class_name,
209205
body,

src/pyupgrade/plugins/remove_six_compat.rs

+2-10
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,7 @@ fn replace_by_expr_kind(
134134
) -> Check {
135135
let mut check = Check::new(CheckKind::RemoveSixCompat, Range::from_located(expr));
136136
if patch {
137-
let mut generator = SourceCodeGenerator::new(
138-
stylist.indentation(),
139-
stylist.quote(),
140-
stylist.line_ending(),
141-
);
137+
let mut generator: SourceCodeGenerator = stylist.into();
142138
generator.unparse_expr(&create_expr(node), 0);
143139
check.amend(Fix::replacement(
144140
generator.generate(),
@@ -157,11 +153,7 @@ fn replace_by_stmt_kind(
157153
) -> Check {
158154
let mut check = Check::new(CheckKind::RemoveSixCompat, Range::from_located(expr));
159155
if patch {
160-
let mut generator = SourceCodeGenerator::new(
161-
stylist.indentation(),
162-
stylist.quote(),
163-
stylist.line_ending(),
164-
);
156+
let mut generator: SourceCodeGenerator = stylist.into();
165157
generator.unparse_stmt(&create_stmt(node));
166158
check.amend(Fix::replacement(
167159
generator.generate(),

src/pyupgrade/plugins/use_pep604_annotation.rs

+3-15
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,7 @@ pub fn use_pep604_annotation(checker: &mut Checker, expr: &Expr, value: &Expr, s
6565
if checker.match_typing_call_path(&call_path, "Optional") {
6666
let mut check = Check::new(CheckKind::UsePEP604Annotation, Range::from_located(expr));
6767
if checker.patch(check.kind.code()) {
68-
let mut generator = SourceCodeGenerator::new(
69-
checker.style.indentation(),
70-
checker.style.quote(),
71-
checker.style.line_ending(),
72-
);
68+
let mut generator: SourceCodeGenerator = checker.style.into();
7369
generator.unparse_expr(&optional(slice), 0);
7470
check.amend(Fix::replacement(
7571
generator.generate(),
@@ -86,11 +82,7 @@ pub fn use_pep604_annotation(checker: &mut Checker, expr: &Expr, value: &Expr, s
8682
// Invalid type annotation.
8783
}
8884
ExprKind::Tuple { elts, .. } => {
89-
let mut generator = SourceCodeGenerator::new(
90-
checker.style.indentation(),
91-
checker.style.quote(),
92-
checker.style.line_ending(),
93-
);
85+
let mut generator: SourceCodeGenerator = checker.style.into();
9486
generator.unparse_expr(&union(elts), 0);
9587
check.amend(Fix::replacement(
9688
generator.generate(),
@@ -100,11 +92,7 @@ pub fn use_pep604_annotation(checker: &mut Checker, expr: &Expr, value: &Expr, s
10092
}
10193
_ => {
10294
// Single argument.
103-
let mut generator = SourceCodeGenerator::new(
104-
checker.style.indentation(),
105-
checker.style.quote(),
106-
checker.style.line_ending(),
107-
);
95+
let mut generator: SourceCodeGenerator = checker.style.into();
10896
generator.unparse_expr(slice, 0);
10997
check.amend(Fix::replacement(
11098
generator.generate(),

src/source_code_generator.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustpython_parser::ast::{
99
Operator, Stmt, StmtKind,
1010
};
1111

12-
use crate::source_code_style::{Indentation, LineEnding, Quote};
12+
use crate::source_code_style::{Indentation, LineEnding, Quote, SourceCodeStyleDetector};
1313
use crate::vendor::{bytes, str};
1414

1515
mod precedence {
@@ -43,6 +43,20 @@ pub struct SourceCodeGenerator<'a> {
4343
initial: bool,
4444
}
4545

46+
impl<'a> From<&'a SourceCodeStyleDetector<'a>> for SourceCodeGenerator<'a> {
47+
fn from(stylist: &'a SourceCodeStyleDetector<'a>) -> Self {
48+
Self {
49+
indent: stylist.indentation(),
50+
quote: stylist.quote(),
51+
line_ending: stylist.line_ending(),
52+
buffer: Vec::new(),
53+
indent_depth: 0,
54+
num_newlines: 0,
55+
initial: true,
56+
}
57+
}
58+
}
59+
4660
impl<'a> SourceCodeGenerator<'a> {
4761
pub fn new(indent: &'a Indentation, quote: &'a Quote, line_ending: &'a LineEnding) -> Self {
4862
SourceCodeGenerator {

0 commit comments

Comments
 (0)