From b5021411a84822cb3f1e3aeffad9550dd15bdeb6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 16 Sep 2018 12:54:24 +0300 Subject: rename all things --- crates/ra_syntax/src/lexer/strings.rs | 123 ++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 crates/ra_syntax/src/lexer/strings.rs (limited to 'crates/ra_syntax/src/lexer/strings.rs') diff --git a/crates/ra_syntax/src/lexer/strings.rs b/crates/ra_syntax/src/lexer/strings.rs new file mode 100644 index 000000000..5ff483d14 --- /dev/null +++ b/crates/ra_syntax/src/lexer/strings.rs @@ -0,0 +1,123 @@ +use SyntaxKind::{self, *}; + +use lexer::ptr::Ptr; + +pub(crate) fn is_string_literal_start(c: char, c1: Option, c2: Option) -> bool { + match (c, c1, c2) { + ('r', Some('"'), _) + | ('r', Some('#'), _) + | ('b', Some('"'), _) + | ('b', Some('\''), _) + | ('b', Some('r'), Some('"')) + | ('b', Some('r'), Some('#')) => true, + _ => false, + } +} + +pub(crate) fn scan_char(ptr: &mut Ptr) { + while let Some(c) = ptr.current() { + match c { + '\\' => { + ptr.bump(); + if ptr.at('\\') || ptr.at('\'') { + ptr.bump(); + } + } + '\'' => { + ptr.bump(); + return; + } + '\n' => return, + _ => { + ptr.bump(); + } + } + } +} + +pub(crate) fn scan_byte_char_or_string(ptr: &mut Ptr) -> SyntaxKind { + // unwrapping and not-exhaustive match are ok + // because of string_literal_start + let c = ptr.bump().unwrap(); + match c { + '\'' => { + scan_byte(ptr); + BYTE + } + '"' => { + scan_byte_string(ptr); + BYTE_STRING + } + 'r' => { + scan_raw_byte_string(ptr); + RAW_BYTE_STRING + } + _ => unreachable!(), + } +} + +pub(crate) fn scan_string(ptr: &mut Ptr) { + while let Some(c) = ptr.current() { + match c { + '\\' => { + ptr.bump(); + if ptr.at('\\') || ptr.at('"') { + ptr.bump(); + } + } + '"' => { + ptr.bump(); + return; + } + _ => { + ptr.bump(); + }, + } + } +} + +pub(crate) fn scan_raw_string(ptr: &mut Ptr) { + let mut hashes = 0; + while ptr.at('#') { + hashes += 1; + ptr.bump(); + } + if !ptr.at('"') { + return; + } + ptr.bump(); + + while let Some(c) = ptr.bump() { + if c == '"' { + let mut hashes_left = hashes; + while ptr.at('#') && hashes_left > 0{ + hashes_left -= 1; + ptr.bump(); + } + if hashes_left == 0 { + return; + } + } + } +} + +fn scan_byte(ptr: &mut Ptr) { + scan_char(ptr) +} + +fn scan_byte_string(ptr: &mut Ptr) { + scan_string(ptr) +} + +fn scan_raw_byte_string(ptr: &mut Ptr) { + if !ptr.at('"') { + return; + } + ptr.bump(); + + while let Some(c) = ptr.bump() { + if c == '"' { + return; + } + } +} -- cgit v1.2.3