Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/ast/token_ext.rs')
| -rw-r--r-- | crates/syntax/src/ast/token_ext.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/crates/syntax/src/ast/token_ext.rs b/crates/syntax/src/ast/token_ext.rs index f1e5c2136f..4b6dc236b5 100644 --- a/crates/syntax/src/ast/token_ext.rs +++ b/crates/syntax/src/ast/token_ext.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; -use rustc_lexer::unescape::{unescape_literal, Mode}; +use rustc_lexer::unescape::{unescape_byte, unescape_char, unescape_literal, Mode}; use crate::{ ast::{self, AstToken}, @@ -406,3 +406,35 @@ mod tests { check_string_value(r"C:\\Windows\\System32\\", "C:\\Windows\\System32\\"); } } + +impl ast::Char { + pub fn value(&self) -> Option<char> { + let mut text = self.text(); + if text.starts_with('\'') { + text = &text[1..]; + } else { + return None; + } + if text.ends_with('\'') { + text = &text[0..text.len() - 1]; + } + + unescape_char(text).ok() + } +} + +impl ast::Byte { + pub fn value(&self) -> Option<u8> { + let mut text = self.text(); + if text.starts_with("b\'") { + text = &text[2..]; + } else { + return None; + } + if text.ends_with('\'') { + text = &text[0..text.len() - 1]; + } + + unescape_byte(text).ok() + } +} |