mirror of https://github.com/astral-sh/ruff
Start tracking quoting style in the AST (#10298)
This PR modifies our AST so that nodes for string literals, bytes literals and f-strings all retain the following information: - The quoting style used (double or single quotes) - Whether the string is triple-quoted or not - Whether the string is raw or not This PR is a followup to #10256. Like with that PR, this PR does not, in itself, fix any bugs. However, it means that we will have the necessary information to preserve quoting style and rawness of strings in the `ExprGenerator` in a followup PR, which will allow us to provide a fix for https://github.com/astral-sh/ruff/issues/7799. The information is recorded on the AST nodes using a bitflag field on each node, similarly to how we recorded the information on `Tok::String`, `Tok::FStringStart` and `Tok::FStringMiddle` tokens in #10298. Rather than reusing the bitflag I used for the tokens, however, I decided to create a custom bitflag for each AST node. Using different bitflags for each node allows us to make invalid states unrepresentable: it is valid to set a `u` prefix on a string literal, but not on a bytes literal or an f-string. It also allows us to have better debug representations for each AST node modified in this PR.
This commit is contained in:
parent
965adbed4b
commit
1d97f27335
|
|
@ -22,11 +22,11 @@ impl Default for Quote {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<ruff_python_parser::QuoteStyle> for Quote {
|
impl From<ruff_python_ast::str::QuoteStyle> for Quote {
|
||||||
fn from(value: ruff_python_parser::QuoteStyle) -> Self {
|
fn from(value: ruff_python_ast::str::QuoteStyle) -> Self {
|
||||||
match value {
|
match value {
|
||||||
ruff_python_parser::QuoteStyle::Double => Self::Double,
|
ruff_python_ast::str::QuoteStyle::Double => Self::Double,
|
||||||
ruff_python_parser::QuoteStyle::Single => Self::Single,
|
ruff_python_ast::str::QuoteStyle::Single => Self::Single,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
use ast::{StringLiteralFlags, StringLiteralPrefix};
|
||||||
use ruff_python_ast::{self as ast, Arguments, Expr};
|
use ruff_python_ast::{self as ast, Arguments, Expr};
|
||||||
use ruff_text_size::Ranged;
|
use ruff_text_size::Ranged;
|
||||||
|
|
||||||
|
|
@ -218,7 +219,13 @@ fn check_os_environ_subscript(checker: &mut Checker, expr: &Expr) {
|
||||||
);
|
);
|
||||||
let node = ast::StringLiteral {
|
let node = ast::StringLiteral {
|
||||||
value: capital_env_var.into_boxed_str(),
|
value: capital_env_var.into_boxed_str(),
|
||||||
unicode: env_var.is_unicode(),
|
flags: StringLiteralFlags::default().with_prefix({
|
||||||
|
if env_var.is_unicode() {
|
||||||
|
StringLiteralPrefix::UString
|
||||||
|
} else {
|
||||||
|
StringLiteralPrefix::None
|
||||||
|
}
|
||||||
|
}),
|
||||||
..ast::StringLiteral::default()
|
..ast::StringLiteral::default()
|
||||||
};
|
};
|
||||||
let new_env_var = node.into();
|
let new_env_var = node.into();
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
use ast::FStringFlags;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
||||||
use crate::fix::edits::pad;
|
use crate::fix::edits::pad;
|
||||||
|
|
@ -97,6 +98,7 @@ fn build_fstring(joiner: &str, joinees: &[Expr]) -> Option<Expr> {
|
||||||
let node = ast::FString {
|
let node = ast::FString {
|
||||||
elements: f_string_elements,
|
elements: f_string_elements,
|
||||||
range: TextRange::default(),
|
range: TextRange::default(),
|
||||||
|
flags: FStringFlags::default(),
|
||||||
};
|
};
|
||||||
Some(node.into())
|
Some(node.into())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
|
||||||
|
use ast::StringLiteralFlags;
|
||||||
use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Fix};
|
use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Fix};
|
||||||
use ruff_macros::{derive_message_formats, violation};
|
use ruff_macros::{derive_message_formats, violation};
|
||||||
use ruff_python_ast as ast;
|
use ruff_python_ast as ast;
|
||||||
|
|
@ -106,7 +107,7 @@ fn generate_keyword_fix(checker: &Checker, call: &ast::ExprCall) -> Fix {
|
||||||
.expr(&Expr::StringLiteral(ast::ExprStringLiteral {
|
.expr(&Expr::StringLiteral(ast::ExprStringLiteral {
|
||||||
value: ast::StringLiteralValue::single(ast::StringLiteral {
|
value: ast::StringLiteralValue::single(ast::StringLiteral {
|
||||||
value: "locale".to_string().into_boxed_str(),
|
value: "locale".to_string().into_boxed_str(),
|
||||||
unicode: false,
|
flags: StringLiteralFlags::default(),
|
||||||
range: TextRange::default(),
|
range: TextRange::default(),
|
||||||
}),
|
}),
|
||||||
range: TextRange::default(),
|
range: TextRange::default(),
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ impl AlwaysFixableViolation for UnicodeKindPrefix {
|
||||||
|
|
||||||
/// UP025
|
/// UP025
|
||||||
pub(crate) fn unicode_kind_prefix(checker: &mut Checker, string: &StringLiteral) {
|
pub(crate) fn unicode_kind_prefix(checker: &mut Checker, string: &StringLiteral) {
|
||||||
if string.unicode {
|
if string.flags.is_u_string() {
|
||||||
let mut diagnostic = Diagnostic::new(UnicodeKindPrefix, string.range);
|
let mut diagnostic = Diagnostic::new(UnicodeKindPrefix, string.range);
|
||||||
diagnostic.set_fix(Fix::safe_edit(Edit::range_deletion(TextRange::at(
|
diagnostic.set_fix(Fix::safe_edit(Edit::range_deletion(TextRange::at(
|
||||||
string.start(),
|
string.start(),
|
||||||
|
|
|
||||||
|
|
@ -4430,7 +4430,11 @@ impl AstNode for ast::FString {
|
||||||
where
|
where
|
||||||
V: PreorderVisitor<'a> + ?Sized,
|
V: PreorderVisitor<'a> + ?Sized,
|
||||||
{
|
{
|
||||||
let ast::FString { elements, range: _ } = self;
|
let ast::FString {
|
||||||
|
elements,
|
||||||
|
range: _,
|
||||||
|
flags: _,
|
||||||
|
} = self;
|
||||||
|
|
||||||
for fstring_element in elements {
|
for fstring_element in elements {
|
||||||
visitor.visit_f_string_element(fstring_element);
|
visitor.visit_f_string_element(fstring_element);
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,12 @@ use std::fmt::Debug;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::slice::{Iter, IterMut};
|
use std::slice::{Iter, IterMut};
|
||||||
|
|
||||||
|
use bitflags::bitflags;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
||||||
use ruff_text_size::{Ranged, TextRange, TextSize};
|
use ruff_text_size::{Ranged, TextRange, TextSize};
|
||||||
|
|
||||||
use crate::{int, LiteralExpressionRef};
|
use crate::{int, str::QuoteStyle, LiteralExpressionRef};
|
||||||
|
|
||||||
/// See also [mod](https://docs.python.org/3/library/ast.html#ast.mod)
|
/// See also [mod](https://docs.python.org/3/library/ast.html#ast.mod)
|
||||||
#[derive(Clone, Debug, PartialEq, is_macro::Is)]
|
#[derive(Clone, Debug, PartialEq, is_macro::Is)]
|
||||||
|
|
@ -1167,11 +1168,84 @@ impl Ranged for FStringPart {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
#[derive(Default, Copy, Clone, PartialEq, Eq, Hash)]
|
||||||
|
struct FStringFlagsInner: u8 {
|
||||||
|
/// The f-string uses double quotes (`"`) for its opener and closer.
|
||||||
|
/// If this flag is not set, the f-string uses single quotes (`'`)
|
||||||
|
/// for its opener and closer.
|
||||||
|
const DOUBLE = 1 << 0;
|
||||||
|
|
||||||
|
/// The f-string is triple-quoted:
|
||||||
|
/// it begins and ends with three consecutive quote characters.
|
||||||
|
const TRIPLE_QUOTED = 1 << 1;
|
||||||
|
|
||||||
|
/// The f-string has an `r` or `R` prefix, meaning it is a raw f-string.
|
||||||
|
const R_PREFIX = 1 << 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flags that can be queried to obtain information
|
||||||
|
/// regarding the prefixes and quotes used for an f-string.
|
||||||
|
#[derive(Default, Copy, Clone, Eq, PartialEq, Hash)]
|
||||||
|
pub struct FStringFlags(FStringFlagsInner);
|
||||||
|
|
||||||
|
impl FStringFlags {
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_double_quotes(mut self) -> Self {
|
||||||
|
self.0 |= FStringFlagsInner::DOUBLE;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_triple_quotes(mut self) -> Self {
|
||||||
|
self.0 |= FStringFlagsInner::TRIPLE_QUOTED;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_r_prefix(mut self) -> Self {
|
||||||
|
self.0 |= FStringFlagsInner::R_PREFIX;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Does the f-string have an `r` or `R` prefix?
|
||||||
|
pub const fn is_raw(self) -> bool {
|
||||||
|
self.0.contains(FStringFlagsInner::R_PREFIX)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Is the f-string triple-quoted, i.e.,
|
||||||
|
/// does it begin and end with three consecutive quote characters?
|
||||||
|
pub const fn is_triple_quoted(self) -> bool {
|
||||||
|
self.0.contains(FStringFlagsInner::TRIPLE_QUOTED)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Does the f-string use single or double quotes in its opener and closer?
|
||||||
|
pub const fn quote_style(self) -> QuoteStyle {
|
||||||
|
if self.0.contains(FStringFlagsInner::DOUBLE) {
|
||||||
|
QuoteStyle::Double
|
||||||
|
} else {
|
||||||
|
QuoteStyle::Single
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for FStringFlags {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("FStringFlags")
|
||||||
|
.field("quote_style", &self.quote_style())
|
||||||
|
.field("raw", &self.is_raw())
|
||||||
|
.field("triple_quoted", &self.is_triple_quoted())
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// An AST node that represents a single f-string which is part of an [`ExprFString`].
|
/// An AST node that represents a single f-string which is part of an [`ExprFString`].
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub struct FString {
|
pub struct FString {
|
||||||
pub range: TextRange,
|
pub range: TextRange,
|
||||||
pub elements: Vec<FStringElement>,
|
pub elements: Vec<FStringElement>,
|
||||||
|
pub flags: FStringFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ranged for FString {
|
impl Ranged for FString {
|
||||||
|
|
@ -1266,7 +1340,9 @@ impl StringLiteralValue {
|
||||||
/// For an implicitly concatenated string, it returns `true` only if the first
|
/// For an implicitly concatenated string, it returns `true` only if the first
|
||||||
/// string literal is a unicode string.
|
/// string literal is a unicode string.
|
||||||
pub fn is_unicode(&self) -> bool {
|
pub fn is_unicode(&self) -> bool {
|
||||||
self.iter().next().map_or(false, |part| part.unicode)
|
self.iter()
|
||||||
|
.next()
|
||||||
|
.map_or(false, |part| part.flags.is_u_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a slice of all the [`StringLiteral`] parts contained in this value.
|
/// Returns a slice of all the [`StringLiteral`] parts contained in this value.
|
||||||
|
|
@ -1379,13 +1455,131 @@ impl Default for StringLiteralValueInner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash)]
|
||||||
|
struct StringLiteralFlagsInner: u8 {
|
||||||
|
/// The string uses double quotes (`"`).
|
||||||
|
/// If this flag is not set, the string uses single quotes (`'`).
|
||||||
|
const DOUBLE = 1 << 0;
|
||||||
|
|
||||||
|
/// The string is triple-quoted:
|
||||||
|
/// it begins and ends with three consecutive quote characters.
|
||||||
|
const TRIPLE_QUOTED = 1 << 1;
|
||||||
|
|
||||||
|
/// The string has a `u` or `U` prefix.
|
||||||
|
/// While this prefix is a no-op at runtime,
|
||||||
|
/// strings with this prefix can have no other prefixes set;
|
||||||
|
/// it is therefore invalid for this flag to be set
|
||||||
|
/// if `R_PREFIX` is also set.
|
||||||
|
const U_PREFIX = 1 << 2;
|
||||||
|
|
||||||
|
/// The string has an `r` or `R` prefix, meaning it is a raw string.
|
||||||
|
/// It is invalid to set this flag if `U_PREFIX` is also set.
|
||||||
|
const R_PREFIX = 1 << 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flags that can be queried to obtain information
|
||||||
|
/// regarding the prefixes and quotes used for a string literal.
|
||||||
|
#[derive(Default, Copy, Clone, Eq, PartialEq, Hash)]
|
||||||
|
pub struct StringLiteralFlags(StringLiteralFlagsInner);
|
||||||
|
|
||||||
|
impl StringLiteralFlags {
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_double_quotes(mut self) -> Self {
|
||||||
|
self.0 |= StringLiteralFlagsInner::DOUBLE;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_triple_quotes(mut self) -> Self {
|
||||||
|
self.0 |= StringLiteralFlagsInner::TRIPLE_QUOTED;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_prefix(mut self, prefix: StringLiteralPrefix) -> Self {
|
||||||
|
match prefix {
|
||||||
|
StringLiteralPrefix::None => {}
|
||||||
|
StringLiteralPrefix::RString => self.0 |= StringLiteralFlagsInner::R_PREFIX,
|
||||||
|
StringLiteralPrefix::UString => self.0 |= StringLiteralFlagsInner::U_PREFIX,
|
||||||
|
};
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const fn prefix(self) -> &'static str {
|
||||||
|
if self.0.contains(StringLiteralFlagsInner::U_PREFIX) {
|
||||||
|
debug_assert!(!self.0.contains(StringLiteralFlagsInner::R_PREFIX));
|
||||||
|
"u"
|
||||||
|
} else if self.0.contains(StringLiteralFlagsInner::R_PREFIX) {
|
||||||
|
"r"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Does the string use single or double quotes in its opener and closer?
|
||||||
|
pub const fn quote_style(self) -> QuoteStyle {
|
||||||
|
if self.0.contains(StringLiteralFlagsInner::DOUBLE) {
|
||||||
|
QuoteStyle::Double
|
||||||
|
} else {
|
||||||
|
QuoteStyle::Single
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Is the string triple-quoted, i.e.,
|
||||||
|
/// does it begin and end with three consecutive quote characters?
|
||||||
|
pub const fn is_triple_quoted(self) -> bool {
|
||||||
|
self.0.contains(StringLiteralFlagsInner::TRIPLE_QUOTED)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Does the string have a `u` or `U` prefix?
|
||||||
|
pub const fn is_u_string(&self) -> bool {
|
||||||
|
self.0.contains(StringLiteralFlagsInner::U_PREFIX)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Does the string have an `r` or `R` prefix?
|
||||||
|
pub const fn is_r_string(&self) -> bool {
|
||||||
|
self.0.contains(StringLiteralFlagsInner::R_PREFIX)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for StringLiteralFlags {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("StringLiteralFlags")
|
||||||
|
.field("quote_style", &self.quote_style())
|
||||||
|
.field("prefix", &self.prefix())
|
||||||
|
.field("triple_quoted", &self.is_triple_quoted())
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Enumerations of the valid prefixes a string literal can have.
|
||||||
|
///
|
||||||
|
/// Bytestrings and f-strings are excluded from this enumeration,
|
||||||
|
/// as they are represented by different AST nodes.
|
||||||
|
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash)]
|
||||||
|
pub enum StringLiteralPrefix {
|
||||||
|
/// Just a regular string with no prefixes
|
||||||
|
#[default]
|
||||||
|
None,
|
||||||
|
|
||||||
|
/// A string with a `u` or `U` prefix.
|
||||||
|
/// This is a no-op at runtime,
|
||||||
|
/// but is mutually exclusive with a string having an `r` prefix.
|
||||||
|
UString,
|
||||||
|
|
||||||
|
/// A "raw" string, that has an `r` or `R` prefix
|
||||||
|
RString,
|
||||||
|
}
|
||||||
|
|
||||||
/// An AST node that represents a single string literal which is part of an
|
/// An AST node that represents a single string literal which is part of an
|
||||||
/// [`ExprStringLiteral`].
|
/// [`ExprStringLiteral`].
|
||||||
#[derive(Clone, Debug, Default, PartialEq)]
|
#[derive(Clone, Debug, Default, PartialEq)]
|
||||||
pub struct StringLiteral {
|
pub struct StringLiteral {
|
||||||
pub range: TextRange,
|
pub range: TextRange,
|
||||||
pub value: Box<str>,
|
pub value: Box<str>,
|
||||||
pub unicode: bool,
|
pub flags: StringLiteralFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ranged for StringLiteral {
|
impl Ranged for StringLiteral {
|
||||||
|
|
@ -1602,12 +1796,84 @@ impl Default for BytesLiteralValueInner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
#[derive(Default, Copy, Clone, PartialEq, Eq, Hash)]
|
||||||
|
struct BytesLiteralFlagsInner: u8 {
|
||||||
|
/// The bytestring uses double quotes (`"`).
|
||||||
|
/// If this flag is not set, the bytestring uses single quotes (`'`).
|
||||||
|
const DOUBLE = 1 << 0;
|
||||||
|
|
||||||
|
/// The bytestring is triple-quoted:
|
||||||
|
/// it begins and ends with three consecutive quote characters.
|
||||||
|
const TRIPLE_QUOTED = 1 << 1;
|
||||||
|
|
||||||
|
/// The bytestring has an `r` or `R` prefix, meaning it is a raw bytestring.
|
||||||
|
const R_PREFIX = 1 << 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flags that can be queried to obtain information
|
||||||
|
/// regarding the prefixes and quotes used for a bytes literal.
|
||||||
|
#[derive(Default, Copy, Clone, Eq, PartialEq, Hash)]
|
||||||
|
pub struct BytesLiteralFlags(BytesLiteralFlagsInner);
|
||||||
|
|
||||||
|
impl BytesLiteralFlags {
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_double_quotes(mut self) -> Self {
|
||||||
|
self.0 |= BytesLiteralFlagsInner::DOUBLE;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_triple_quotes(mut self) -> Self {
|
||||||
|
self.0 |= BytesLiteralFlagsInner::TRIPLE_QUOTED;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_r_prefix(mut self) -> Self {
|
||||||
|
self.0 |= BytesLiteralFlagsInner::R_PREFIX;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Does the bytestring have an `r` or `R` prefix?
|
||||||
|
pub const fn is_raw(self) -> bool {
|
||||||
|
self.0.contains(BytesLiteralFlagsInner::R_PREFIX)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Is the bytestring triple-quoted, i.e.,
|
||||||
|
/// does it begin and end with three consecutive quote characters?
|
||||||
|
pub const fn is_triple_quoted(self) -> bool {
|
||||||
|
self.0.contains(BytesLiteralFlagsInner::TRIPLE_QUOTED)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Does the bytestring use single or double quotes in its opener and closer?
|
||||||
|
pub const fn quote_style(self) -> QuoteStyle {
|
||||||
|
if self.0.contains(BytesLiteralFlagsInner::DOUBLE) {
|
||||||
|
QuoteStyle::Double
|
||||||
|
} else {
|
||||||
|
QuoteStyle::Single
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for BytesLiteralFlags {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("BytesLiteralFlags")
|
||||||
|
.field("quote_style", &self.quote_style())
|
||||||
|
.field("raw", &self.is_raw())
|
||||||
|
.field("triple_quoted", &self.is_triple_quoted())
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// An AST node that represents a single bytes literal which is part of an
|
/// An AST node that represents a single bytes literal which is part of an
|
||||||
/// [`ExprBytesLiteral`].
|
/// [`ExprBytesLiteral`].
|
||||||
#[derive(Clone, Debug, Default, PartialEq)]
|
#[derive(Clone, Debug, Default, PartialEq)]
|
||||||
pub struct BytesLiteral {
|
pub struct BytesLiteral {
|
||||||
pub range: TextRange,
|
pub range: TextRange,
|
||||||
pub value: Box<[u8]>,
|
pub value: Box<[u8]>,
|
||||||
|
pub flags: BytesLiteralFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ranged for BytesLiteral {
|
impl Ranged for BytesLiteral {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,32 @@ use once_cell::sync::Lazy;
|
||||||
|
|
||||||
use ruff_text_size::{TextLen, TextRange};
|
use ruff_text_size::{TextLen, TextRange};
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq, is_macro::Is)]
|
||||||
|
pub enum QuoteStyle {
|
||||||
|
/// E.g. '
|
||||||
|
Single,
|
||||||
|
/// E.g. "
|
||||||
|
#[default]
|
||||||
|
Double,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl QuoteStyle {
|
||||||
|
pub const fn as_char(self) -> char {
|
||||||
|
match self {
|
||||||
|
Self::Single => '\'',
|
||||||
|
Self::Double => '"',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub const fn opposite(self) -> Self {
|
||||||
|
match self {
|
||||||
|
Self::Single => Self::Double,
|
||||||
|
Self::Double => Self::Single,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Includes all permutations of `r`, `u`, `f`, and `fr` (`ur` is invalid, as is `uf`). This
|
/// Includes all permutations of `r`, `u`, `f`, and `fr` (`ur` is invalid, as is `uf`). This
|
||||||
/// includes all possible orders, and all possible casings, for both single and triple quotes.
|
/// includes all possible orders, and all possible casings, for both single and triple quotes.
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -1267,7 +1267,7 @@ impl<'a> Generator<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unparse_string_literal(&mut self, string_literal: &ast::StringLiteral) {
|
fn unparse_string_literal(&mut self, string_literal: &ast::StringLiteral) {
|
||||||
if string_literal.unicode {
|
if string_literal.flags.is_u_string() {
|
||||||
self.p("u");
|
self.p("u");
|
||||||
}
|
}
|
||||||
self.p_str_repr(&string_literal.value);
|
self.p_str_repr(&string_literal.value);
|
||||||
|
|
|
||||||
|
|
@ -102,11 +102,11 @@ pub enum Quote {
|
||||||
Double,
|
Double,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<ruff_python_parser::QuoteStyle> for Quote {
|
impl From<ruff_python_ast::str::QuoteStyle> for Quote {
|
||||||
fn from(value: ruff_python_parser::QuoteStyle) -> Self {
|
fn from(value: ruff_python_ast::str::QuoteStyle) -> Self {
|
||||||
match value {
|
match value {
|
||||||
ruff_python_parser::QuoteStyle::Double => Self::Double,
|
ruff_python_ast::str::QuoteStyle::Double => Self::Double,
|
||||||
ruff_python_parser::QuoteStyle::Single => Self::Single,
|
ruff_python_ast::str::QuoteStyle::Single => Self::Single,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ pub use parser::{
|
||||||
};
|
};
|
||||||
use ruff_python_ast::{Mod, PySourceType, Suite};
|
use ruff_python_ast::{Mod, PySourceType, Suite};
|
||||||
pub use string::FStringErrorType;
|
pub use string::FStringErrorType;
|
||||||
pub use string_token_flags::{QuoteStyle, StringKind};
|
pub use string_token_flags::StringKind;
|
||||||
pub use token::{Tok, TokenKind};
|
pub use token::{Tok, TokenKind};
|
||||||
|
|
||||||
use crate::lexer::LexResult;
|
use crate::lexer::LexResult;
|
||||||
|
|
|
||||||
|
|
@ -1626,10 +1626,11 @@ StringLiteral: StringType = {
|
||||||
};
|
};
|
||||||
|
|
||||||
FStringExpr: StringType = {
|
FStringExpr: StringType = {
|
||||||
<location:@L> FStringStart <elements:FStringMiddlePattern*> FStringEnd <end_location:@R> => {
|
<location:@L> <start:fstring_start> <elements:FStringMiddlePattern*> FStringEnd <end_location:@R> => {
|
||||||
StringType::FString(ast::FString {
|
StringType::FString(ast::FString {
|
||||||
elements,
|
elements,
|
||||||
range: (location..end_location).into()
|
range: (location..end_location).into(),
|
||||||
|
flags: start.into()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -2002,7 +2003,7 @@ extern {
|
||||||
Dedent => token::Tok::Dedent,
|
Dedent => token::Tok::Dedent,
|
||||||
StartModule => token::Tok::StartModule,
|
StartModule => token::Tok::StartModule,
|
||||||
StartExpression => token::Tok::StartExpression,
|
StartExpression => token::Tok::StartExpression,
|
||||||
FStringStart => token::Tok::FStringStart(StringKind),
|
fstring_start => token::Tok::FStringStart(<StringKind>),
|
||||||
FStringEnd => token::Tok::FStringEnd,
|
FStringEnd => token::Tok::FStringEnd,
|
||||||
"!" => token::Tok::Exclamation,
|
"!" => token::Tok::Exclamation,
|
||||||
"?" => token::Tok::Question,
|
"?" => token::Tok::Question,
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -19,7 +19,11 @@ Ok(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..5,
|
range: 0..5,
|
||||||
value: "foo",
|
value: "foo",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,11 @@ Dict(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 1..4,
|
range: 1..4,
|
||||||
value: "a",
|
value: "a",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -32,7 +36,11 @@ Dict(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 16..19,
|
range: 16..19,
|
||||||
value: "d",
|
value: "d",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -49,7 +57,11 @@ Dict(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 6..9,
|
range: 6..9,
|
||||||
value: "b",
|
value: "b",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -70,7 +82,11 @@ Dict(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 21..24,
|
range: 21..24,
|
||||||
value: "e",
|
value: "e",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 3..7,
|
range: 3..7,
|
||||||
value: " f",
|
value: " f",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -38,6 +42,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -74,6 +83,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -120,6 +134,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -180,6 +199,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -228,7 +252,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 46..49,
|
range: 46..49,
|
||||||
value: "}",
|
value: "}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -251,6 +279,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -299,7 +332,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 62..65,
|
range: 62..65,
|
||||||
value: "{",
|
value: "{",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -322,6 +359,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -363,6 +405,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -416,6 +463,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -457,6 +509,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -516,6 +573,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -582,6 +644,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -606,6 +673,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -632,7 +704,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 173..179,
|
range: 173..179,
|
||||||
value: "foo ",
|
value: "foo ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -680,13 +756,22 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 196..201,
|
range: 196..201,
|
||||||
value: "baz",
|
value: "baz",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
@ -734,7 +819,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 227..232,
|
range: 227..232,
|
||||||
value: "one",
|
value: "one",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -766,12 +855,20 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 256..269,
|
range: 256..269,
|
||||||
value: "implicitly ",
|
value: "implicitly ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 270..284,
|
range: 270..284,
|
||||||
value: "concatenated",
|
value: "concatenated",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
value: "implicitly concatenated",
|
value: "implicitly concatenated",
|
||||||
|
|
@ -861,6 +958,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -888,6 +990,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -936,6 +1043,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -977,6 +1089,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..6,
|
range: 0..6,
|
||||||
value: "foo",
|
value: "foo",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -39,20 +43,33 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 16..21,
|
range: 16..21,
|
||||||
value: "baz",
|
value: "baz",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 22..29,
|
range: 22..29,
|
||||||
value: " some",
|
value: " some",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
@ -75,7 +92,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 30..35,
|
range: 30..35,
|
||||||
value: "foo",
|
value: "foo",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -98,20 +119,33 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 45..51,
|
range: 45..51,
|
||||||
value: "baz",
|
value: "baz",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 52..59,
|
range: 52..59,
|
||||||
value: " some",
|
value: " some",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
@ -134,7 +168,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 60..65,
|
range: 60..65,
|
||||||
value: "foo",
|
value: "foo",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -157,20 +195,33 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 75..80,
|
range: 75..80,
|
||||||
value: "baz",
|
value: "baz",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 81..89,
|
range: 81..89,
|
||||||
value: " some",
|
value: " some",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
@ -193,7 +244,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 90..96,
|
range: 90..96,
|
||||||
value: "foo",
|
value: "foo",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -228,20 +283,33 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 117..123,
|
range: 117..123,
|
||||||
value: "bar",
|
value: "bar",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 124..128,
|
range: 124..128,
|
||||||
value: "no",
|
value: "no",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ Call(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..3,
|
range: 0..3,
|
||||||
value: " ",
|
value: " ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -77,7 +81,11 @@ Call(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 43..53,
|
range: 43..53,
|
||||||
value: "LIMIT %d",
|
value: "LIMIT %d",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -121,7 +129,11 @@ Call(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 91..102,
|
range: 91..102,
|
||||||
value: "OFFSET %d",
|
value: "OFFSET %d",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 8..14,
|
range: 8..14,
|
||||||
value: "test",
|
value: "test",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -108,7 +112,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 81..88,
|
range: 81..88,
|
||||||
value: "label",
|
value: "label",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -125,7 +133,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 90..96,
|
range: 90..96,
|
||||||
value: "test",
|
value: "test",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -149,7 +161,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 118..125,
|
range: 118..125,
|
||||||
value: "label",
|
value: "label",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: crates/ruff_python_parser/src/parser.rs
|
source: crates/ruff_python_parser/src/parser.rs
|
||||||
expression: "parse_suite(source, \"<test>\").unwrap()"
|
expression: parse_suite(source).unwrap()
|
||||||
---
|
---
|
||||||
[
|
[
|
||||||
ClassDef(
|
ClassDef(
|
||||||
|
|
@ -121,7 +121,11 @@ expression: "parse_suite(source, \"<test>\").unwrap()"
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 80..89,
|
range: 80..89,
|
||||||
value: "default",
|
value: "default",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 8..20,
|
range: 8..20,
|
||||||
value: "positional",
|
value: "positional",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 6..19,
|
range: 6..19,
|
||||||
value: "Hello world",
|
value: "Hello world",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 6..19,
|
range: 6..19,
|
||||||
value: "Hello world",
|
value: "Hello world",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..13,
|
range: 0..13,
|
||||||
value: "Hello world",
|
value: "Hello world",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,11 @@ expression: parse_suite(source).unwrap()
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 48..61,
|
range: 48..61,
|
||||||
value: "ForwardRefY",
|
value: "ForwardRefY",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -506,7 +506,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 484..489,
|
range: 484..489,
|
||||||
value: "seq",
|
value: "seq",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -541,7 +545,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 518..523,
|
range: 518..523,
|
||||||
value: "map",
|
value: "map",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -838,7 +846,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 664..667,
|
range: 664..667,
|
||||||
value: "X",
|
value: "X",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -1574,7 +1586,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 1287..1292,
|
range: 1287..1292,
|
||||||
value: "foo",
|
value: "foo",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -2500,7 +2516,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 2036..2038,
|
range: 2036..2038,
|
||||||
value: "",
|
value: "",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -2550,7 +2570,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 2064..2066,
|
range: 2064..2066,
|
||||||
value: "",
|
value: "",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -3174,7 +3198,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 2449..2452,
|
range: 2449..2452,
|
||||||
value: "X",
|
value: "X",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -227,6 +232,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 30..34,
|
range: 30..34,
|
||||||
value: "eg",
|
value: "eg",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -276,6 +280,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -407,6 +416,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 4..37,
|
range: 4..37,
|
||||||
value: "\u{8}another cool trick",
|
value: "\u{8}another cool trick",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..15,
|
range: 0..15,
|
||||||
value: "\u{8}",
|
value: "\u{8}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..9,
|
range: 0..9,
|
||||||
value: "\u{7}",
|
value: "\u{7}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..21,
|
range: 0..21,
|
||||||
value: "\r",
|
value: "\r",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..45,
|
range: 0..45,
|
||||||
value: "\u{89}",
|
value: "\u{89}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..12,
|
range: 0..12,
|
||||||
value: "\u{7f}",
|
value: "\u{7f}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 7..16,
|
range: 7..16,
|
||||||
value: "\u{3}8[1m",
|
value: "\u{3}8[1m",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -271,6 +271,11 @@ expression: parse_ast
|
||||||
254,
|
254,
|
||||||
255,
|
255,
|
||||||
],
|
],
|
||||||
|
flags: BytesLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..12,
|
range: 0..12,
|
||||||
value: "\u{1b}",
|
value: "\u{1b}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,11 @@ expression: parse_ast
|
||||||
97,
|
97,
|
||||||
97,
|
97,
|
||||||
],
|
],
|
||||||
|
flags: BytesLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,11 @@ expression: parse_ast
|
||||||
83,
|
83,
|
||||||
52,
|
52,
|
||||||
],
|
],
|
||||||
|
flags: BytesLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..15,
|
range: 0..15,
|
||||||
value: "\u{c}",
|
value: "\u{c}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: true,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..9,
|
range: 0..9,
|
||||||
value: "\u{88}",
|
value: "\u{88}",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: crates/ruff_python_parser/src/string.rs
|
source: crates/ruff_python_parser/src/string.rs
|
||||||
expression: "parse_suite(r#\"f\"\"\"#, \"<test>\").unwrap()"
|
expression: "parse_suite(r#\"f\"\"\"#).unwrap()"
|
||||||
---
|
---
|
||||||
[
|
[
|
||||||
Expr(
|
Expr(
|
||||||
|
|
@ -15,6 +15,11 @@ expression: "parse_suite(r#\"f\"\"\"#, \"<test>\").unwrap()"
|
||||||
FString {
|
FString {
|
||||||
range: 0..3,
|
range: 0..3,
|
||||||
elements: [],
|
elements: [],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..8,
|
range: 0..8,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -30,6 +34,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..8,
|
range: 0..8,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -30,6 +34,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..8,
|
range: 0..8,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -40,7 +44,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 17..20,
|
range: 17..20,
|
||||||
value: "!",
|
value: "!",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -52,6 +60,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..8,
|
range: 0..8,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -40,7 +44,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 17..20,
|
range: 17..20,
|
||||||
value: "!",
|
value: "!",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -52,13 +60,22 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 23..31,
|
range: 23..31,
|
||||||
value: "again!",
|
value: "again!",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -44,12 +44,20 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 8..10,
|
range: 8..10,
|
||||||
value: "",
|
value: "",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 11..13,
|
range: 11..13,
|
||||||
value: "",
|
value: "",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
value: "",
|
value: "",
|
||||||
|
|
@ -69,6 +77,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 8..10,
|
range: 8..10,
|
||||||
value: "",
|
value: "",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -59,6 +63,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,20 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..8,
|
range: 0..8,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 9..16,
|
range: 9..16,
|
||||||
value: "world",
|
value: "world",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
value: "Hello world",
|
value: "Hello world",
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..20,
|
range: 0..20,
|
||||||
value: "Hello, world!",
|
value: "Hello, world!",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..9,
|
range: 0..9,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -30,6 +34,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..9,
|
range: 0..9,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
FString(
|
FString(
|
||||||
|
|
@ -30,13 +34,22 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Literal(
|
Literal(
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 19..22,
|
range: 19..22,
|
||||||
value: "!",
|
value: "!",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,20 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..8,
|
range: 0..8,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 9..17,
|
range: 9..17,
|
||||||
value: "world",
|
value: "world",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
value: "Hello world",
|
value: "Hello world",
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,20 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..9,
|
range: 0..9,
|
||||||
value: "Hello ",
|
value: "Hello ",
|
||||||
unicode: true,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "u",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 10..17,
|
range: 10..17,
|
||||||
value: "world",
|
value: "world",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
value: "Hello world",
|
value: "Hello world",
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,11 @@ expression: parse_ast
|
||||||
49,
|
49,
|
||||||
122,
|
122,
|
||||||
],
|
],
|
||||||
|
flags: BytesLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: true,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,11 @@ expression: parse_ast
|
||||||
92,
|
92,
|
||||||
92,
|
92,
|
||||||
],
|
],
|
||||||
|
flags: BytesLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: true,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: true,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -271,6 +271,11 @@ expression: parse_ast
|
||||||
254,
|
254,
|
||||||
255,
|
255,
|
||||||
],
|
],
|
||||||
|
flags: BytesLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
raw: false,
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..18,
|
range: 0..18,
|
||||||
value: "text more text",
|
value: "text more text",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..18,
|
range: 0..18,
|
||||||
value: "text more text",
|
value: "text more text",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,11 @@ expression: parse_ast
|
||||||
StringLiteral {
|
StringLiteral {
|
||||||
range: 0..19,
|
range: 0..19,
|
||||||
value: "text more text",
|
value: "text more text",
|
||||||
unicode: false,
|
flags: StringLiteralFlags {
|
||||||
|
quote_style: Single,
|
||||||
|
prefix: "",
|
||||||
|
triple_quoted: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,11 @@ expression: parse_ast
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
flags: FStringFlags {
|
||||||
|
quote_style: Double,
|
||||||
|
raw: true,
|
||||||
|
triple_quoted: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -308,6 +308,7 @@ impl StringParser {
|
||||||
return Ok(StringType::Bytes(ast::BytesLiteral {
|
return Ok(StringType::Bytes(ast::BytesLiteral {
|
||||||
value: self.source.into_boxed_bytes(),
|
value: self.source.into_boxed_bytes(),
|
||||||
range: self.range,
|
range: self.range,
|
||||||
|
flags: self.kind.into(),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -316,6 +317,7 @@ impl StringParser {
|
||||||
return Ok(StringType::Bytes(ast::BytesLiteral {
|
return Ok(StringType::Bytes(ast::BytesLiteral {
|
||||||
value: self.source.into_boxed_bytes(),
|
value: self.source.into_boxed_bytes(),
|
||||||
range: self.range,
|
range: self.range,
|
||||||
|
flags: self.kind.into(),
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -352,6 +354,7 @@ impl StringParser {
|
||||||
Ok(StringType::Bytes(ast::BytesLiteral {
|
Ok(StringType::Bytes(ast::BytesLiteral {
|
||||||
value: value.into_boxed_slice(),
|
value: value.into_boxed_slice(),
|
||||||
range: self.range,
|
range: self.range,
|
||||||
|
flags: self.kind.into(),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -360,8 +363,8 @@ impl StringParser {
|
||||||
// For raw strings, no escaping is necessary.
|
// For raw strings, no escaping is necessary.
|
||||||
return Ok(StringType::Str(ast::StringLiteral {
|
return Ok(StringType::Str(ast::StringLiteral {
|
||||||
value: self.source,
|
value: self.source,
|
||||||
unicode: self.kind.is_u_string(),
|
|
||||||
range: self.range,
|
range: self.range,
|
||||||
|
flags: self.kind.into(),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -369,8 +372,8 @@ impl StringParser {
|
||||||
// If the string doesn't contain any escape sequences, return the owned string.
|
// If the string doesn't contain any escape sequences, return the owned string.
|
||||||
return Ok(StringType::Str(ast::StringLiteral {
|
return Ok(StringType::Str(ast::StringLiteral {
|
||||||
value: self.source,
|
value: self.source,
|
||||||
unicode: self.kind.is_u_string(),
|
|
||||||
range: self.range,
|
range: self.range,
|
||||||
|
flags: self.kind.into(),
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -406,8 +409,8 @@ impl StringParser {
|
||||||
|
|
||||||
Ok(StringType::Str(ast::StringLiteral {
|
Ok(StringType::Str(ast::StringLiteral {
|
||||||
value: value.into_boxed_str(),
|
value: value.into_boxed_str(),
|
||||||
unicode: self.kind.is_u_string(),
|
|
||||||
range: self.range,
|
range: self.range,
|
||||||
|
flags: self.kind.into(),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use std::fmt;
|
||||||
|
|
||||||
use bitflags::bitflags;
|
use bitflags::bitflags;
|
||||||
|
|
||||||
|
use ruff_python_ast::{str::QuoteStyle, StringLiteralPrefix};
|
||||||
use ruff_text_size::{TextLen, TextSize};
|
use ruff_text_size::{TextLen, TextSize};
|
||||||
|
|
||||||
bitflags! {
|
bitflags! {
|
||||||
|
|
@ -287,28 +288,67 @@ impl fmt::Debug for StringKind {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)]
|
impl From<StringKind> for ruff_python_ast::StringLiteralFlags {
|
||||||
pub enum QuoteStyle {
|
fn from(value: StringKind) -> ruff_python_ast::StringLiteralFlags {
|
||||||
/// E.g. '
|
debug_assert!(!value.is_f_string());
|
||||||
Single,
|
debug_assert!(!value.is_byte_string());
|
||||||
/// E.g. "
|
|
||||||
#[default]
|
|
||||||
Double,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl QuoteStyle {
|
let mut new = ruff_python_ast::StringLiteralFlags::default();
|
||||||
pub const fn as_char(self) -> char {
|
if value.quote_style().is_double() {
|
||||||
match self {
|
new = new.with_double_quotes();
|
||||||
Self::Single => '\'',
|
}
|
||||||
Self::Double => '"',
|
if value.is_triple_quoted() {
|
||||||
|
new = new.with_triple_quotes();
|
||||||
|
}
|
||||||
|
new.with_prefix({
|
||||||
|
if value.is_u_string() {
|
||||||
|
debug_assert!(!value.is_raw_string());
|
||||||
|
StringLiteralPrefix::UString
|
||||||
|
} else if value.is_raw_string() {
|
||||||
|
StringLiteralPrefix::RString
|
||||||
|
} else {
|
||||||
|
StringLiteralPrefix::None
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
impl From<StringKind> for ruff_python_ast::BytesLiteralFlags {
|
||||||
pub const fn opposite(self) -> Self {
|
fn from(value: StringKind) -> ruff_python_ast::BytesLiteralFlags {
|
||||||
match self {
|
debug_assert!(value.is_byte_string());
|
||||||
Self::Single => Self::Double,
|
debug_assert!(!value.is_f_string());
|
||||||
Self::Double => Self::Single,
|
debug_assert!(!value.is_u_string());
|
||||||
|
|
||||||
|
let mut new = ruff_python_ast::BytesLiteralFlags::default();
|
||||||
|
if value.quote_style().is_double() {
|
||||||
|
new = new.with_double_quotes();
|
||||||
|
}
|
||||||
|
if value.is_triple_quoted() {
|
||||||
|
new = new.with_triple_quotes();
|
||||||
|
}
|
||||||
|
if value.is_raw_string() {
|
||||||
|
new = new.with_r_prefix();
|
||||||
|
}
|
||||||
|
new
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<StringKind> for ruff_python_ast::FStringFlags {
|
||||||
|
fn from(value: StringKind) -> ruff_python_ast::FStringFlags {
|
||||||
|
debug_assert!(value.is_f_string());
|
||||||
|
debug_assert!(!value.is_byte_string());
|
||||||
|
debug_assert!(!value.is_u_string());
|
||||||
|
|
||||||
|
let mut new = ruff_python_ast::FStringFlags::default();
|
||||||
|
if value.quote_style().is_double() {
|
||||||
|
new = new.with_double_quotes();
|
||||||
|
}
|
||||||
|
if value.is_triple_quoted() {
|
||||||
|
new = new.with_triple_quotes();
|
||||||
|
}
|
||||||
|
if value.is_raw_string() {
|
||||||
|
new = new.with_r_prefix();
|
||||||
|
}
|
||||||
|
new
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue