mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-27 12:29:28 +00:00
Remove parser dependency from ruff-python-ast (#6096)
This commit is contained in:
parent
99127243f4
commit
2cf00fee96
658 changed files with 1714 additions and 1546 deletions
|
@ -11,13 +11,10 @@
|
|||
//! This module can be used to identify the [`TextRange`] of the `except` token.
|
||||
|
||||
use ruff_text_size::{TextLen, TextRange, TextSize};
|
||||
use rustpython_ast::{Alias, Arg, ArgWithDefault};
|
||||
use rustpython_parser::ast::{self, ExceptHandler, Ranged, Stmt};
|
||||
use rustpython_ast::{self as ast, Alias, Arg, ArgWithDefault, ExceptHandler, Ranged, Stmt};
|
||||
|
||||
use ruff_python_trivia::{is_python_whitespace, Cursor};
|
||||
|
||||
use crate::source_code::Locator;
|
||||
|
||||
pub trait Identifier {
|
||||
/// Return the [`TextRange`] of the identifier in the given AST node.
|
||||
fn identifier(&self) -> TextRange;
|
||||
|
@ -82,14 +79,14 @@ impl Identifier for Alias {
|
|||
}
|
||||
|
||||
/// Return the [`TextRange`] of the `except` token in an [`ExceptHandler`].
|
||||
pub fn except(handler: &ExceptHandler, locator: &Locator) -> TextRange {
|
||||
IdentifierTokenizer::new(locator.contents(), handler.range())
|
||||
pub fn except(handler: &ExceptHandler, source: &str) -> TextRange {
|
||||
IdentifierTokenizer::new(source, handler.range())
|
||||
.next()
|
||||
.expect("Failed to find `except` token in `ExceptHandler`")
|
||||
}
|
||||
|
||||
/// Return the [`TextRange`] of the `else` token in a `For`, `AsyncFor`, or `While` statement.
|
||||
pub fn else_(stmt: &Stmt, locator: &Locator) -> Option<TextRange> {
|
||||
pub fn else_(stmt: &Stmt, source: &str) -> Option<TextRange> {
|
||||
let (Stmt::For(ast::StmtFor { body, orelse, .. })
|
||||
| Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. })
|
||||
| Stmt::While(ast::StmtWhile { body, orelse, .. })) = stmt
|
||||
|
@ -103,7 +100,7 @@ pub fn else_(stmt: &Stmt, locator: &Locator) -> Option<TextRange> {
|
|||
|
||||
IdentifierTokenizer::starts_at(
|
||||
body.last().expect("Expected body to be non-empty").end(),
|
||||
locator.contents(),
|
||||
source,
|
||||
)
|
||||
.next()
|
||||
}
|
||||
|
@ -203,17 +200,15 @@ impl Iterator for IdentifierTokenizer<'_> {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use anyhow::Result;
|
||||
use ruff_text_size::{TextRange, TextSize};
|
||||
use rustpython_ast::{Ranged, Stmt};
|
||||
use rustpython_parser::Parse;
|
||||
use rustpython_parser::{Parse, ParseError};
|
||||
|
||||
use crate::identifier;
|
||||
use crate::identifier::IdentifierTokenizer;
|
||||
use crate::source_code::Locator;
|
||||
|
||||
#[test]
|
||||
fn extract_else_range() -> Result<()> {
|
||||
fn extract_else_range() -> Result<(), ParseError> {
|
||||
let contents = r#"
|
||||
for x in y:
|
||||
pass
|
||||
|
@ -222,8 +217,7 @@ else:
|
|||
"#
|
||||
.trim();
|
||||
let stmt = Stmt::parse(contents, "<filename>")?;
|
||||
let locator = Locator::new(contents);
|
||||
let range = identifier::else_(&stmt, &locator).unwrap();
|
||||
let range = identifier::else_(&stmt, contents).unwrap();
|
||||
assert_eq!(&contents[range], "else");
|
||||
assert_eq!(
|
||||
range,
|
||||
|
@ -233,12 +227,11 @@ else:
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn extract_global_names() -> Result<()> {
|
||||
fn extract_global_names() -> Result<(), ParseError> {
|
||||
let contents = r#"global X,Y, Z"#.trim();
|
||||
let stmt = Stmt::parse(contents, "<filename>")?;
|
||||
let locator = Locator::new(contents);
|
||||
|
||||
let mut names = IdentifierTokenizer::new(locator.contents(), stmt.range());
|
||||
let mut names = IdentifierTokenizer::new(contents, stmt.range());
|
||||
|
||||
let range = names.next_token().unwrap();
|
||||
assert_eq!(&contents[range], "global");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue