Use Stmt::parse in lieu of Suite unwraps (#5002)

This commit is contained in:
Charlie Marsh 2023-06-10 00:55:31 -04:00 committed by GitHub
parent 42c8054268
commit 445e1723ab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 35 deletions

View file

@ -5,7 +5,6 @@ use std::path::Path;
use itertools::Itertools; use itertools::Itertools;
use log::error; use log::error;
use num_traits::Zero; use num_traits::Zero;
use ruff_python_whitespace::{PythonWhitespace, UniversalNewlineIterator};
use ruff_text_size::{TextRange, TextSize}; use ruff_text_size::{TextRange, TextSize};
use rustc_hash::{FxHashMap, FxHashSet}; use rustc_hash::{FxHashMap, FxHashSet};
use rustpython_parser::ast::{ use rustpython_parser::ast::{
@ -15,6 +14,8 @@ use rustpython_parser::ast::{
use rustpython_parser::{lexer, Mode, Tok}; use rustpython_parser::{lexer, Mode, Tok};
use smallvec::SmallVec; use smallvec::SmallVec;
use ruff_python_whitespace::{PythonWhitespace, UniversalNewlineIterator};
use crate::call_path::CallPath; use crate::call_path::CallPath;
use crate::source_code::{Indexer, Locator}; use crate::source_code::{Indexer, Locator};
use crate::statement_visitor::{walk_body, walk_stmt, StatementVisitor}; use crate::statement_visitor::{walk_body, walk_stmt, StatementVisitor};
@ -1673,11 +1674,10 @@ y = 2
#[test] #[test]
fn extract_identifier_range() -> Result<()> { fn extract_identifier_range() -> Result<()> {
let contents = "def f(): pass".trim(); let contents = "def f(): pass".trim();
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
assert_eq!( assert_eq!(
identifier_range(stmt, &locator), identifier_range(&stmt, &locator),
TextRange::new(TextSize::from(4), TextSize::from(5)) TextRange::new(TextSize::from(4), TextSize::from(5))
); );
@ -1687,29 +1687,26 @@ def \
pass pass
"# "#
.trim(); .trim();
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
assert_eq!( assert_eq!(
identifier_range(stmt, &locator), identifier_range(&stmt, &locator),
TextRange::new(TextSize::from(8), TextSize::from(9)) TextRange::new(TextSize::from(8), TextSize::from(9))
); );
let contents = "class Class(): pass".trim(); let contents = "class Class(): pass".trim();
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
assert_eq!( assert_eq!(
identifier_range(stmt, &locator), identifier_range(&stmt, &locator),
TextRange::new(TextSize::from(6), TextSize::from(11)) TextRange::new(TextSize::from(6), TextSize::from(11))
); );
let contents = "class Class: pass".trim(); let contents = "class Class: pass".trim();
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
assert_eq!( assert_eq!(
identifier_range(stmt, &locator), identifier_range(&stmt, &locator),
TextRange::new(TextSize::from(6), TextSize::from(11)) TextRange::new(TextSize::from(6), TextSize::from(11))
); );
@ -1719,20 +1716,18 @@ class Class():
pass pass
"# "#
.trim(); .trim();
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
assert_eq!( assert_eq!(
identifier_range(stmt, &locator), identifier_range(&stmt, &locator),
TextRange::new(TextSize::from(19), TextSize::from(24)) TextRange::new(TextSize::from(19), TextSize::from(24))
); );
let contents = r#"x = y + 1"#.trim(); let contents = r#"x = y + 1"#.trim();
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
assert_eq!( assert_eq!(
identifier_range(stmt, &locator), identifier_range(&stmt, &locator),
TextRange::new(TextSize::from(0), TextSize::from(9)) TextRange::new(TextSize::from(0), TextSize::from(9))
); );
@ -1785,10 +1780,9 @@ else:
pass pass
"# "#
.trim(); .trim();
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
let range = else_range(stmt, &locator).unwrap(); let range = else_range(&stmt, &locator).unwrap();
assert_eq!(&contents[range], "else"); assert_eq!(&contents[range], "else");
assert_eq!( assert_eq!(
range, range,
@ -1817,9 +1811,8 @@ else:
elif b: elif b:
... ...
"; ";
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap(); let stmt = Stmt::as_if_stmt(&stmt).unwrap();
let stmt = Stmt::as_if_stmt(stmt).unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
let range = elif_else_range(stmt, &locator).unwrap(); let range = elif_else_range(stmt, &locator).unwrap();
assert_eq!(range.start(), TextSize::from(14)); assert_eq!(range.start(), TextSize::from(14));
@ -1830,9 +1823,8 @@ elif b:
else: else:
... ...
"; ";
let program = Suite::parse(contents, "<filename>")?; let stmt = Stmt::parse(contents, "<filename>")?;
let stmt = program.first().unwrap(); let stmt = Stmt::as_if_stmt(&stmt).unwrap();
let stmt = Stmt::as_if_stmt(stmt).unwrap();
let locator = Locator::new(contents); let locator = Locator::new(contents);
let range = elif_else_range(stmt, &locator).unwrap(); let range = elif_else_range(stmt, &locator).unwrap();
assert_eq!(range.start(), TextSize::from(14)); assert_eq!(range.start(), TextSize::from(14));

View file

@ -1456,7 +1456,7 @@ impl<'a> Generator<'a> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use rustpython_ast::Suite; use rustpython_ast::Stmt;
use rustpython_parser::Parse; use rustpython_parser::Parse;
use ruff_python_whitespace::LineEnding; use ruff_python_whitespace::LineEnding;
@ -1468,10 +1468,9 @@ mod tests {
let indentation = Indentation::default(); let indentation = Indentation::default();
let quote = Quote::default(); let quote = Quote::default();
let line_ending = LineEnding::default(); let line_ending = LineEnding::default();
let program = Suite::parse(contents, "<filename>").unwrap(); let stmt = Stmt::parse(contents, "<filename>").unwrap();
let stmt = program.first().unwrap();
let mut generator = Generator::new(&indentation, quote, line_ending); let mut generator = Generator::new(&indentation, quote, line_ending);
generator.unparse_stmt(stmt); generator.unparse_stmt(&stmt);
generator.generate() generator.generate()
} }
@ -1481,10 +1480,9 @@ mod tests {
line_ending: LineEnding, line_ending: LineEnding,
contents: &str, contents: &str,
) -> String { ) -> String {
let program = Suite::parse(contents, "<filename>").unwrap(); let stmt = Stmt::parse(contents, "<filename>").unwrap();
let stmt = program.first().unwrap();
let mut generator = Generator::new(indentation, quote, line_ending); let mut generator = Generator::new(indentation, quote, line_ending);
generator.unparse_stmt(stmt); generator.unparse_stmt(&stmt);
generator.generate() generator.generate()
} }