mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-26 11:59:35 +00:00
Implement From
conversion for style detector-to-generator (#1678)
This commit is contained in:
parent
8caa73df6a
commit
fe67a0d239
15 changed files with 38 additions and 116 deletions
|
@ -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(())
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue