MCPcopy Create free account
hub / github.com/csskit/csskit / consume_string_token

Method consume_string_token

crates/css_lexer/src/private.rs:683–764  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

681 }
682
683 fn consume_string_token(&mut self) -> Token {
684 let delimiter = self.advance_byte();
685 let quotes = if delimiter == b'"' { QuoteStyle::Double } else { QuoteStyle::Single };
686 let mut contains_escape = false;
687 let mut len: u32 = 1;
688 loop {
689 let b = self.peek_byte(0);
690 match b {
691 // Check for newlines (LF=0x0A, CR=0x0D, FF=0x0C)
692 b'\n' | b'\r' | 0x0C => {
693 return Token::new_bad_string(len);
694 }
695 0 => {
696 if self.at_end() {
697 // EOF
698 return Token::new_string(quotes, false, contains_escape, len);
699 }
700 // NUL byte in middle of string — treat as replacement char
701 self.pos += 1;
702 contains_escape = true;
703 len += 1;
704 }
705 b'"' | b'\'' => {
706 self.pos += 1;
707 len += 1;
708 if b == delimiter {
709 return Token::new_string(quotes, true, contains_escape, len);
710 }
711 }
712 b'\\' => {
713 self.pos += 1;
714 contains_escape = true;
715 let next_b = self.peek_byte(0);
716 if next_b == 0 && self.at_end() {
717 // EOF after backslash
718 len += 1;
719 return Token::new_string(quotes, false, contains_escape, len);
720 }
721 // Check newline
722 if next_b < 128 && ASCII_NEWLINE.0[next_b as usize] {
723 len += self.consume_newline() + 1;
724 } else {
725 let next_c = self.peek_char();
726 if is_escape_sequence('\\', next_c) {
727 len += self.consume_escape_sequence();
728 } else {
729 return Token::new_bad_string(len);
730 }
731 }
732 }
733 _ => {
734 // Bulk scan: find next delimiter, backslash, or newline
735 let remaining = self.remaining_bytes();
736 let scan_end = match memchr::memchr3(delimiter, b'\\', b'\n', remaining) {
737 Some(offset) => offset,
738 None => remaining.len(),
739 };
740 // Within the scanned range, check for rare sentinels:

Callers 1

read_next_tokenMethod · 0.80

Calls 11

is_escape_sequenceFunction · 0.85
advance_byteMethod · 0.80
peek_byteMethod · 0.80
consume_newlineMethod · 0.80
peek_charMethod · 0.80
remaining_bytesMethod · 0.80
iterMethod · 0.80
advance_nMethod · 0.80
at_endMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected