mirror of
https://github.com/RustPython/Parser.git
synced 2025-07-08 05:35:22 +00:00
parent
4de0cb1827
commit
531aeb3511
6 changed files with 48 additions and 37 deletions
|
@ -1653,8 +1653,8 @@ impl ToPyAst for ast::StmtPass<TextRange> {
|
|||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
let Self { range: _range } = self;
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
|
||||
Ok(instance)
|
||||
}
|
||||
|
@ -1665,8 +1665,8 @@ impl ToPyAst for ast::StmtBreak<TextRange> {
|
|||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
let Self { range: _range } = self;
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
|
||||
Ok(instance)
|
||||
}
|
||||
|
@ -1677,8 +1677,8 @@ impl ToPyAst for ast::StmtContinue<TextRange> {
|
|||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
let Self { range: _range } = self;
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
|
||||
Ok(instance)
|
||||
}
|
||||
|
@ -3429,8 +3429,8 @@ impl ToPyAst for ast::StmtPass<SourceRange> {
|
|||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
let Self { range: _range } = self;
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
|
||||
let cache = ast_cache();
|
||||
instance.setattr(cache.lineno.as_ref(py), _range.start.row.get())?;
|
||||
|
@ -3449,8 +3449,8 @@ impl ToPyAst for ast::StmtBreak<SourceRange> {
|
|||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
let Self { range: _range } = self;
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
|
||||
let cache = ast_cache();
|
||||
instance.setattr(cache.lineno.as_ref(py), _range.start.row.get())?;
|
||||
|
@ -3469,8 +3469,8 @@ impl ToPyAst for ast::StmtContinue<SourceRange> {
|
|||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
let Self { range: _range } = self;
|
||||
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
|
||||
|
||||
let cache = ast_cache();
|
||||
instance.setattr(cache.lineno.as_ref(py), _range.start.row.get())?;
|
||||
|
|
|
@ -131,6 +131,19 @@ struct AstCache {
|
|||
}
|
||||
|
||||
impl AstCache {
|
||||
// fn location_vec<'py>(&'static self, py: Python<'py>, range: &SourceRange) -> &'py PyDict {
|
||||
// let attributes = PyDict::new(py);
|
||||
// attributes.set_item(self.lineno.as_ref(py), range.start.row.get()).unwrap();
|
||||
// attributes.set_item(self.col_offset.as_ref(py), range.start.column.to_zero_indexed()).unwrap();
|
||||
// if let Some(end) = range.end {
|
||||
// attributes.set_item(self.end_lineno.as_ref(py), end.row.get()).unwrap();
|
||||
// attributes.set_item(
|
||||
// self.end_col_offset.as_ref(py),
|
||||
// end.column.to_zero_indexed(),
|
||||
// ).unwrap();
|
||||
// }
|
||||
// attributes
|
||||
// }
|
||||
#[inline]
|
||||
fn none_ref<'py>(&'static self, py: Python<'py>) -> &'py PyAny {
|
||||
Py::<PyAny>::as_ref(&self.none, py)
|
||||
|
|
|
@ -93,7 +93,7 @@ impl<T: ToPyWrapper> ToPyWrapper for Vec<T> {
|
|||
}
|
||||
}
|
||||
|
||||
#[pyclass(module = "rustpython_ast", subclass)]
|
||||
#[pyclass(module = "rustpython_ast", name = "AST", subclass)]
|
||||
pub struct Ast;
|
||||
|
||||
#[pymethods]
|
||||
|
|
|
@ -1078,11 +1078,6 @@ class ToPyo3AstVisitor(EmitVisitor):
|
|||
else:
|
||||
assert False, self.namespace
|
||||
|
||||
@property
|
||||
def location(self):
|
||||
# lineno, col_offset
|
||||
pass
|
||||
|
||||
def visitModule(self, mod):
|
||||
for dfn in mod.dfns:
|
||||
self.visit(dfn)
|
||||
|
@ -1133,12 +1128,13 @@ class ToPyo3AstVisitor(EmitVisitor):
|
|||
|
||||
def emit_to_pyo3_with_fields(self, cons, type, name):
|
||||
type_info = self.type_info[type.name]
|
||||
|
||||
self.emit(
|
||||
f"""
|
||||
impl ToPyAst for ast::{name}{self.generics} {{
|
||||
#[inline]
|
||||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {{
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {{
|
||||
let cache = Self::py_type_cache().get().unwrap();
|
||||
""",
|
||||
0,
|
||||
)
|
||||
|
@ -1171,12 +1167,7 @@ class ToPyo3AstVisitor(EmitVisitor):
|
|||
3,
|
||||
)
|
||||
continue
|
||||
if field.name in (
|
||||
"lineno",
|
||||
"col_offset",
|
||||
"end_lineno",
|
||||
"end_col_offset",
|
||||
):
|
||||
if field.name == "lineno":
|
||||
self.emit(
|
||||
f"{rust_field(field.name)}.to_u32().to_object(py),",
|
||||
3,
|
||||
|
@ -1192,11 +1183,11 @@ class ToPyo3AstVisitor(EmitVisitor):
|
|||
)
|
||||
else:
|
||||
self.emit(
|
||||
"let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;",
|
||||
"let Self { range: _range } = self;",
|
||||
1,
|
||||
)
|
||||
self.emit(
|
||||
"let Self { range: _range } = self;",
|
||||
"""let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;""",
|
||||
1,
|
||||
)
|
||||
if type.value.attributes and self.namespace == "located":
|
||||
|
@ -1210,7 +1201,7 @@ class ToPyo3AstVisitor(EmitVisitor):
|
|||
instance.setattr(cache.end_col_offset.as_ref(py), end.column.get())?;
|
||||
}
|
||||
""",
|
||||
1,
|
||||
0,
|
||||
)
|
||||
self.emit(
|
||||
"""
|
||||
|
|
|
@ -45,4 +45,21 @@ impl<R> Default for EmptyRange<R> {
|
|||
}
|
||||
}
|
||||
|
||||
impl Cmpop {
|
||||
pub fn as_str(&self) -> &'static str {
|
||||
match self {
|
||||
Cmpop::Eq => "==",
|
||||
Cmpop::NotEq => "!=",
|
||||
Cmpop::Lt => "<",
|
||||
Cmpop::LtE => "<=",
|
||||
Cmpop::Gt => ">",
|
||||
Cmpop::GtE => ">=",
|
||||
Cmpop::Is => "is",
|
||||
Cmpop::IsNot => "is not",
|
||||
Cmpop::In => "in",
|
||||
Cmpop::NotIn => "not in",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
include!("gen/generic.rs");
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use crate::ConversionFlag;
|
||||
use crate::{Arg, Arguments, Boolop, Cmpop, Comprehension, Constant, Expr, Identifier, Operator};
|
||||
use crate::{Arg, Arguments, Boolop, Comprehension, Constant, Expr, Identifier, Operator};
|
||||
use std::fmt;
|
||||
|
||||
mod precedence {
|
||||
|
@ -285,19 +285,9 @@ impl<'a> Unparser<'a> {
|
|||
let new_lvl = precedence::CMP + 1;
|
||||
self.unparse_expr(left, new_lvl)?;
|
||||
for (op, cmp) in ops.iter().zip(comparators) {
|
||||
let op = match op {
|
||||
Cmpop::Eq => " == ",
|
||||
Cmpop::NotEq => " != ",
|
||||
Cmpop::Lt => " < ",
|
||||
Cmpop::LtE => " <= ",
|
||||
Cmpop::Gt => " > ",
|
||||
Cmpop::GtE => " >= ",
|
||||
Cmpop::Is => " is ",
|
||||
Cmpop::IsNot => " is not ",
|
||||
Cmpop::In => " in ",
|
||||
Cmpop::NotIn => " not in ",
|
||||
};
|
||||
self.p(op)?;
|
||||
self.p(" ")?;
|
||||
self.p(op.as_str())?;
|
||||
self.p(" ")?;
|
||||
self.unparse_expr(cmp, new_lvl)?;
|
||||
}
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue