@@ -157,12 +157,12 @@ pub enum Token<'a> {
157157 /// A `<bad-url-token>`
158158 ///
159159 /// This token always indicates a parse error.
160- BadUrl ,
160+ BadUrl ( CompactCowStr < ' a > ) ,
161161
162162 /// A `<bad-string-token>`
163163 ///
164164 /// This token always indicates a parse error.
165- BadString ,
165+ BadString ( CompactCowStr < ' a > ) ,
166166
167167 /// A `<)-token>`
168168 ///
@@ -194,7 +194,7 @@ impl<'a> Token<'a> {
194194 pub fn is_parse_error ( & self ) -> bool {
195195 matches ! (
196196 * self ,
197- BadUrl | BadString | CloseParenthesis | CloseSquareBracket | CloseCurlyBracket
197+ BadUrl ( _ ) | BadString ( _ ) | CloseParenthesis | CloseSquareBracket | CloseCurlyBracket
198198 )
199199 }
200200}
@@ -567,14 +567,14 @@ fn next_token<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>, ()> {
567567fn consume_string < ' a > ( tokenizer : & mut Tokenizer < ' a > , single_quote : bool ) -> Token < ' a > {
568568 match consume_quoted_string ( tokenizer, single_quote) {
569569 Ok ( value) => QuotedString ( value) ,
570- Err ( ( ) ) => BadString
570+ Err ( value ) => BadString ( value )
571571 }
572572}
573573
574574
575575/// Return `Err(())` on syntax error (ie. unescaped newline)
576576fn consume_quoted_string < ' a > ( tokenizer : & mut Tokenizer < ' a > , single_quote : bool )
577- -> Result < CompactCowStr < ' a > , ( ) > {
577+ -> Result < CompactCowStr < ' a > , CompactCowStr < ' a > > {
578578 tokenizer. advance ( 1 ) ; // Skip the initial quote
579579 // start_pos is at code point boundary, after " or '
580580 let start_pos = tokenizer. position ( ) ;
@@ -607,15 +607,22 @@ fn consume_quoted_string<'a>(tokenizer: &mut Tokenizer<'a>, single_quote: bool)
607607 string_bytes = tokenizer. slice_from( start_pos) . as_bytes( ) . to_owned( ) ;
608608 break
609609 }
610- b'\n' | b'\r' | b'\x0C' => { return Err ( ( ) ) } ,
610+ b'\n' | b'\r' | b'\x0C' => {
611+ return Err ( tokenizer. slice_from( start_pos) . into( ) )
612+ } ,
611613 _ => { }
612614 }
613615 tokenizer. consume_byte ( ) ;
614616 }
615617
616618 while !tokenizer. is_eof ( ) {
617619 if matches ! ( tokenizer. next_byte_unchecked( ) , b'\n' | b'\r' | b'\x0C' ) {
618- return Err ( ( ) ) ;
620+ return Err (
621+ // string_bytes is well-formed UTF-8, see other comments.
622+ unsafe {
623+ from_utf8_release_unchecked ( string_bytes)
624+ } . into ( )
625+ ) ;
619626 }
620627 let b = tokenizer. consume_byte ( ) ;
621628 match_byte ! { b,
@@ -1024,6 +1031,7 @@ fn consume_unquoted_url<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>,
10241031 }
10251032
10261033 fn consume_bad_url < ' a > ( tokenizer : & mut Tokenizer < ' a > ) -> Token < ' a > {
1034+ let start_pos = tokenizer. position ( ) ;
10271035 // Consume up to the closing )
10281036 while !tokenizer. is_eof ( ) {
10291037 match_byte ! { tokenizer. consume_byte( ) ,
@@ -1034,7 +1042,7 @@ fn consume_unquoted_url<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>,
10341042 _ => { } ,
10351043 }
10361044 }
1037- BadUrl
1045+ BadUrl ( tokenizer . slice_from ( start_pos ) . into ( ) )
10381046 }
10391047}
10401048
0 commit comments