Implement From conversion for style detector-to-generator (#1678)

This commit is contained in:
Charlie Marsh 2023-01-05 21:47:48 -05:00 committed by GitHub
parent 8caa73df6a
commit fe67a0d239
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 38 additions and 116 deletions

View file

@ -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(())

View file

@ -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(),

View file

@ -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 {

View file

@ -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(),

View file

@ -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(),

View file

@ -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()
}

View file

@ -30,11 +30,7 @@ fn elts_to_csv(elts: &[Expr], checker: &Checker) -> Option<String> {
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(),

View file

@ -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()
}

View file

@ -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 {

View file

@ -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()
}

View file

@ -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(),

View file

@ -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,

View file

@ -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(),

View file

@ -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(),

View file

@ -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 {