Skip to content

Commit 8ac1afd

Browse files
committed
Revert "Auto merge of servo#143 - jdm:parseerror, r=SimonSapin"
This reverts commit 0a70d22, reversing changes made to fc0bdcd.
1 parent 0a70d22 commit 8ac1afd

File tree

8 files changed

+238
-390
lines changed

8 files changed

+238
-390
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
name = "cssparser"
4-
version = "0.14.0"
4+
version = "0.13.5"
55
authors = [ "Simon Sapin <simon.sapin@exyr.org>" ]
66

77
description = "Rust implementation of CSS Syntax Level 3"

src/color.rs

+41-45
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use std::fmt;
66
use std::f32::consts::PI;
77

8-
use super::{Token, Parser, ToCss, ParseError, BasicParseError};
8+
use super::{Token, Parser, ToCss};
99
use tokenizer::NumericValue;
1010

1111
#[cfg(feature = "serde")]
@@ -141,48 +141,46 @@ impl Color {
141141
/// Parse a <color> value, per CSS Color Module Level 3.
142142
///
143143
/// FIXME(#2) Deprecated CSS2 System Colors are not supported yet.
144-
pub fn parse<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Color, BasicParseError<'i>> {
145-
let token = try!(input.next());
146-
match token {
147-
Token::Hash(ref value) | Token::IDHash(ref value) => {
144+
pub fn parse(input: &mut Parser) -> Result<Color, ()> {
145+
match try!(input.next()) {
146+
Token::Hash(value) | Token::IDHash(value) => {
148147
Color::parse_hash(value.as_bytes())
149148
},
150-
Token::Ident(ref value) => parse_color_keyword(&*value),
151-
Token::Function(ref name) => {
152-
return input.parse_nested_block(|arguments| {
149+
Token::Ident(value) => parse_color_keyword(&*value),
150+
Token::Function(name) => {
151+
input.parse_nested_block(|arguments| {
153152
parse_color_function(&*name, arguments)
154-
.map_err(|e| ParseError::Basic(e))
155-
}).map_err(ParseError::<()>::basic);
153+
})
156154
}
157155
_ => Err(())
158-
}.map_err(|()| BasicParseError::UnexpectedToken(token))
156+
}
159157
}
160158

161159
/// Parse a color hash, without the leading '#' character.
162160
#[inline]
163161
pub fn parse_hash(value: &[u8]) -> Result<Self, ()> {
164162
match value.len() {
165-
8 => Ok(rgba(
163+
8 => rgba(
166164
try!(from_hex(value[0])) * 16 + try!(from_hex(value[1])),
167165
try!(from_hex(value[2])) * 16 + try!(from_hex(value[3])),
168166
try!(from_hex(value[4])) * 16 + try!(from_hex(value[5])),
169-
try!(from_hex(value[6])) * 16 + try!(from_hex(value[7]))),
167+
try!(from_hex(value[6])) * 16 + try!(from_hex(value[7])),
170168
),
171-
6 => Ok(rgb(
169+
6 => rgb(
172170
try!(from_hex(value[0])) * 16 + try!(from_hex(value[1])),
173171
try!(from_hex(value[2])) * 16 + try!(from_hex(value[3])),
174-
try!(from_hex(value[4])) * 16 + try!(from_hex(value[5]))),
172+
try!(from_hex(value[4])) * 16 + try!(from_hex(value[5])),
175173
),
176-
4 => Ok(rgba(
174+
4 => rgba(
177175
try!(from_hex(value[0])) * 17,
178176
try!(from_hex(value[1])) * 17,
179177
try!(from_hex(value[2])) * 17,
180-
try!(from_hex(value[3])) * 17),
178+
try!(from_hex(value[3])) * 17,
181179
),
182-
3 => Ok(rgb(
180+
3 => rgb(
183181
try!(from_hex(value[0])) * 17,
184182
try!(from_hex(value[1])) * 17,
185-
try!(from_hex(value[2])) * 17),
183+
try!(from_hex(value[2])) * 17,
186184
),
187185
_ => Err(())
188186
}
@@ -192,13 +190,13 @@ impl Color {
192190

193191

194192
#[inline]
195-
fn rgb(red: u8, green: u8, blue: u8) -> Color {
193+
fn rgb(red: u8, green: u8, blue: u8) -> Result<Color, ()> {
196194
rgba(red, green, blue, 255)
197195
}
198196

199197
#[inline]
200-
fn rgba(red: u8, green: u8, blue: u8, alpha: u8) -> Color {
201-
Color::RGBA(RGBA::new(red, green, blue, alpha))
198+
fn rgba(red: u8, green: u8, blue: u8, alpha: u8) -> Result<Color, ()> {
199+
Ok(Color::RGBA(RGBA::new(red, green, blue, alpha)))
202200
}
203201

204202

@@ -412,11 +410,11 @@ fn clamp_floor_256_f32(val: f32) -> u8 {
412410
}
413411

414412
#[inline]
415-
fn parse_color_function<'i, 't>(name: &str, arguments: &mut Parser<'i, 't>) -> Result<Color, BasicParseError<'i>> {
413+
fn parse_color_function(name: &str, arguments: &mut Parser) -> Result<Color, ()> {
416414
let (red, green, blue, uses_commas) = match_ignore_ascii_case! { name,
417415
"rgb" | "rgba" => parse_rgb_components_rgb(arguments)?,
418416
"hsl" | "hsla" => parse_rgb_components_hsl(arguments)?,
419-
_ => return Err(BasicParseError::UnexpectedToken(Token::Ident(name.to_owned().into()))),
417+
_ => return Err(())
420418
};
421419

422420
let alpha = if !arguments.is_exhausted() {
@@ -425,7 +423,7 @@ fn parse_color_function<'i, 't>(name: &str, arguments: &mut Parser<'i, 't>) -> R
425423
} else {
426424
match try!(arguments.next()) {
427425
Token::Delim('/') => {},
428-
t => return Err(BasicParseError::UnexpectedToken(t)),
426+
_ => return Err(())
429427
};
430428
};
431429
let token = try!(arguments.next());
@@ -436,21 +434,21 @@ fn parse_color_function<'i, 't>(name: &str, arguments: &mut Parser<'i, 't>) -> R
436434
Token::Percentage(ref v) => {
437435
clamp_unit_f32(v.unit_value)
438436
}
439-
t => {
440-
return Err(BasicParseError::UnexpectedToken(t))
437+
_ => {
438+
return Err(())
441439
}
442440
}
443441
} else {
444442
255
445443
};
446444

447445
try!(arguments.expect_exhausted());
448-
Ok(rgba(red, green, blue, alpha))
446+
rgba(red, green, blue, alpha)
449447
}
450448

451449

452450
#[inline]
453-
fn parse_rgb_components_rgb<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u8, u8, u8, bool), BasicParseError<'i>> {
451+
fn parse_rgb_components_rgb(arguments: &mut Parser) -> Result<(u8, u8, u8, bool), ()> {
454452
let red: u8;
455453
let green: u8;
456454
let blue: u8;
@@ -467,7 +465,7 @@ fn parse_rgb_components_rgb<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
467465
uses_commas = true;
468466
try!(arguments.expect_number())
469467
}
470-
t => return Err(BasicParseError::UnexpectedToken(t))
468+
_ => return Err(())
471469
});
472470
if uses_commas {
473471
try!(arguments.expect_comma());
@@ -482,38 +480,36 @@ fn parse_rgb_components_rgb<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
482480
uses_commas = true;
483481
try!(arguments.expect_percentage())
484482
}
485-
t => return Err(BasicParseError::UnexpectedToken(t))
483+
_ => return Err(())
486484
});
487485
if uses_commas {
488486
try!(arguments.expect_comma());
489487
}
490488
blue = clamp_unit_f32(try!(arguments.expect_percentage()));
491489
}
492-
t => return Err(BasicParseError::UnexpectedToken(t))
490+
_ => return Err(())
493491
};
494492
return Ok((red, green, blue, uses_commas));
495493
}
496494

497495
#[inline]
498-
fn parse_rgb_components_hsl<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u8, u8, u8, bool), BasicParseError<'i>> {
496+
fn parse_rgb_components_hsl(arguments: &mut Parser) -> Result<(u8, u8, u8, bool), ()> {
499497
let mut uses_commas = false;
500498
// Hue given as an angle
501499
// https://drafts.csswg.org/css-values/#angles
502-
let token = try!(arguments.next());
503-
let hue_degrees = match token {
504-
Token::Number(NumericValue { value: v, .. }) => Ok(v),
505-
Token::Dimension(NumericValue { value: v, .. }, ref unit) => {
500+
let hue_degrees = match try!(arguments.next()) {
501+
Token::Number(NumericValue { value: v, .. }) => v,
502+
Token::Dimension(NumericValue { value: v, .. }, unit) => {
506503
match_ignore_ascii_case! { &*unit,
507-
"deg" => Ok(v),
508-
"grad" => Ok(v * 360. / 400.),
509-
"rad" => Ok(v * 360. / (2. * PI)),
510-
"turn" => Ok(v * 360.),
511-
_ => Err(()),
504+
"deg" => v,
505+
"grad" => v * 360. / 400.,
506+
"rad" => v * 360. / (2. * PI),
507+
"turn" => v * 360.,
508+
_ => return Err(())
512509
}
513510
}
514-
t => return Err(BasicParseError::UnexpectedToken(t))
511+
_ => return Err(())
515512
};
516-
let hue_degrees = try!(hue_degrees.map_err(|()| BasicParseError::UnexpectedToken(token)));
517513
// Subtract an integer before rounding, to avoid some rounding errors:
518514
let hue_normalized_degrees = hue_degrees - 360. * (hue_degrees / 360.).floor();
519515
let hue = hue_normalized_degrees / 360.;
@@ -526,7 +522,7 @@ fn parse_rgb_components_hsl<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
526522
uses_commas = true;
527523
try!(arguments.expect_percentage())
528524
}
529-
t => return Err(BasicParseError::UnexpectedToken(t))
525+
_ => return Err(())
530526
};
531527
let saturation = saturation.max(0.).min(1.);
532528

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pub use from_bytes::{stylesheet_encoding, EncodingSupport};
8989
pub use color::{RGBA, Color, parse_color_keyword};
9090
pub use nth::parse_nth;
9191
pub use serializer::{ToCss, CssStringWriter, serialize_identifier, serialize_string, TokenSerializationType};
92-
pub use parser::{Parser, Delimiter, Delimiters, SourcePosition, ParseError, BasicParseError};
92+
pub use parser::{Parser, Delimiter, Delimiters, SourcePosition};
9393
pub use unicode_range::UnicodeRange;
9494

9595
// For macros

src/nth.rs

+33-55
Original file line numberDiff line numberDiff line change
@@ -4,98 +4,76 @@
44

55
use std::ascii::AsciiExt;
66

7-
use super::{Token, Parser, BasicParseError};
7+
use super::{Token, Parser};
88

99

1010
/// Parse the *An+B* notation, as found in the `:nth-child()` selector.
1111
/// The input is typically the arguments of a function,
1212
/// in which case the caller needs to check if the arguments’ parser is exhausted.
1313
/// Return `Ok((A, B))`, or `Err(())` for a syntax error.
14-
pub fn parse_nth<'i, 't>(input: &mut Parser<'i, 't>) -> Result<(i32, i32), BasicParseError<'i>> {
15-
let token = try!(input.next());
16-
match token {
17-
Token::Number(ref value) => {
18-
match value.int_value {
19-
Some(v) => Ok((0, v as i32)),
20-
None => Err(()),
14+
pub fn parse_nth(input: &mut Parser) -> Result<(i32, i32), ()> {
15+
match try!(input.next()) {
16+
Token::Number(value) => Ok((0, try!(value.int_value.ok_or(())) as i32)),
17+
Token::Dimension(value, unit) => {
18+
let a = try!(value.int_value.ok_or(())) as i32;
19+
match_ignore_ascii_case! { &unit,
20+
"n" => parse_b(input, a),
21+
"n-" => parse_signless_b(input, a, -1),
22+
_ => Ok((a, try!(parse_n_dash_digits(&*unit))))
2123
}
2224
}
23-
Token::Dimension(value, ref unit) => {
24-
match value.int_value {
25-
Some(v) => {
26-
let a = v as i32;
27-
match_ignore_ascii_case! {
28-
&unit,
29-
"n" => Ok(try!(parse_b(input, a))),
30-
"n-" => Ok(try!(parse_signless_b(input, a, -1))),
31-
_ => {
32-
parse_n_dash_digits(&*unit).map(|val| (a, val))
33-
}
34-
}
35-
}
36-
None => Err(()),
37-
}
38-
}
39-
Token::Ident(ref value) => {
25+
Token::Ident(value) => {
4026
match_ignore_ascii_case! { &value,
4127
"even" => Ok((2, 0)),
4228
"odd" => Ok((2, 1)),
43-
"n" => Ok(try!(parse_b(input, 1))),
44-
"-n" => Ok(try!(parse_b(input, -1))),
45-
"n-" => Ok(try!(parse_signless_b(input, 1, -1))),
46-
"-n-" => Ok(try!(parse_signless_b(input, -1, -1))),
29+
"n" => parse_b(input, 1),
30+
"-n" => parse_b(input, -1),
31+
"n-" => parse_signless_b(input, 1, -1),
32+
"-n-" => parse_signless_b(input, -1, -1),
4733
_ => if value.starts_with("-") {
48-
parse_n_dash_digits(&value[1..]).map(|v| (-1, v))
34+
Ok((-1, try!(parse_n_dash_digits(&value[1..]))))
4935
} else {
50-
parse_n_dash_digits(&*value).map(|v| (1, v))
36+
Ok((1, try!(parse_n_dash_digits(&*value))))
5137
}
5238
}
5339
}
5440
Token::Delim('+') => match try!(input.next_including_whitespace()) {
5541
Token::Ident(value) => {
5642
match_ignore_ascii_case! { &value,
57-
"n" => Ok(try!(parse_b(input, 1))),
58-
"n-" => Ok(try!(parse_signless_b(input, 1, -1))),
59-
_ => parse_n_dash_digits(&*value).map(|v| (1, v))
43+
"n" => parse_b(input, 1),
44+
"n-" => parse_signless_b(input, 1, -1),
45+
_ => Ok((1, try!(parse_n_dash_digits(&*value))))
6046
}
6147
}
62-
t => return Err(BasicParseError::UnexpectedToken(t)),
48+
_ => Err(())
6349
},
64-
_ => Err(()),
65-
}.map_err(|()| BasicParseError::UnexpectedToken(token))
50+
_ => Err(())
51+
}
6652
}
6753

6854

69-
fn parse_b<'i, 't>(input: &mut Parser<'i, 't>, a: i32) -> Result<(i32, i32), BasicParseError<'i>> {
55+
fn parse_b(input: &mut Parser, a: i32) -> Result<(i32, i32), ()> {
7056
let start_position = input.position();
71-
let token = input.next();
72-
match token {
73-
Ok(Token::Delim('+')) => Ok(try!(parse_signless_b(input, a, 1))),
74-
Ok(Token::Delim('-')) => Ok(try!(parse_signless_b(input, a, -1))),
57+
match input.next() {
58+
Ok(Token::Delim('+')) => parse_signless_b(input, a, 1),
59+
Ok(Token::Delim('-')) => parse_signless_b(input, a, -1),
7560
Ok(Token::Number(ref value)) if value.has_sign => {
76-
match value.int_value {
77-
Some(v) => Ok((a, v as i32)),
78-
None => Err(()),
79-
}
61+
Ok((a, try!(value.int_value.ok_or(())) as i32))
8062
}
8163
_ => {
8264
input.reset(start_position);
8365
Ok((a, 0))
8466
}
85-
}.map_err(|()| BasicParseError::UnexpectedToken(token.unwrap()))
67+
}
8668
}
8769

88-
fn parse_signless_b<'i, 't>(input: &mut Parser<'i, 't>, a: i32, b_sign: i32) -> Result<(i32, i32), BasicParseError<'i>> {
89-
let token = try!(input.next());
90-
match token {
70+
fn parse_signless_b(input: &mut Parser, a: i32, b_sign: i32) -> Result<(i32, i32), ()> {
71+
match try!(input.next()) {
9172
Token::Number(ref value) if !value.has_sign => {
92-
match value.int_value {
93-
Some(v) => Ok((a, b_sign * v as i32)),
94-
None => Err(()),
95-
}
73+
Ok((a, b_sign * (try!(value.int_value.ok_or(())) as i32)))
9674
}
9775
_ => Err(())
98-
}.map_err(|()| BasicParseError::UnexpectedToken(token))
76+
}
9977
}
10078

10179
fn parse_n_dash_digits(string: &str) -> Result<i32, ()> {

0 commit comments

Comments
 (0)