mirror of
https://github.com/astral-sh/ruff.git
synced 2025-07-24 05:25:17 +00:00
Upgrade RustPython (#4747)
This commit is contained in:
parent
06bcb85f81
commit
6c1ff6a85f
17 changed files with 104 additions and 93 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -2049,7 +2049,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "ruff_text_size"
|
||||
version = "0.0.0"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=335780aeeac1e6fcd85994ba001d7b8ce99fcf65#335780aeeac1e6fcd85994ba001d7b8ce99fcf65"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd#7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd"
|
||||
dependencies = [
|
||||
"schemars",
|
||||
"serde",
|
||||
|
@ -2119,7 +2119,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "rustpython-ast"
|
||||
version = "0.2.0"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=335780aeeac1e6fcd85994ba001d7b8ce99fcf65#335780aeeac1e6fcd85994ba001d7b8ce99fcf65"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd#7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd"
|
||||
dependencies = [
|
||||
"is-macro",
|
||||
"num-bigint",
|
||||
|
@ -2130,7 +2130,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "rustpython-format"
|
||||
version = "0.2.0"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=335780aeeac1e6fcd85994ba001d7b8ce99fcf65#335780aeeac1e6fcd85994ba001d7b8ce99fcf65"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd#7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd"
|
||||
dependencies = [
|
||||
"bitflags 2.3.1",
|
||||
"itertools",
|
||||
|
@ -2142,7 +2142,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "rustpython-literal"
|
||||
version = "0.2.0"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=335780aeeac1e6fcd85994ba001d7b8ce99fcf65#335780aeeac1e6fcd85994ba001d7b8ce99fcf65"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd#7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd"
|
||||
dependencies = [
|
||||
"hexf-parse",
|
||||
"is-macro",
|
||||
|
@ -2154,7 +2154,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "rustpython-parser"
|
||||
version = "0.2.0"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=335780aeeac1e6fcd85994ba001d7b8ce99fcf65#335780aeeac1e6fcd85994ba001d7b8ce99fcf65"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd#7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"is-macro",
|
||||
|
@ -2177,7 +2177,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "rustpython-parser-core"
|
||||
version = "0.2.0"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=335780aeeac1e6fcd85994ba001d7b8ce99fcf65#335780aeeac1e6fcd85994ba001d7b8ce99fcf65"
|
||||
source = "git+https://github.com/astral-sh/RustPython-Parser.git?rev=7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd#7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd"
|
||||
dependencies = [
|
||||
"is-macro",
|
||||
"ruff_text_size",
|
||||
|
|
10
Cargo.toml
10
Cargo.toml
|
@ -34,11 +34,11 @@ proc-macro2 = { version = "1.0.51" }
|
|||
quote = { version = "1.0.23" }
|
||||
regex = { version = "1.7.1" }
|
||||
rustc-hash = { version = "1.1.0" }
|
||||
ruff_text_size = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "335780aeeac1e6fcd85994ba001d7b8ce99fcf65" }
|
||||
rustpython-ast = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "335780aeeac1e6fcd85994ba001d7b8ce99fcf65", default-features = false, features = ["all-nodes-with-ranges"]}
|
||||
rustpython-format = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "335780aeeac1e6fcd85994ba001d7b8ce99fcf65" }
|
||||
rustpython-literal = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "335780aeeac1e6fcd85994ba001d7b8ce99fcf65" }
|
||||
rustpython-parser = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "335780aeeac1e6fcd85994ba001d7b8ce99fcf65", default-features = false, features = ["full-lexer", "all-nodes-with-ranges"] }
|
||||
ruff_text_size = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd" }
|
||||
rustpython-ast = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd", default-features = false, features = ["all-nodes-with-ranges"]}
|
||||
rustpython-format = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd" }
|
||||
rustpython-literal = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd" }
|
||||
rustpython-parser = { git = "https://github.com/astral-sh/RustPython-Parser.git", rev = "7a3eedbf6fb4ea7068a1bf7fe0e97e963ea95ffd", default-features = false, features = ["full-lexer", "all-nodes-with-ranges"] }
|
||||
schemars = { version = "0.8.12" }
|
||||
serde = { version = "1.0.152", features = ["derive"] }
|
||||
serde_json = { version = "1.0.93", features = ["preserve_order"] }
|
||||
|
|
|
@ -424,7 +424,8 @@ pub(crate) fn remove_argument(
|
|||
mod tests {
|
||||
use anyhow::Result;
|
||||
use ruff_text_size::TextSize;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use ruff_python_ast::source_code::Locator;
|
||||
|
||||
|
@ -433,19 +434,19 @@ mod tests {
|
|||
#[test]
|
||||
fn find_semicolon() -> Result<()> {
|
||||
let contents = "x = 1";
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(trailing_semicolon(stmt, &locator), None);
|
||||
|
||||
let contents = "x = 1; y = 1";
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(trailing_semicolon(stmt, &locator), Some(TextSize::from(5)));
|
||||
|
||||
let contents = "x = 1 ; y = 1";
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(trailing_semicolon(stmt, &locator), Some(TextSize::from(6)));
|
||||
|
@ -455,7 +456,7 @@ x = 1 \
|
|||
; y = 1
|
||||
"#
|
||||
.trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(trailing_semicolon(stmt, &locator), Some(TextSize::from(10)));
|
||||
|
|
|
@ -139,8 +139,9 @@ fn match_docstring_end(body: &[Stmt]) -> Option<TextSize> {
|
|||
mod tests {
|
||||
use anyhow::Result;
|
||||
use ruff_text_size::TextSize;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::lexer::LexResult;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use ruff_python_ast::newlines::LineEnding;
|
||||
use ruff_python_ast::source_code::{Locator, Stylist};
|
||||
|
@ -148,7 +149,7 @@ mod tests {
|
|||
use super::Insertion;
|
||||
|
||||
fn insert(contents: &str) -> Result<Insertion> {
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let tokens: Vec<LexResult> = ruff_rustpython::tokenize(contents);
|
||||
let locator = Locator::new(contents);
|
||||
let stylist = Stylist::from_tokens(&tokens, &locator);
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/// See: [eradicate.py](https://github.com/myint/eradicate/blob/98f199940979c94447a461d50d27862b118b282d/eradicate.py)
|
||||
use once_cell::sync::Lazy;
|
||||
use regex::Regex;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
static ALLOWLIST_REGEX: Lazy<Regex> = Lazy::new(|| {
|
||||
Regex::new(
|
||||
|
@ -78,7 +79,7 @@ pub(crate) fn comment_contains_code(line: &str, task_tags: &[String]) -> bool {
|
|||
}
|
||||
|
||||
// Finally, compile the source code.
|
||||
parser::parse_program(&line, "<filename>").is_ok()
|
||||
Suite::parse(&line, "<filename>").is_ok()
|
||||
}
|
||||
|
||||
/// Returns `true` if a line is probably part of some multiline code.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use log::error;
|
||||
use ruff_text_size::{TextRange, TextSize};
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::{self, Stmt, Suite};
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Fix};
|
||||
use ruff_macros::{derive_message_formats, violation};
|
||||
|
@ -140,7 +140,7 @@ pub(crate) fn add_required_imports(
|
|||
.required_imports
|
||||
.iter()
|
||||
.flat_map(|required_import| {
|
||||
let Ok(body) = parser::parse_program(required_import, "<filename>") else {
|
||||
let Ok(body) = Suite::parse(required_import, "<filename>") else {
|
||||
error!("Failed to parse required import: `{}`", required_import);
|
||||
return vec![];
|
||||
};
|
||||
|
|
|
@ -162,7 +162,8 @@ pub(crate) fn function_is_too_complex(
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use anyhow::Result;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use super::get_complexity_number;
|
||||
|
||||
|
@ -172,7 +173,7 @@ mod tests {
|
|||
def trivial():
|
||||
pass
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 1);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -183,7 +184,7 @@ def trivial():
|
|||
def expr_as_statement():
|
||||
0xF00D
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 1);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -196,7 +197,7 @@ def sequential(n):
|
|||
s = k + n
|
||||
return s
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 1);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -212,7 +213,7 @@ def if_elif_else_dead_path(n):
|
|||
else:
|
||||
return "smaller than or equal to three"
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 3);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -229,7 +230,7 @@ def nested_ifs():
|
|||
else:
|
||||
return "smaller than or equal to three"
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 3);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -241,7 +242,7 @@ def for_loop():
|
|||
for i in range(10):
|
||||
print(i)
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -255,7 +256,7 @@ def for_else(mylist):
|
|||
else:
|
||||
print(None)
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -269,7 +270,7 @@ def recursive(n):
|
|||
else:
|
||||
return n
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -286,7 +287,7 @@ def nested_functions():
|
|||
|
||||
a()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 3);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -304,7 +305,7 @@ def try_else():
|
|||
else:
|
||||
print(4)
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 4);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -321,7 +322,7 @@ def nested_try_finally():
|
|||
finally:
|
||||
print(3)
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 1);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -338,7 +339,7 @@ async def foobar(a, b, c):
|
|||
async for x in a:
|
||||
pass
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 3);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -349,7 +350,7 @@ async def foobar(a, b, c):
|
|||
def annotated_assign():
|
||||
x: Any = None
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 1);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -385,7 +386,7 @@ class Class:
|
|||
|
||||
return ServiceProvider(Logger())
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 9);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -399,7 +400,7 @@ def process_detect_lines():
|
|||
finally:
|
||||
pass
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 1);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -414,7 +415,7 @@ def process_detect_lines():
|
|||
if res:
|
||||
errors.append(f"Non-zero exit code {res}")
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -427,7 +428,7 @@ def with_lock():
|
|||
if foo:
|
||||
print('bar')
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(get_complexity_number(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -185,12 +185,13 @@ pub(crate) fn too_many_branches(
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use anyhow::Result;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use super::num_branches;
|
||||
|
||||
fn test_helper(source: &str, expected_num_branches: usize) -> Result<()> {
|
||||
let branches = parser::parse_program(source, "<filename>")?;
|
||||
let branches = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_branches(&branches), expected_num_branches);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -99,12 +99,13 @@ pub(crate) fn too_many_return_statements(
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use anyhow::Result;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use super::num_returns;
|
||||
|
||||
fn test_helper(source: &str, expected: usize) -> Result<()> {
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_returns(&stmts), expected);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -168,7 +168,8 @@ pub(crate) fn too_many_statements(
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use anyhow::Result;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use super::num_statements;
|
||||
|
||||
|
@ -178,7 +179,7 @@ mod tests {
|
|||
def f(): # 2
|
||||
pass
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -192,7 +193,7 @@ def f():
|
|||
else:
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 5);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -207,7 +208,7 @@ def f():
|
|||
if a:
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 5);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -221,7 +222,7 @@ def f(): # 5
|
|||
elif a:
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 5);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -239,7 +240,7 @@ def f(): # 9
|
|||
else:
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 9);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -268,7 +269,7 @@ async def f(): # 19
|
|||
import time
|
||||
pass
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 19);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -280,7 +281,7 @@ def f(): # 2
|
|||
for i in range(10):
|
||||
pass
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -294,7 +295,7 @@ def f(): # 3
|
|||
else:
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 3);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -309,7 +310,7 @@ def f(): # 5
|
|||
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 5);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -327,7 +328,7 @@ def f(): # 3
|
|||
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 3);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -338,7 +339,7 @@ def f(): # 3
|
|||
def f():
|
||||
return
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 1);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -354,7 +355,7 @@ def f(): # 6
|
|||
print()
|
||||
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 6);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -368,7 +369,7 @@ def f(): # 5
|
|||
except Exception:
|
||||
raise
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 5);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -384,7 +385,7 @@ def f(): # 7
|
|||
else:
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 7);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -402,7 +403,7 @@ def f(): # 10
|
|||
finally:
|
||||
pass
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 10);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -418,7 +419,7 @@ def f(): # 8
|
|||
except Exception:
|
||||
raise
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 8);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -436,7 +437,7 @@ def f(): # 11
|
|||
finally:
|
||||
print()
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 11);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -448,7 +449,7 @@ def f(): # 2
|
|||
for i in range(10):
|
||||
yield i
|
||||
"#;
|
||||
let stmts = parser::parse_program(source, "<filename>")?;
|
||||
let stmts = Suite::parse(source, "<filename>")?;
|
||||
assert_eq!(num_statements(&stmts), 2);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -2,10 +2,10 @@ use std::time::Duration;
|
|||
|
||||
use criterion::measurement::WallTime;
|
||||
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
|
||||
use rustpython_parser::ast::Stmt;
|
||||
|
||||
use ruff_benchmark::{TestCase, TestCaseSpeed, TestFile, TestFileDownloadError};
|
||||
use ruff_python_ast::statement_visitor::{walk_stmt, StatementVisitor};
|
||||
use rustpython_parser::ast::{Stmt, Suite};
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
#[global_allocator]
|
||||
|
@ -66,8 +66,7 @@ fn benchmark_parser(criterion: &mut Criterion<WallTime>) {
|
|||
&case,
|
||||
|b, case| {
|
||||
b.iter(|| {
|
||||
let parsed =
|
||||
rustpython_parser::parse_program(case.code(), case.name()).unwrap();
|
||||
let parsed = Suite::parse(case.code(), case.name()).unwrap();
|
||||
|
||||
let mut visitor = CountVisitor { count: 0 };
|
||||
visitor.visit_body(&parsed);
|
||||
|
|
|
@ -5,7 +5,8 @@ use std::fs;
|
|||
use std::path::PathBuf;
|
||||
|
||||
use anyhow::Result;
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
#[derive(clap::Args)]
|
||||
pub(crate) struct Args {
|
||||
|
@ -16,7 +17,7 @@ pub(crate) struct Args {
|
|||
|
||||
pub(crate) fn main(args: &Args) -> Result<()> {
|
||||
let contents = fs::read_to_string(&args.file)?;
|
||||
let python_ast = parser::parse_program(&contents, &args.file.to_string_lossy())?;
|
||||
let python_ast = Suite::parse(&contents, &args.file.to_string_lossy())?;
|
||||
println!("{python_ast:#?}");
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -1596,8 +1596,9 @@ mod tests {
|
|||
|
||||
use anyhow::Result;
|
||||
use ruff_text_size::{TextLen, TextRange, TextSize};
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_ast::Suite;
|
||||
use rustpython_parser::ast::Cmpop;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use crate::helpers::{
|
||||
elif_else_range, else_range, first_colon_range, has_trailing_content, identifier_range,
|
||||
|
@ -1608,25 +1609,25 @@ mod tests {
|
|||
#[test]
|
||||
fn trailing_content() -> Result<()> {
|
||||
let contents = "x = 1";
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert!(!has_trailing_content(stmt, &locator));
|
||||
|
||||
let contents = "x = 1; y = 2";
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert!(has_trailing_content(stmt, &locator));
|
||||
|
||||
let contents = "x = 1 ";
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert!(!has_trailing_content(stmt, &locator));
|
||||
|
||||
let contents = "x = 1 # Comment";
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert!(!has_trailing_content(stmt, &locator));
|
||||
|
@ -1636,7 +1637,7 @@ x = 1
|
|||
y = 2
|
||||
"#
|
||||
.trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert!(!has_trailing_content(stmt, &locator));
|
||||
|
@ -1647,7 +1648,7 @@ y = 2
|
|||
#[test]
|
||||
fn extract_identifier_range() -> Result<()> {
|
||||
let contents = "def f(): pass".trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(
|
||||
|
@ -1661,7 +1662,7 @@ def \
|
|||
pass
|
||||
"#
|
||||
.trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(
|
||||
|
@ -1670,7 +1671,7 @@ def \
|
|||
);
|
||||
|
||||
let contents = "class Class(): pass".trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(
|
||||
|
@ -1679,7 +1680,7 @@ def \
|
|||
);
|
||||
|
||||
let contents = "class Class: pass".trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(
|
||||
|
@ -1693,7 +1694,7 @@ class Class():
|
|||
pass
|
||||
"#
|
||||
.trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(
|
||||
|
@ -1702,7 +1703,7 @@ class Class():
|
|||
);
|
||||
|
||||
let contents = r#"x = y + 1"#.trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
assert_eq!(
|
||||
|
@ -1759,7 +1760,7 @@ else:
|
|||
pass
|
||||
"#
|
||||
.trim();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
let range = else_range(stmt, &locator).unwrap();
|
||||
|
@ -1793,7 +1794,7 @@ elif b:
|
|||
...
|
||||
"
|
||||
.trim_start();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
let range = elif_else_range(stmt, &locator).unwrap();
|
||||
|
@ -1807,7 +1808,7 @@ else:
|
|||
...
|
||||
"
|
||||
.trim_start();
|
||||
let program = parser::parse_program(contents, "<filename>")?;
|
||||
let program = Suite::parse(contents, "<filename>")?;
|
||||
let stmt = program.first().unwrap();
|
||||
let locator = Locator::new(contents);
|
||||
let range = elif_else_range(stmt, &locator).unwrap();
|
||||
|
|
|
@ -1456,7 +1456,8 @@ impl<'a> Generator<'a> {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_ast::Suite;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use crate::newlines::LineEnding;
|
||||
use crate::source_code::stylist::{Indentation, Quote};
|
||||
|
@ -1466,7 +1467,7 @@ mod tests {
|
|||
let indentation = Indentation::default();
|
||||
let quote = Quote::default();
|
||||
let line_ending = LineEnding::default();
|
||||
let program = parser::parse_program(contents, "<filename>").unwrap();
|
||||
let program = Suite::parse(contents, "<filename>").unwrap();
|
||||
let stmt = program.first().unwrap();
|
||||
let mut generator = Generator::new(&indentation, quote, line_ending);
|
||||
generator.unparse_stmt(stmt);
|
||||
|
@ -1479,7 +1480,7 @@ mod tests {
|
|||
line_ending: LineEnding,
|
||||
contents: &str,
|
||||
) -> String {
|
||||
let program = parser::parse_program(contents, "<filename>").unwrap();
|
||||
let program = Suite::parse(contents, "<filename>").unwrap();
|
||||
let stmt = program.first().unwrap();
|
||||
let mut generator = Generator::new(indentation, quote, line_ending);
|
||||
generator.unparse_stmt(stmt);
|
||||
|
|
|
@ -3,8 +3,7 @@ use std::fmt::{Debug, Formatter};
|
|||
use std::sync::Arc;
|
||||
|
||||
use ruff_text_size::{TextRange, TextSize};
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::{lexer, Mode, ParseError};
|
||||
use rustpython_parser::{ast, lexer, Mode, Parse, ParseError};
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
|
@ -26,7 +25,7 @@ mod stylist;
|
|||
/// Run round-trip source code generation on a given Python code.
|
||||
pub fn round_trip(code: &str, source_path: &str) -> Result<String, ParseError> {
|
||||
let locator = Locator::new(code);
|
||||
let python_ast = parser::parse_program(code, source_path)?;
|
||||
let python_ast = ast::Suite::parse(code, source_path)?;
|
||||
let tokens: Vec<_> = lexer::lex(code, Mode::Module).collect();
|
||||
let stylist = Stylist::from_tokens(&tokens, &locator);
|
||||
let mut generator: Generator = (&stylist).into();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use anyhow::Result;
|
||||
use ruff_text_size::{TextLen, TextRange};
|
||||
use rustpython_parser as parser;
|
||||
use rustpython_parser::ast::Expr;
|
||||
use rustpython_parser::Parse;
|
||||
|
||||
use crate::relocate::relocate_expr;
|
||||
use crate::source_code::Locator;
|
||||
|
@ -35,7 +35,7 @@ pub fn parse_type_annotation(
|
|||
// isn't the case, e.g., for implicit concatenations, or for annotations that contain
|
||||
// escaped quotes.
|
||||
let leading_quote = str::leading_quote(expression).unwrap();
|
||||
let expr = parser::parse_expression_starts_at(
|
||||
let expr = Expr::parse_starts_at(
|
||||
value,
|
||||
"<filename>",
|
||||
range.start() + leading_quote.text_len(),
|
||||
|
@ -43,7 +43,7 @@ pub fn parse_type_annotation(
|
|||
Ok((expr, AnnotationKind::Simple))
|
||||
} else {
|
||||
// Otherwise, consider this a "complex" annotation.
|
||||
let mut expr = parser::parse_expression(value, "<filename>")?;
|
||||
let mut expr = Expr::parse(value, "<filename>")?;
|
||||
relocate_expr(&mut expr, range);
|
||||
Ok((expr, AnnotationKind::Complex))
|
||||
}
|
||||
|
|
|
@ -214,6 +214,7 @@ break;
|
|||
continue_statement.as_ref().into(),
|
||||
SourceComment {
|
||||
slice: source_code.slice(TextRange::at(TextSize::new(0), TextSize::new(17))),
|
||||
#[cfg(debug_assertions)]
|
||||
formatted: Cell::new(false),
|
||||
position: CommentTextPosition::OwnLine,
|
||||
},
|
||||
|
@ -223,6 +224,7 @@ break;
|
|||
continue_statement.as_ref().into(),
|
||||
SourceComment {
|
||||
slice: source_code.slice(TextRange::at(TextSize::new(28), TextSize::new(10))),
|
||||
#[cfg(debug_assertions)]
|
||||
formatted: Cell::new(false),
|
||||
position: CommentTextPosition::EndOfLine,
|
||||
},
|
||||
|
@ -232,6 +234,7 @@ break;
|
|||
break_statement.as_ref().into(),
|
||||
SourceComment {
|
||||
slice: source_code.slice(TextRange::at(TextSize::new(39), TextSize::new(15))),
|
||||
#[cfg(debug_assertions)]
|
||||
formatted: Cell::new(false),
|
||||
position: CommentTextPosition::OwnLine,
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue