mirror of
https://github.com/RustPython/Parser.git
synced 2025-07-08 05:35:22 +00:00
Address comments
This commit is contained in:
parent
9efa872023
commit
7f552e4594
3 changed files with 35 additions and 15 deletions
|
@ -244,12 +244,12 @@ where
|
|||
// Detect potential string like rb'' b'' f'' u'' r''
|
||||
match self.window[..3] {
|
||||
[Some(c), Some('"' | '\''), ..] => {
|
||||
if let Ok(kind) = StringKind::try_from(c.to_string()) {
|
||||
if let Ok(kind) = StringKind::try_from(c) {
|
||||
return self.lex_string(kind);
|
||||
}
|
||||
}
|
||||
[Some(c1), Some(c2), Some('"' | '\'')] => {
|
||||
if let Ok(kind) = StringKind::try_from(format!("{c1}{c2}")) {
|
||||
if let Ok(kind) = StringKind::try_from([c1, c2]) {
|
||||
return self.lex_string(kind);
|
||||
}
|
||||
}
|
||||
|
@ -459,7 +459,7 @@ where
|
|||
|
||||
fn lex_string(&mut self, kind: StringKind) -> LexResult {
|
||||
let start_pos = self.get_pos();
|
||||
for _ in 0..kind.to_string().len() {
|
||||
for _ in 0..kind.prefix_len() {
|
||||
self.next_char();
|
||||
}
|
||||
let quote_char = self.next_char().unwrap();
|
||||
|
|
|
@ -26,7 +26,7 @@ impl<'a> StringParser<'a> {
|
|||
str_start: Location,
|
||||
str_end: Location,
|
||||
) -> Self {
|
||||
let offset = kind.to_string().len() + if triple_quoted { 3 } else { 1 };
|
||||
let offset = kind.prefix_len() + if triple_quoted { 3 } else { 1 };
|
||||
Self {
|
||||
chars: source.chars().peekable(),
|
||||
kind,
|
||||
|
|
|
@ -240,19 +240,30 @@ pub enum StringKind {
|
|||
Unicode,
|
||||
}
|
||||
|
||||
impl TryFrom<String> for StringKind {
|
||||
impl TryFrom<char> for StringKind {
|
||||
type Error = String;
|
||||
|
||||
fn try_from(value: String) -> Result<Self, String> {
|
||||
match value.as_str() {
|
||||
"" => Ok(StringKind::String),
|
||||
"r" | "R" => Ok(StringKind::RawString),
|
||||
"u" | "U" => Ok(StringKind::Unicode),
|
||||
"b" | "B" => Ok(StringKind::Bytes),
|
||||
"f" | "F" => Ok(StringKind::FString),
|
||||
"fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF" => Ok(StringKind::RawFString),
|
||||
"br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" => Ok(StringKind::RawBytes),
|
||||
s => Err(format!("Unexpected string prefix: {s}")),
|
||||
fn try_from(ch: char) -> Result<Self, String> {
|
||||
match ch {
|
||||
'r' | 'R' => Ok(StringKind::RawString),
|
||||
'f' | 'F' => Ok(StringKind::FString),
|
||||
'u' | 'U' => Ok(StringKind::Unicode),
|
||||
'b' | 'B' => Ok(StringKind::Bytes),
|
||||
c => Err(format!("Unexpected string prefix: {c}")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<[char; 2]> for StringKind {
|
||||
type Error = String;
|
||||
|
||||
fn try_from(chars: [char; 2]) -> Result<Self, String> {
|
||||
match chars {
|
||||
['r' | 'R', 'f' | 'F'] => Ok(StringKind::RawFString),
|
||||
['f' | 'F', 'r' | 'R'] => Ok(StringKind::RawFString),
|
||||
['r' | 'R', 'b' | 'B'] => Ok(StringKind::RawBytes),
|
||||
['b' | 'B', 'r' | 'R'] => Ok(StringKind::RawBytes),
|
||||
[c1, c2] => Err(format!("Unexpected string prefix: {c1}{c2}")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -291,4 +302,13 @@ impl StringKind {
|
|||
pub fn is_unicode(&self) -> bool {
|
||||
matches!(self, StringKind::Unicode)
|
||||
}
|
||||
|
||||
pub fn prefix_len(&self) -> usize {
|
||||
use StringKind::*;
|
||||
match self {
|
||||
String => 0,
|
||||
RawString | FString | Unicode | Bytes => 1,
|
||||
RawFString | RawBytes => 2,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue