From 9d47d3d21246bedc0cd27b5221c23a771d958af0 Mon Sep 17 00:00:00 2001 From: "Jeong, YunWon" <69878+youknowone@users.noreply.github.com> Date: Tue, 16 May 2023 22:52:50 +0900 Subject: [PATCH] specialize ConversionFlag (#42) * specialize ConversionFlag * Change value of ConversionFlag to i8 and None to -1 * is_* methods to ConversionFlag --- ast/asdl_rs.py | 1 + ast/src/fold_helpers.rs | 3 ++- ast/src/gen/generic.rs | 2 +- ast/src/generic.rs | 2 +- ast/src/pyo3.rs | 9 ++++++++- ast/src/unparse.rs | 8 ++++---- core/Cargo.toml | 1 + core/src/format.rs | 12 ++++++------ .../rustpython_parser__parser__tests__try.snap | 8 ++------ ...python_parser__parser__tests__try_star.snap | 16 ++++------------ ...ring__tests__fstring_escaped_character.snap | 4 +--- ...string__tests__fstring_escaped_newline.snap | 4 +--- ...ring__tests__fstring_line_continuation.snap | 4 +--- ...s__fstring_parse_self_documenting_base.snap | 4 +--- ...tring_parse_self_documenting_base_more.snap | 8 ++------ ..._fstring_parse_self_documenting_format.snap | 4 +--- ...ring__tests__fstring_unescaped_newline.snap | 4 +--- ...string__tests__parse_f_string_concat_3.snap | 4 +--- ...n_parser__string__tests__parse_fstring.snap | 8 ++------ ...r__string__tests__parse_fstring_equals.snap | 4 +--- ...ring__tests__parse_fstring_nested_spec.snap | 8 ++------ ...tring__tests__parse_fstring_not_equals.snap | 4 +--- ...__tests__parse_fstring_not_nested_spec.snap | 4 +--- ...sts__parse_fstring_self_doc_prec_space.snap | 4 +--- ..._parse_fstring_self_doc_trailing_space.snap | 4 +--- ...tring__tests__parse_fstring_yield_expr.snap | 4 +--- ...hon_parser__string__tests__raw_fstring.snap | 4 +--- ...ring__tests__triple_quoted_raw_fstring.snap | 4 +--- parser/src/string.rs | 18 +++++++++--------- 29 files changed, 60 insertions(+), 104 deletions(-) diff --git a/ast/asdl_rs.py b/ast/asdl_rs.py index e5e5bcf1c1..0dc4c8c450 100755 --- a/ast/asdl_rs.py +++ b/ast/asdl_rs.py @@ -28,6 +28,7 @@ assert BUILTIN_TYPE_NAMES.keys() == asdl.builtin_types BUILTIN_INT_NAMES = { "simple": "bool", "is_async": "bool", + "conversion": "ConversionFlag", } RUST_KEYWORDS = { diff --git a/ast/src/fold_helpers.rs b/ast/src/fold_helpers.rs index 74c7d3cff3..4b5496647b 100644 --- a/ast/src/fold_helpers.rs +++ b/ast/src/fold_helpers.rs @@ -1,4 +1,4 @@ -use crate::{builtin, fold::Fold}; +use crate::{builtin, fold::Fold, ConversionFlag}; pub trait Foldable { type Mapped; @@ -67,5 +67,6 @@ simple_fold!( builtin::String, builtin::Identifier, bool, + ConversionFlag, builtin::Constant ); diff --git a/ast/src/gen/generic.rs b/ast/src/gen/generic.rs index fce84591d0..39ead973c0 100644 --- a/ast/src/gen/generic.rs +++ b/ast/src/gen/generic.rs @@ -931,7 +931,7 @@ impl From> for Expr { pub struct ExprFormattedValue { pub range: R, pub value: Box>, - pub conversion: Int, + pub conversion: ConversionFlag, pub format_spec: Option>>, } diff --git a/ast/src/generic.rs b/ast/src/generic.rs index 56ad5ce792..318a7bf452 100644 --- a/ast/src/generic.rs +++ b/ast/src/generic.rs @@ -1,5 +1,5 @@ #![allow(clippy::derive_partial_eq_without_eq)] -pub use crate::{builtin::*, text_size::TextSize, Node}; +pub use crate::{builtin::*, text_size::TextSize, ConversionFlag, Node}; use std::fmt::{Debug, Display, Formatter}; use std::marker::PhantomData; diff --git a/ast/src/pyo3.rs b/ast/src/pyo3.rs index d54a59e6fb..b176970019 100644 --- a/ast/src/pyo3.rs +++ b/ast/src/pyo3.rs @@ -1,4 +1,4 @@ -use crate::{source_code::SourceRange, text_size::TextRange, Node}; +use crate::{source_code::SourceRange, text_size::TextRange, ConversionFlag, Node}; use num_complex::Complex64; use once_cell::sync::OnceCell; use pyo3::prelude::*; @@ -73,6 +73,13 @@ impl ToPyo3Ast for bool { } } +impl ToPyo3Ast for ConversionFlag { + #[inline] + fn to_pyo3_ast(&self, py: Python) -> PyResult> { + Ok((*self as i8).to_object(py)) + } +} + impl ToPyo3Ast for crate::Constant { #[inline] fn to_pyo3_ast(&self, py: Python) -> PyResult> { diff --git a/ast/src/unparse.rs b/ast/src/unparse.rs index b68be60097..ebfe99af8d 100644 --- a/ast/src/unparse.rs +++ b/ast/src/unparse.rs @@ -346,7 +346,7 @@ impl<'a> Unparser<'a> { conversion, format_spec, range: _range, - }) => self.unparse_formatted(value, conversion.to_u32(), format_spec.as_deref())?, + }) => self.unparse_formatted(value, *conversion, format_spec.as_deref())?, Expr::JoinedStr(crate::ExprJoinedStr { values, range: _range, @@ -519,7 +519,7 @@ impl<'a> Unparser<'a> { fn unparse_formatted( &mut self, val: &Expr, - conversion: u32, + conversion: ConversionFlag, spec: Option<&Expr>, ) -> fmt::Result { let buffered = to_string_fmt(|f| Unparser::new(f).unparse_expr(val, precedence::TEST + 1)); @@ -533,7 +533,7 @@ impl<'a> Unparser<'a> { self.p(&buffered)?; drop(buffered); - if conversion != ConversionFlag::None as u32 { + if conversion != ConversionFlag::None { self.p("!")?; let buf = &[conversion as u8]; let c = std::str::from_utf8(buf).unwrap(); @@ -568,7 +568,7 @@ impl<'a> Unparser<'a> { conversion, format_spec, range: _range, - }) => self.unparse_formatted(value, conversion.to_u32(), format_spec.as_deref()), + }) => self.unparse_formatted(value, *conversion, format_spec.as_deref()), _ => unreachable!(), } } diff --git a/core/Cargo.toml b/core/Cargo.toml index 35e876d412..d1d74400ee 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -13,6 +13,7 @@ ruff_text_size = { path = "../ruff_text_size" } ruff_source_location = { path = "../ruff_source_location", optional = true } serde = { version = "1.0.133", optional = true, default-features = false, features = ["derive"] } +is-macro.workspace = true [features] default = [] diff --git a/core/src/format.rs b/core/src/format.rs index d02fce0c3b..59f7b846b6 100644 --- a/core/src/format.rs +++ b/core/src/format.rs @@ -1,13 +1,13 @@ /// Transforms a value prior to formatting it. -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -#[repr(u8)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, is_macro::Is)] +#[repr(i8)] pub enum ConversionFlag { /// No conversion - None = 0, // CPython uses -1 but not pleasure for us + None = -1, // CPython uses -1 /// Converts by calling `str()`. - Str = b's', + Str = b's' as i8, /// Converts by calling `ascii()`. - Ascii = b'a', + Ascii = b'a' as i8, /// Converts by calling `repr()`. - Repr = b'r', + Repr = b'r' as i8, } diff --git a/parser/src/snapshots/rustpython_parser__parser__tests__try.snap b/parser/src/snapshots/rustpython_parser__parser__tests__try.snap index c147b276a0..55ee202ece 100644 --- a/parser/src/snapshots/rustpython_parser__parser__tests__try.snap +++ b/parser/src/snapshots/rustpython_parser__parser__tests__try.snap @@ -121,9 +121,7 @@ expression: parse_ast keywords: [], }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), @@ -217,9 +215,7 @@ expression: parse_ast keywords: [], }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__parser__tests__try_star.snap b/parser/src/snapshots/rustpython_parser__parser__tests__try_star.snap index 9634857831..5d4700fc63 100644 --- a/parser/src/snapshots/rustpython_parser__parser__tests__try_star.snap +++ b/parser/src/snapshots/rustpython_parser__parser__tests__try_star.snap @@ -233,9 +233,7 @@ expression: parse_ast keywords: [], }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), @@ -269,9 +267,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), @@ -365,9 +361,7 @@ expression: parse_ast keywords: [], }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), @@ -401,9 +395,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_character.snap b/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_character.snap index 47f4b470df..942ce1148b 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_character.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_character.snap @@ -31,9 +31,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_newline.snap b/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_newline.snap index eb5d75cbe2..df9b65ba9b 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_newline.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__fstring_escaped_newline.snap @@ -31,9 +31,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__fstring_line_continuation.snap b/parser/src/snapshots/rustpython_parser__string__tests__fstring_line_continuation.snap index 3cae4ff9e5..80923028cc 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__fstring_line_continuation.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__fstring_line_continuation.snap @@ -31,9 +31,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base.snap b/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base.snap index 40e0bb33db..66613b1eb0 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base.snap @@ -33,9 +33,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 114, - ), + conversion: Repr, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base_more.snap b/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base_more.snap index e08a79d354..8d86b0c47d 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base_more.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_base_more.snap @@ -42,9 +42,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 114, - ), + conversion: Repr, format_spec: None, }, ), @@ -87,9 +85,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 114, - ), + conversion: Repr, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_format.snap b/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_format.snap index 69f27ea3fb..458ca1ee0c 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_format.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__fstring_parse_self_documenting_format.snap @@ -33,9 +33,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: Some( JoinedStr( ExprJoinedStr { diff --git a/parser/src/snapshots/rustpython_parser__string__tests__fstring_unescaped_newline.snap b/parser/src/snapshots/rustpython_parser__string__tests__fstring_unescaped_newline.snap index a1d7b535ab..72e1f42160 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__fstring_unescaped_newline.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__fstring_unescaped_newline.snap @@ -31,9 +31,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_f_string_concat_3.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_f_string_concat_3.snap index ee1e801b7f..1cefb19d1c 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_f_string_concat_3.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_f_string_concat_3.snap @@ -31,9 +31,7 @@ expression: parse_ast kind: None, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring.snap index 85064e8732..75707ef5f1 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring.snap @@ -15,9 +15,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), @@ -33,9 +31,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_equals.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_equals.snap index ed5516f825..b00074522b 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_equals.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_equals.snap @@ -34,9 +34,7 @@ expression: parse_ast ], }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_nested_spec.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_nested_spec.snap index 723801bcb3..5a1bd11f24 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_nested_spec.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_nested_spec.snap @@ -15,9 +15,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: Some( JoinedStr( ExprJoinedStr { @@ -35,9 +33,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_equals.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_equals.snap index 4a40d0a249..c0cf8ebea1 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_equals.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_equals.snap @@ -34,9 +34,7 @@ expression: parse_ast ], }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_nested_spec.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_nested_spec.snap index d860d649ea..1331a8918c 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_nested_spec.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_not_nested_spec.snap @@ -15,9 +15,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: Some( JoinedStr( ExprJoinedStr { diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_prec_space.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_prec_space.snap index 0fb434c309..d15143375b 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_prec_space.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_prec_space.snap @@ -33,9 +33,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 114, - ), + conversion: Repr, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_trailing_space.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_trailing_space.snap index 83daabf333..8ce955b07b 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_trailing_space.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_self_doc_trailing_space.snap @@ -33,9 +33,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 114, - ), + conversion: Repr, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_yield_expr.snap b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_yield_expr.snap index fe7d731d98..e2bd4ea3cb 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_yield_expr.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__parse_fstring_yield_expr.snap @@ -12,9 +12,7 @@ expression: parse_ast value: None, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__raw_fstring.snap b/parser/src/snapshots/rustpython_parser__string__tests__raw_fstring.snap index 9ece93cc03..79258eacbc 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__raw_fstring.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__raw_fstring.snap @@ -22,9 +22,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/snapshots/rustpython_parser__string__tests__triple_quoted_raw_fstring.snap b/parser/src/snapshots/rustpython_parser__string__tests__triple_quoted_raw_fstring.snap index 7269b46102..d3660102b9 100644 --- a/parser/src/snapshots/rustpython_parser__string__tests__triple_quoted_raw_fstring.snap +++ b/parser/src/snapshots/rustpython_parser__string__tests__triple_quoted_raw_fstring.snap @@ -22,9 +22,7 @@ expression: parse_ast ctx: Load, }, ), - conversion: Int( - 0, - ), + conversion: None, format_spec: None, }, ), diff --git a/parser/src/string.rs b/parser/src/string.rs index f1fa073c31..e9def12cc1 100644 --- a/parser/src/string.rs +++ b/parser/src/string.rs @@ -5,7 +5,7 @@ // we have to do the parsing here, manually. use crate::text_size::TextRange; use crate::{ - ast::{self, Constant, Expr, Int}, + ast::{self, Constant, Expr}, lexer::{LexicalError, LexicalErrorType}, parser::{parse_expression_starts_at, LalrpopError, ParseError, ParseErrorType}, token::{StringKind, Tok}, @@ -320,7 +320,7 @@ impl<'a> StringParser<'a> { ) })?, ), - conversion: Int::new(conversion as _), + conversion, format_spec: spec, range: self.range(), } @@ -354,13 +354,13 @@ impl<'a> StringParser<'a> { ) })?, ), - conversion: ast::Int::new( - (if conversion == ConversionFlag::None && spec.is_none() { - ConversionFlag::Repr - } else { - conversion - }) as _, - ), + conversion: if conversion == ConversionFlag::None + && spec.is_none() + { + ConversionFlag::Repr + } else { + conversion + }, format_spec: spec, range: self.range(), }