Skip to content

Commit c640312

Browse files
committed
Address comments
1 parent d775965 commit c640312

File tree

3 files changed

+35
-15
lines changed

3 files changed

+35
-15
lines changed

compiler/parser/src/lexer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,12 @@ where
244244
// Detect potential string like rb'' b'' f'' u'' r''
245245
match self.window[..3] {
246246
[Some(c), Some('"' | '\''), ..] => {
247-
if let Ok(kind) = StringKind::try_from(c.to_string()) {
247+
if let Ok(kind) = StringKind::try_from(c) {
248248
return self.lex_string(kind);
249249
}
250250
}
251251
[Some(c1), Some(c2), Some('"' | '\'')] => {
252-
if let Ok(kind) = StringKind::try_from(format!("{c1}{c2}")) {
252+
if let Ok(kind) = StringKind::try_from([c1, c2]) {
253253
return self.lex_string(kind);
254254
}
255255
}
@@ -459,7 +459,7 @@ where
459459

460460
fn lex_string(&mut self, kind: StringKind) -> LexResult {
461461
let start_pos = self.get_pos();
462-
for _ in 0..kind.to_string().len() {
462+
for _ in 0..kind.prefix_len() {
463463
self.next_char();
464464
}
465465
let quote_char = self.next_char().unwrap();

compiler/parser/src/string_parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl<'a> StringParser<'a> {
2626
str_start: Location,
2727
str_end: Location,
2828
) -> Self {
29-
let offset = kind.to_string().len() + if triple_quoted { 3 } else { 1 };
29+
let offset = kind.prefix_len() + if triple_quoted { 3 } else { 1 };
3030
Self {
3131
chars: source.chars().peekable(),
3232
kind,

compiler/parser/src/token.rs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -240,19 +240,30 @@ pub enum StringKind {
240240
Unicode,
241241
}
242242

243-
impl TryFrom<String> for StringKind {
243+
impl TryFrom<char> for StringKind {
244244
type Error = String;
245245

246-
fn try_from(value: String) -> Result<Self, String> {
247-
match value.as_str() {
248-
"" => Ok(StringKind::String),
249-
"r" | "R" => Ok(StringKind::RawString),
250-
"u" | "U" => Ok(StringKind::Unicode),
251-
"b" | "B" => Ok(StringKind::Bytes),
252-
"f" | "F" => Ok(StringKind::FString),
253-
"fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF" => Ok(StringKind::RawFString),
254-
"br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" => Ok(StringKind::RawBytes),
255-
s => Err(format!("Unexpected string prefix: {s}")),
246+
fn try_from(ch: char) -> Result<Self, String> {
247+
match ch {
248+
'r' | 'R' => Ok(StringKind::RawString),
249+
'f' | 'F' => Ok(StringKind::FString),
250+
'u' | 'U' => Ok(StringKind::Unicode),
251+
'b' | 'B' => Ok(StringKind::Bytes),
252+
c => Err(format!("Unexpected string prefix: {c}")),
253+
}
254+
}
255+
}
256+
257+
impl TryFrom<[char; 2]> for StringKind {
258+
type Error = String;
259+
260+
fn try_from(chars: [char; 2]) -> Result<Self, String> {
261+
match chars {
262+
['r' | 'R', 'f' | 'F'] => Ok(StringKind::RawFString),
263+
['f' | 'F', 'r' | 'R'] => Ok(StringKind::RawFString),
264+
['r' | 'R', 'b' | 'B'] => Ok(StringKind::RawBytes),
265+
['b' | 'B', 'r' | 'R'] => Ok(StringKind::RawBytes),
266+
[c1, c2] => Err(format!("Unexpected string prefix: {c1}{c2}")),
256267
}
257268
}
258269
}
@@ -291,4 +302,13 @@ impl StringKind {
291302
pub fn is_unicode(&self) -> bool {
292303
matches!(self, StringKind::Unicode)
293304
}
305+
306+
pub fn prefix_len(&self) -> usize {
307+
use StringKind::*;
308+
match self {
309+
String => 0,
310+
RawString | FString | Unicode | Bytes => 1,
311+
RawFString | RawBytes => 2,
312+
}
313+
}
294314
}

0 commit comments

Comments
 (0)