Cmpop::as_str (#72)

* clean up pyo3 generation

* Cmpop::as_str
This commit is contained in:
Jeong, YunWon 2023-05-29 01:53:54 +09:00 committed by GitHub
parent 4de0cb1827
commit 531aeb3511
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 48 additions and 37 deletions

View file

@ -1653,8 +1653,8 @@ impl ToPyAst for ast::StmtPass<TextRange> {
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> { fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
let cache = Self::py_type_cache().get().unwrap(); let cache = Self::py_type_cache().get().unwrap();
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let Self { range: _range } = self; let Self { range: _range } = self;
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
Ok(instance) Ok(instance)
} }
@ -1665,8 +1665,8 @@ impl ToPyAst for ast::StmtBreak<TextRange> {
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> { fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
let cache = Self::py_type_cache().get().unwrap(); let cache = Self::py_type_cache().get().unwrap();
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let Self { range: _range } = self; let Self { range: _range } = self;
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
Ok(instance) Ok(instance)
} }
@ -1677,8 +1677,8 @@ impl ToPyAst for ast::StmtContinue<TextRange> {
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> { fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
let cache = Self::py_type_cache().get().unwrap(); let cache = Self::py_type_cache().get().unwrap();
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let Self { range: _range } = self; let Self { range: _range } = self;
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
Ok(instance) Ok(instance)
} }
@ -3429,8 +3429,8 @@ impl ToPyAst for ast::StmtPass<SourceRange> {
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> { fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
let cache = Self::py_type_cache().get().unwrap(); let cache = Self::py_type_cache().get().unwrap();
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let Self { range: _range } = self; let Self { range: _range } = self;
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let cache = ast_cache(); let cache = ast_cache();
instance.setattr(cache.lineno.as_ref(py), _range.start.row.get())?; 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> { fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
let cache = Self::py_type_cache().get().unwrap(); let cache = Self::py_type_cache().get().unwrap();
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let Self { range: _range } = self; let Self { range: _range } = self;
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let cache = ast_cache(); let cache = ast_cache();
instance.setattr(cache.lineno.as_ref(py), _range.start.row.get())?; 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> { fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {
let cache = Self::py_type_cache().get().unwrap(); let cache = Self::py_type_cache().get().unwrap();
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let Self { range: _range } = self; let Self { range: _range } = self;
let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;
let cache = ast_cache(); let cache = ast_cache();
instance.setattr(cache.lineno.as_ref(py), _range.start.row.get())?; instance.setattr(cache.lineno.as_ref(py), _range.start.row.get())?;

View file

@ -131,6 +131,19 @@ struct AstCache {
} }
impl 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] #[inline]
fn none_ref<'py>(&'static self, py: Python<'py>) -> &'py PyAny { fn none_ref<'py>(&'static self, py: Python<'py>) -> &'py PyAny {
Py::<PyAny>::as_ref(&self.none, py) Py::<PyAny>::as_ref(&self.none, py)

View file

@ -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; pub struct Ast;
#[pymethods] #[pymethods]

View file

@ -1078,11 +1078,6 @@ class ToPyo3AstVisitor(EmitVisitor):
else: else:
assert False, self.namespace assert False, self.namespace
@property
def location(self):
# lineno, col_offset
pass
def visitModule(self, mod): def visitModule(self, mod):
for dfn in mod.dfns: for dfn in mod.dfns:
self.visit(dfn) self.visit(dfn)
@ -1133,12 +1128,13 @@ class ToPyo3AstVisitor(EmitVisitor):
def emit_to_pyo3_with_fields(self, cons, type, name): def emit_to_pyo3_with_fields(self, cons, type, name):
type_info = self.type_info[type.name] type_info = self.type_info[type.name]
self.emit( self.emit(
f""" f"""
impl ToPyAst for ast::{name}{self.generics} {{ impl ToPyAst for ast::{name}{self.generics} {{
#[inline] #[inline]
fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {{ fn to_py_ast<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {{
let cache = Self::py_type_cache().get().unwrap(); let cache = Self::py_type_cache().get().unwrap();
""", """,
0, 0,
) )
@ -1171,12 +1167,7 @@ class ToPyo3AstVisitor(EmitVisitor):
3, 3,
) )
continue continue
if field.name in ( if field.name == "lineno":
"lineno",
"col_offset",
"end_lineno",
"end_col_offset",
):
self.emit( self.emit(
f"{rust_field(field.name)}.to_u32().to_object(py),", f"{rust_field(field.name)}.to_u32().to_object(py),",
3, 3,
@ -1192,11 +1183,11 @@ class ToPyo3AstVisitor(EmitVisitor):
) )
else: else:
self.emit( self.emit(
"let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;", "let Self { range: _range } = self;",
1, 1,
) )
self.emit( self.emit(
"let Self { range: _range } = self;", """let instance = Py::<PyAny>::as_ref(&cache.0, py).call0()?;""",
1, 1,
) )
if type.value.attributes and self.namespace == "located": 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())?; instance.setattr(cache.end_col_offset.as_ref(py), end.column.get())?;
} }
""", """,
1, 0,
) )
self.emit( self.emit(
""" """

View file

@ -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"); include!("gen/generic.rs");

View file

@ -1,5 +1,5 @@
use crate::ConversionFlag; 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; use std::fmt;
mod precedence { mod precedence {
@ -285,19 +285,9 @@ impl<'a> Unparser<'a> {
let new_lvl = precedence::CMP + 1; let new_lvl = precedence::CMP + 1;
self.unparse_expr(left, new_lvl)?; self.unparse_expr(left, new_lvl)?;
for (op, cmp) in ops.iter().zip(comparators) { for (op, cmp) in ops.iter().zip(comparators) {
let op = match op { self.p(" ")?;
Cmpop::Eq => " == ", self.p(op.as_str())?;
Cmpop::NotEq => " != ", self.p(" ")?;
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.unparse_expr(cmp, new_lvl)?; self.unparse_expr(cmp, new_lvl)?;
} }
}) })