@@ -157,12 +157,12 @@ pub enum Token<'a> {
157
157
/// A `<bad-url-token>`
158
158
///
159
159
/// This token always indicates a parse error.
160
- BadUrl ,
160
+ BadUrl ( CompactCowStr < ' a > ) ,
161
161
162
162
/// A `<bad-string-token>`
163
163
///
164
164
/// This token always indicates a parse error.
165
- BadString ,
165
+ BadString ( CompactCowStr < ' a > ) ,
166
166
167
167
/// A `<)-token>`
168
168
///
@@ -194,7 +194,7 @@ impl<'a> Token<'a> {
194
194
pub fn is_parse_error ( & self ) -> bool {
195
195
matches ! (
196
196
* self ,
197
- BadUrl | BadString | CloseParenthesis | CloseSquareBracket | CloseCurlyBracket
197
+ BadUrl ( _ ) | BadString ( _ ) | CloseParenthesis | CloseSquareBracket | CloseCurlyBracket
198
198
)
199
199
}
200
200
}
@@ -567,14 +567,14 @@ fn next_token<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>, ()> {
567
567
fn consume_string < ' a > ( tokenizer : & mut Tokenizer < ' a > , single_quote : bool ) -> Token < ' a > {
568
568
match consume_quoted_string ( tokenizer, single_quote) {
569
569
Ok ( value) => QuotedString ( value) ,
570
- Err ( ( ) ) => BadString
570
+ Err ( value ) => BadString ( value )
571
571
}
572
572
}
573
573
574
574
575
575
/// Return `Err(())` on syntax error (ie. unescaped newline)
576
576
fn consume_quoted_string < ' a > ( tokenizer : & mut Tokenizer < ' a > , single_quote : bool )
577
- -> Result < CompactCowStr < ' a > , ( ) > {
577
+ -> Result < CompactCowStr < ' a > , CompactCowStr < ' a > > {
578
578
tokenizer. advance ( 1 ) ; // Skip the initial quote
579
579
// start_pos is at code point boundary, after " or '
580
580
let start_pos = tokenizer. position ( ) ;
@@ -607,15 +607,22 @@ fn consume_quoted_string<'a>(tokenizer: &mut Tokenizer<'a>, single_quote: bool)
607
607
string_bytes = tokenizer. slice_from( start_pos) . as_bytes( ) . to_owned( ) ;
608
608
break
609
609
}
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
+ } ,
611
613
_ => { }
612
614
}
613
615
tokenizer. consume_byte ( ) ;
614
616
}
615
617
616
618
while !tokenizer. is_eof ( ) {
617
619
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
+ ) ;
619
626
}
620
627
let b = tokenizer. consume_byte ( ) ;
621
628
match_byte ! { b,
@@ -1024,6 +1031,7 @@ fn consume_unquoted_url<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>,
1024
1031
}
1025
1032
1026
1033
fn consume_bad_url < ' a > ( tokenizer : & mut Tokenizer < ' a > ) -> Token < ' a > {
1034
+ let start_pos = tokenizer. position ( ) ;
1027
1035
// Consume up to the closing )
1028
1036
while !tokenizer. is_eof ( ) {
1029
1037
match_byte ! { tokenizer. consume_byte( ) ,
@@ -1034,7 +1042,7 @@ fn consume_unquoted_url<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>,
1034
1042
_ => { } ,
1035
1043
}
1036
1044
}
1037
- BadUrl
1045
+ BadUrl ( tokenizer . slice_from ( start_pos ) . into ( ) )
1038
1046
}
1039
1047
}
1040
1048
0 commit comments