Skip to content

Commit 2733bb3

Browse files
committed
Inline fields of Token::Number to align with Token::Dimension
1 parent d6d98d3 commit 2733bb3

File tree

9 files changed

+55
-85
lines changed

9 files changed

+55
-85
lines changed

src/color.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use std::fmt;
66
use std::f32::consts::PI;
77

88
use super::{Token, Parser, ToCss, ParseError, BasicParseError};
9-
use tokenizer::NumericValue;
109

1110
#[cfg(feature = "serde")]
1211
use serde::{Deserialize, Deserializer, Serialize, Serializer};
@@ -430,7 +429,7 @@ fn parse_color_function<'i, 't>(name: &str, arguments: &mut Parser<'i, 't>) -> R
430429
};
431430
let token = try!(arguments.next());
432431
match token {
433-
Token::Number(NumericValue { value: v, .. }) => {
432+
Token::Number { value: v, .. } => {
434433
clamp_unit_f32(v)
435434
}
436435
Token::Percentage(ref v) => {
@@ -459,10 +458,10 @@ fn parse_rgb_components_rgb<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
459458
// Either integers or percentages, but all the same type.
460459
// https://drafts.csswg.org/css-color/#rgb-functions
461460
match try!(arguments.next()) {
462-
Token::Number(NumericValue { value: v, .. }) => {
461+
Token::Number { value: v, .. } => {
463462
red = clamp_floor_256_f32(v);
464463
green = clamp_floor_256_f32(match try!(arguments.next()) {
465-
Token::Number(NumericValue { value: v, .. }) => v,
464+
Token::Number { value: v, .. } => v,
466465
Token::Comma => {
467466
uses_commas = true;
468467
try!(arguments.expect_number())
@@ -501,7 +500,7 @@ fn parse_rgb_components_hsl<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
501500
// https://drafts.csswg.org/css-values/#angles
502501
let token = try!(arguments.next());
503502
let hue_degrees = match token {
504-
Token::Number(NumericValue { value: v, .. }) => Ok(v),
503+
Token::Number { value: v, .. } => Ok(v),
505504
Token::Dimension { value: v, ref unit, .. } => {
506505
match_ignore_ascii_case! { &*unit,
507506
"deg" => Ok(v),

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ fn parse_border_spacing(_context: &ParserContext, input: &mut Parser)
8080

8181
pub use cssparser_macros::*;
8282

83-
pub use tokenizer::{Token, NumericValue, PercentageValue, SourceLocation};
83+
pub use tokenizer::{Token, PercentageValue, SourceLocation};
8484
pub use rules_and_declarations::{parse_important};
8585
pub use rules_and_declarations::{DeclarationParser, DeclarationListParser, parse_one_declaration};
8686
pub use rules_and_declarations::{RuleListParser, parse_one_rule};

src/nth.rs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,8 @@ use super::{Token, Parser, BasicParseError};
1414
pub fn parse_nth<'i, 't>(input: &mut Parser<'i, 't>) -> Result<(i32, i32), BasicParseError<'i>> {
1515
let token = try!(input.next());
1616
match token {
17-
Token::Number(ref value) => {
18-
match value.int_value {
19-
Some(v) => Ok((0, v as i32)),
20-
None => Err(()),
21-
}
17+
Token::Number { int_value: Some(b), .. } => {
18+
Ok((0, b))
2219
}
2320
Token::Dimension { int_value: Some(a), ref unit, .. } => {
2421
match_ignore_ascii_case! {
@@ -66,12 +63,7 @@ fn parse_b<'i, 't>(input: &mut Parser<'i, 't>, a: i32) -> Result<(i32, i32), Bas
6663
match token {
6764
Ok(Token::Delim('+')) => Ok(try!(parse_signless_b(input, a, 1))),
6865
Ok(Token::Delim('-')) => Ok(try!(parse_signless_b(input, a, -1))),
69-
Ok(Token::Number(ref value)) if value.has_sign => {
70-
match value.int_value {
71-
Some(v) => Ok((a, v as i32)),
72-
None => Err(()),
73-
}
74-
}
66+
Ok(Token::Number { has_sign: true, int_value: Some(b), .. }) => Ok((a, b)),
7567
_ => {
7668
input.reset(start_position);
7769
Ok((a, 0))
@@ -82,12 +74,7 @@ fn parse_b<'i, 't>(input: &mut Parser<'i, 't>, a: i32) -> Result<(i32, i32), Bas
8274
fn parse_signless_b<'i, 't>(input: &mut Parser<'i, 't>, a: i32, b_sign: i32) -> Result<(i32, i32), BasicParseError<'i>> {
8375
let token = try!(input.next());
8476
match token {
85-
Token::Number(ref value) if !value.has_sign => {
86-
match value.int_value {
87-
Some(v) => Ok((a, b_sign * v as i32)),
88-
None => Err(()),
89-
}
90-
}
77+
Token::Number { has_sign: false, int_value: Some(b), .. } => Ok((a, b_sign * b)),
9178
_ => Err(())
9279
}.map_err(|()| BasicParseError::UnexpectedToken(token))
9380
}

src/parser.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use compact_cow_str::CompactCowStr;
66
use std::ops::Range;
77
use std::ascii::AsciiExt;
88
use std::ops::BitOr;
9-
use tokenizer::{self, Token, NumericValue, PercentageValue, Tokenizer, SourceLocation};
9+
use tokenizer::{self, Token, PercentageValue, Tokenizer, SourceLocation};
1010

1111

1212
/// A capture of the internal state of a `Parser` (including the position within the input),
@@ -507,7 +507,7 @@ impl<'i: 't, 't> Parser<'i, 't> {
507507
#[inline]
508508
pub fn expect_number(&mut self) -> Result<f32, BasicParseError<'i>> {
509509
match try!(self.next()) {
510-
Token::Number(NumericValue { value, .. }) => Ok(value),
510+
Token::Number { value, .. } => Ok(value),
511511
t => Err(BasicParseError::UnexpectedToken(t))
512512
}
513513
}
@@ -517,7 +517,7 @@ impl<'i: 't, 't> Parser<'i, 't> {
517517
pub fn expect_integer(&mut self) -> Result<i32, BasicParseError<'i>> {
518518
let token = try!(self.next());
519519
match token {
520-
Token::Number(NumericValue { int_value: Some(int_value), .. }) => {
520+
Token::Number { int_value: Some(int_value), .. } => {
521521
Ok(int_value)
522522
}
523523
t => Err(BasicParseError::UnexpectedToken(t))

src/serializer.rs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use std::ascii::AsciiExt;
66
use std::fmt::{self, Write};
77

8-
use super::{Token, NumericValue, PercentageValue};
8+
use super::{Token, PercentageValue};
99

1010

1111
/// Trait for things the can serialize themselves in CSS syntax.
@@ -43,20 +43,21 @@ pub trait ToCss {
4343

4444

4545
#[inline]
46-
fn write_numeric<W>(value: NumericValue, dest: &mut W) -> fmt::Result where W: fmt::Write {
46+
fn write_numeric<W>(value: f32, int_value: Option<i32>, has_sign: bool, dest: &mut W)
47+
-> fmt::Result where W: fmt::Write {
4748
// `value.value >= 0` is true for negative 0.
48-
if value.has_sign && value.value.is_sign_positive() {
49+
if has_sign && value.is_sign_positive() {
4950
try!(dest.write_str("+"));
5051
}
5152

52-
if value.value == 0.0 && value.value.is_sign_negative() {
53+
if value == 0.0 && value.is_sign_negative() {
5354
// Negative zero. Work around #20596.
5455
try!(dest.write_str("-0"))
5556
} else {
56-
try!(write!(dest, "{}", value.value))
57+
try!(write!(dest, "{}", value))
5758
}
5859

59-
if value.int_value.is_none() && value.value.fract() == 0. {
60+
if int_value.is_none() && value.fract() == 0. {
6061
try!(dest.write_str(".0"));
6162
}
6263
Ok(())
@@ -87,22 +88,15 @@ impl<'a> ToCss for Token<'a> {
8788
},
8889
Token::Delim(value) => try!(write!(dest, "{}", value)),
8990

90-
Token::Number(value) => try!(write_numeric(value, dest)),
91+
Token::Number { value, int_value, has_sign } => {
92+
try!(write_numeric(value, int_value, has_sign, dest))
93+
}
9194
Token::Percentage(PercentageValue { unit_value, int_value, has_sign }) => {
92-
let value = NumericValue {
93-
value: unit_value * 100.,
94-
int_value: int_value,
95-
has_sign: has_sign,
96-
};
97-
try!(write_numeric(value, dest));
95+
try!(write_numeric(unit_value * 100., int_value, has_sign, dest));
9896
try!(dest.write_str("%"));
9997
},
10098
Token::Dimension { value, int_value, has_sign, ref unit } => {
101-
try!(write_numeric(NumericValue {
102-
value: value,
103-
int_value: int_value,
104-
has_sign: has_sign,
105-
}, dest));
99+
try!(write_numeric(value, int_value, has_sign, dest));
106100
// Disambiguate with scientific notation.
107101
let unit = &**unit;
108102
if unit == "e" || unit == "E" || unit.starts_with("e-") || unit.starts_with("E-") {
@@ -393,7 +387,7 @@ impl<'a> Token<'a> {
393387
Token::Delim('|') => DelimBar,
394388
Token::Delim('/') => DelimSlash,
395389
Token::Delim('*') => DelimAsterisk,
396-
Token::Number(_) => Number,
390+
Token::Number { .. } => Number,
397391
Token::Percentage(_) => Percentage,
398392
Token::Dimension { .. } => Dimension,
399393
Token::WhiteSpace(_) => WhiteSpace,

src/size_of_tests.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use compact_cow_str::CompactCowStr;
66
use std::borrow::Cow;
7-
use tokenizer::{Token, NumericValue, PercentageValue};
7+
use tokenizer::{Token, PercentageValue};
88

99
#[macro_export]
1010
macro_rules! size_of_test {
@@ -33,7 +33,6 @@ macro_rules! size_of_test {
3333

3434
// These assume 64-bit
3535
size_of_test!(token, Token, 32);
36-
size_of_test!(numeric_value, NumericValue, 16);
3736
size_of_test!(percentage_value, PercentageValue, 16);
3837
size_of_test!(std_cow_str, Cow<'static, str>, 32);
3938
size_of_test!(compact_cow_str, CompactCowStr, 16);

src/tests.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rustc_serialize::json::{self, Json, ToJson};
1111
#[cfg(feature = "bench")]
1212
use self::test::Bencher;
1313

14-
use super::{Parser, Delimiter, Token, NumericValue, PercentageValue, SourceLocation, ParseError,
14+
use super::{Parser, Delimiter, Token, PercentageValue, SourceLocation, ParseError,
1515
DeclarationListParser, DeclarationParser, RuleListParser, BasicParseError,
1616
AtRuleType, AtRuleParser, QualifiedRuleParser, ParserInput,
1717
parse_one_declaration, parse_one_rule, parse_important,
@@ -768,11 +768,15 @@ fn component_values_to_json(input: &mut Parser) -> Vec<Json> {
768768
}
769769

770770
fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
771-
fn numeric(value: NumericValue) -> Vec<json::Json> {
771+
fn numeric(value: f32, int_value: Option<i32>, has_sign: bool) -> Vec<json::Json> {
772772
vec![
773-
Token::Number(value).to_css_string().to_json(),
774-
match value.int_value { Some(i) => i.to_json(), None => value.value.to_json() },
775-
match value.int_value { Some(_) => "integer", None => "number" }.to_json()
773+
Token::Number {
774+
value: value,
775+
int_value: int_value,
776+
has_sign: has_sign,
777+
}.to_css_string().to_json(),
778+
match int_value { Some(i) => i.to_json(), None => value.to_json() },
779+
match int_value { Some(_) => "integer", None => "number" }.to_json()
776780
]
777781
}
778782

@@ -793,27 +797,19 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
793797
Token::Delim('\\') => "\\".to_json(),
794798
Token::Delim(value) => value.to_string().to_json(),
795799

796-
Token::Number(value) => Json::Array({
800+
Token::Number { value, int_value, has_sign } => Json::Array({
797801
let mut v = vec!["number".to_json()];
798-
v.extend(numeric(value));
802+
v.extend(numeric(value, int_value, has_sign));
799803
v
800804
}),
801805
Token::Percentage(PercentageValue { unit_value, int_value, has_sign }) => Json::Array({
802806
let mut v = vec!["percentage".to_json()];
803-
v.extend(numeric(NumericValue {
804-
value: unit_value * 100.,
805-
int_value: int_value,
806-
has_sign: has_sign,
807-
}));
807+
v.extend(numeric(unit_value * 100., int_value, has_sign));
808808
v
809809
}),
810810
Token::Dimension { value, int_value, has_sign, unit } => Json::Array({
811811
let mut v = vec!["dimension".to_json()];
812-
v.extend(numeric(NumericValue {
813-
value: value,
814-
int_value: int_value,
815-
has_sign: has_sign,
816-
}));
812+
v.extend(numeric(value, int_value, has_sign));
817813
v.push(unit.to_json());
818814
v
819815
}),

src/tokenizer.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,18 @@ pub enum Token<'a> {
5353
Delim(char),
5454

5555
/// A [`<number-token>`](https://drafts.csswg.org/css-syntax/#number-token-diagram)
56-
Number(NumericValue),
56+
Number {
57+
/// Whether the number had a `+` or `-` sign.
58+
///
59+
/// This is used is some cases like the <An+B> micro syntax. (See the `parse_nth` function.)
60+
has_sign: bool,
61+
62+
/// The value as a float
63+
value: f32,
64+
65+
/// If the origin source did not include a fractional part, the value as an integer.
66+
int_value: Option<i32>,
67+
},
5768

5869
/// A [`<percentage-token>`](https://drafts.csswg.org/css-syntax/#percentage-token-diagram)
5970
Percentage(PercentageValue),
@@ -179,22 +190,6 @@ impl<'a> Token<'a> {
179190
}
180191

181192

182-
/// The numeric value of `Number` and `Dimension` tokens.
183-
#[derive(PartialEq, Debug, Copy, Clone)]
184-
pub struct NumericValue {
185-
/// The value as a float
186-
pub value: f32,
187-
188-
/// If the origin source did not include a fractional part, the value as an integer.
189-
pub int_value: Option<i32>,
190-
191-
/// Whether the number had a `+` or `-` sign.
192-
///
193-
/// This is used is some cases like the <An+B> micro syntax. (See the `parse_nth` function.)
194-
pub has_sign: bool,
195-
}
196-
197-
198193
/// The numeric value of `Percentage` tokens.
199194
#[derive(PartialEq, Debug, Copy, Clone)]
200195
pub struct PercentageValue {
@@ -893,11 +888,11 @@ fn consume_numeric<'a>(tokenizer: &mut Tokenizer<'a>) -> Token<'a> {
893888
unit: unit,
894889
}
895890
} else {
896-
Number(NumericValue {
891+
Number {
897892
value: value,
898893
int_value: int_value,
899894
has_sign: has_sign,
900-
})
895+
}
901896
}
902897
}
903898

src/unicode_range.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ fn parse_tokens<'i, 't>(input: &mut Parser<'i, 't>) -> Result<(), BasicParseErro
6767
Token::Dimension { .. } => {
6868
parse_question_marks(input)
6969
}
70-
Token::Number(_) => {
70+
Token::Number { .. } => {
7171
let after_number = input.position();
7272
match input.next_including_whitespace() {
7373
Ok(Token::Delim('?')) => parse_question_marks(input),
7474
Ok(Token::Dimension { .. }) => {}
75-
Ok(Token::Number(_)) => {}
75+
Ok(Token::Number { .. }) => {}
7676
_ => input.reset(after_number)
7777
}
7878
}

0 commit comments

Comments
 (0)