refactor away many unwrap
s
This commit is contained in:
parent
ec83a9dff7
commit
6d76e1518a
10
src/args.rs
10
src/args.rs
@ -339,12 +339,12 @@ pub(crate) fn eat_call_args<I: Iterator<Item = Token>>(
|
|||||||
let mut val: Vec<Token> = Vec::new();
|
let mut val: Vec<Token> = Vec::new();
|
||||||
let mut span = toks.peek().ok_or(("expected \")\".", span_before))?.pos();
|
let mut span = toks.peek().ok_or(("expected \")\".", span_before))?.pos();
|
||||||
loop {
|
loop {
|
||||||
match toks.peek().unwrap().kind {
|
match toks.peek() {
|
||||||
'$' => {
|
Some(Token { kind: '$', .. }) => {
|
||||||
let Token { pos, .. } = toks.next().unwrap();
|
let Token { pos, .. } = toks.next().unwrap();
|
||||||
let v = eat_ident_no_interpolation(toks, false, pos)?;
|
let v = eat_ident_no_interpolation(toks, false, pos)?;
|
||||||
let whitespace = devour_whitespace_or_comment(toks)?;
|
let whitespace = devour_whitespace_or_comment(toks)?;
|
||||||
if toks.peek().unwrap().kind == ':' {
|
if let Some(Token { kind: ':', .. }) = toks.peek() {
|
||||||
toks.next();
|
toks.next();
|
||||||
name = v.node;
|
name = v.node;
|
||||||
} else {
|
} else {
|
||||||
@ -362,11 +362,11 @@ pub(crate) fn eat_call_args<I: Iterator<Item = Token>>(
|
|||||||
name.clear();
|
name.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
')' => {
|
Some(Token { kind: ')', .. }) => {
|
||||||
toks.next();
|
toks.next();
|
||||||
return Ok(CallArgs(args, span));
|
return Ok(CallArgs(args, span));
|
||||||
}
|
}
|
||||||
_ => name.clear(),
|
Some(..) | None => name.clear(),
|
||||||
}
|
}
|
||||||
devour_whitespace_or_comment(toks)?;
|
devour_whitespace_or_comment(toks)?;
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ impl AtRule {
|
|||||||
kind_span,
|
kind_span,
|
||||||
)?;
|
)?;
|
||||||
span.merge(kind_span);
|
span.merge(kind_span);
|
||||||
if toks.peek().unwrap().kind == ';' {
|
if let Some(Token { kind: ';', .. }) = toks.peek() {
|
||||||
kind_span.merge(toks.next().unwrap().pos());
|
kind_span.merge(toks.next().unwrap().pos());
|
||||||
}
|
}
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
@ -111,7 +111,7 @@ impl AtRule {
|
|||||||
kind_span,
|
kind_span,
|
||||||
)?;
|
)?;
|
||||||
span.merge(kind_span);
|
span.merge(kind_span);
|
||||||
if toks.peek().unwrap().kind == ';' {
|
if let Some(Token { kind: ';', .. }) = toks.peek() {
|
||||||
kind_span.merge(toks.next().unwrap().pos());
|
kind_span.merge(toks.next().unwrap().pos());
|
||||||
}
|
}
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
@ -143,7 +143,7 @@ impl AtRule {
|
|||||||
}
|
}
|
||||||
AtRuleKind::Return => {
|
AtRuleKind::Return => {
|
||||||
let v = read_until_semicolon_or_closing_curly_brace(toks)?;
|
let v = read_until_semicolon_or_closing_curly_brace(toks)?;
|
||||||
if toks.peek().unwrap().kind == ';' {
|
if let Some(Token { kind: ';', .. }) = toks.peek() {
|
||||||
toks.next();
|
toks.next();
|
||||||
}
|
}
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
@ -205,7 +205,7 @@ impl AtRule {
|
|||||||
}
|
}
|
||||||
AtRuleKind::Charset => {
|
AtRuleKind::Charset => {
|
||||||
read_until_semicolon_or_closing_curly_brace(toks)?;
|
read_until_semicolon_or_closing_curly_brace(toks)?;
|
||||||
if toks.peek().unwrap().kind == ';' {
|
if let Some(Token { kind: ';', .. }) = toks.peek() {
|
||||||
toks.next();
|
toks.next();
|
||||||
}
|
}
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
|
@ -22,7 +22,7 @@ fn length(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassR
|
|||||||
|
|
||||||
fn nth(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
fn nth(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
||||||
args.max_args(2)?;
|
args.max_args(2)?;
|
||||||
let list = match arg!(args, scope, super_selector, 0, "list") {
|
let mut list = match arg!(args, scope, super_selector, 0, "list") {
|
||||||
Value::List(v, ..) => v,
|
Value::List(v, ..) => v,
|
||||||
Value::Map(m) => m.entries(),
|
Value::Map(m) => m.entries(),
|
||||||
v => vec![v],
|
v => vec![v],
|
||||||
@ -58,11 +58,11 @@ fn nth(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
return Err((format!("$n: {} is not an int.", n), args.span()).into());
|
return Err((format!("$n: {} is not an int.", n), args.span()).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.is_positive() {
|
Ok(list.remove(if n.is_positive() {
|
||||||
Ok(list[n.to_integer().to_usize().unwrap() - 1].clone())
|
n.to_integer().to_usize().unwrap_or(std::usize::MAX) - 1
|
||||||
} else {
|
} else {
|
||||||
Ok(list[list.len() - n.abs().to_integer().to_usize().unwrap()].clone())
|
list.len() - n.abs().to_integer().to_usize().unwrap_or(std::usize::MAX)
|
||||||
}
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn list_separator(
|
fn list_separator(
|
||||||
@ -120,9 +120,9 @@ fn set_nth(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> Sass
|
|||||||
let val = arg!(args, scope, super_selector, 2, "value");
|
let val = arg!(args, scope, super_selector, 2, "value");
|
||||||
|
|
||||||
if n.is_positive() {
|
if n.is_positive() {
|
||||||
list[n.to_integer().to_usize().unwrap() - 1] = val;
|
list[n.to_integer().to_usize().unwrap_or(std::usize::MAX) - 1] = val;
|
||||||
} else {
|
} else {
|
||||||
list[len - n.abs().to_integer().to_usize().unwrap()] = val;
|
list[len - n.abs().to_integer().to_usize().unwrap_or(std::usize::MAX)] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Value::List(list, sep, brackets))
|
Ok(Value::List(list, sep, brackets))
|
||||||
|
@ -488,7 +488,7 @@ fn repr(red: &Number, green: &Number, blue: &Number, alpha: &Number) -> String {
|
|||||||
} else if channel.is_negative() {
|
} else if channel.is_negative() {
|
||||||
0_u8
|
0_u8
|
||||||
} else {
|
} else {
|
||||||
channel.round().to_integer().to_u8().unwrap()
|
channel.round().to_integer().to_u8().unwrap_or(255)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ pub(crate) fn eat_expr<I: Iterator<Item = Token>>(
|
|||||||
if values.is_empty() {
|
if values.is_empty() {
|
||||||
toks.next();
|
toks.next();
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
if toks.peek().is_some() && toks.peek().unwrap().kind == ';' {
|
if let Some(Token { kind: ';', .. }) = toks.peek() {
|
||||||
toks.next();
|
toks.next();
|
||||||
}
|
}
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
|
@ -40,7 +40,7 @@ pub(crate) fn hex_char_for(number: u32) -> char {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn is_name(c: char) -> bool {
|
pub(crate) fn is_name(c: char) -> bool {
|
||||||
is_name_start(c) || c.is_digit(10) || c == '-'
|
is_name_start(c) || c.is_ascii_digit() || c == '-'
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn is_name_start(c: char) -> bool {
|
pub(crate) fn is_name_start(c: char) -> bool {
|
||||||
|
@ -75,12 +75,12 @@ pub(crate) fn read_until_closing_curly_brace<I: Iterator<Item = Token>>(
|
|||||||
}
|
}
|
||||||
'/' => {
|
'/' => {
|
||||||
let next = toks.next().unwrap();
|
let next = toks.next().unwrap();
|
||||||
match toks.peek().unwrap().kind {
|
match toks.peek() {
|
||||||
'/' => {
|
Some(Token { kind: '/', .. }) => {
|
||||||
read_until_newline(toks);
|
read_until_newline(toks);
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
}
|
}
|
||||||
_ => t.push(next),
|
Some(..) | None => t.push(next),
|
||||||
};
|
};
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -180,8 +180,8 @@ pub(crate) fn read_until_semicolon_or_closing_curly_brace<I: Iterator<Item = Tok
|
|||||||
}
|
}
|
||||||
'/' => {
|
'/' => {
|
||||||
let next = toks.next().unwrap();
|
let next = toks.next().unwrap();
|
||||||
match toks.peek().unwrap().kind {
|
match toks.peek() {
|
||||||
'/' => {
|
Some(Token { kind: '/', .. }) => {
|
||||||
read_until_newline(toks);
|
read_until_newline(toks);
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
}
|
}
|
||||||
|
@ -173,23 +173,25 @@ pub(crate) fn eat_ident<I: Iterator<Item = Token>>(
|
|||||||
super_selector: &Selector,
|
super_selector: &Selector,
|
||||||
span_before: Span,
|
span_before: Span,
|
||||||
) -> SassResult<Spanned<String>> {
|
) -> SassResult<Spanned<String>> {
|
||||||
let mut span = toks
|
let Token {
|
||||||
.peek()
|
kind,
|
||||||
.ok_or(("Expected identifier.", span_before))?
|
pos: mut span,
|
||||||
.pos();
|
} = toks.peek().ok_or(("Expected identifier.", span_before))?;
|
||||||
let mut text = String::new();
|
let mut text = String::new();
|
||||||
if toks.peek().unwrap().kind == '-' {
|
if kind == &'-' {
|
||||||
toks.next();
|
toks.next();
|
||||||
text.push('-');
|
text.push('-');
|
||||||
if toks.peek().is_none() {
|
match toks.peek() {
|
||||||
return Ok(Spanned { node: text, span });
|
Some(Token { kind: '-', .. }) => {
|
||||||
}
|
toks.next();
|
||||||
if toks.peek().unwrap().kind == '-' {
|
text.push('-');
|
||||||
toks.next();
|
let body_span =
|
||||||
text.push('-');
|
interpolated_ident_body(toks, scope, super_selector, span, &mut text)?;
|
||||||
let body_span = interpolated_ident_body(toks, scope, super_selector, span, &mut text)?;
|
span = span.merge(body_span);
|
||||||
span = span.merge(body_span);
|
return Ok(Spanned { node: text, span });
|
||||||
return Ok(Spanned { node: text, span });
|
}
|
||||||
|
Some(..) => {}
|
||||||
|
None => return Ok(Spanned { node: text, span }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,37 +239,38 @@ pub(crate) fn eat_ident_no_interpolation<I: Iterator<Item = Token>>(
|
|||||||
unit: bool,
|
unit: bool,
|
||||||
span_before: Span,
|
span_before: Span,
|
||||||
) -> SassResult<Spanned<String>> {
|
) -> SassResult<Spanned<String>> {
|
||||||
let mut span = toks
|
let Token {
|
||||||
.peek()
|
kind,
|
||||||
.ok_or(("Expected identifier.", span_before))?
|
pos: mut span,
|
||||||
.pos();
|
} = toks.peek().ok_or(("Expected identifier.", span_before))?;
|
||||||
let mut text = String::new();
|
let mut text = String::new();
|
||||||
if toks.peek().unwrap().kind == '-' {
|
if kind == &'-' {
|
||||||
toks.next();
|
toks.next();
|
||||||
text.push('-');
|
text.push('-');
|
||||||
if toks.peek().is_none() {
|
|
||||||
return Ok(Spanned { node: text, span });
|
match toks.peek() {
|
||||||
}
|
Some(Token { kind: '-', .. }) => {
|
||||||
if toks.peek().unwrap().kind == '-' {
|
toks.next();
|
||||||
toks.next();
|
text.push('-');
|
||||||
text.push('-');
|
text.push_str(&ident_body_no_interpolation(toks, unit, span)?.node);
|
||||||
text.push_str(&ident_body_no_interpolation(toks, unit, span)?.node);
|
return Ok(Spanned { node: text, span });
|
||||||
return Ok(Spanned { node: text, span });
|
}
|
||||||
|
Some(..) => {}
|
||||||
|
None => return Ok(Spanned { node: text, span }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let first = match toks.peek() {
|
let first = match toks.next() {
|
||||||
Some(v) => v,
|
Some(v) => v,
|
||||||
None => return Err(("Expected identifier.", span).into()),
|
None => return Err(("Expected identifier.", span).into()),
|
||||||
};
|
};
|
||||||
|
|
||||||
if is_name_start(first.kind) {
|
if is_name_start(first.kind) {
|
||||||
text.push(toks.next().unwrap().kind);
|
text.push(first.kind);
|
||||||
} else if first.kind == '\\' {
|
} else if first.kind == '\\' {
|
||||||
toks.next();
|
|
||||||
text.push_str(&escape(toks, true)?);
|
text.push_str(&escape(toks, true)?);
|
||||||
} else {
|
} else {
|
||||||
return Err(("Expected identifier.", first.pos()).into());
|
return Err(("Expected identifier.", first.pos).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let body = ident_body_no_interpolation(toks, unit, span)?;
|
let body = ident_body_no_interpolation(toks, unit, span)?;
|
||||||
@ -325,6 +328,7 @@ pub(crate) fn parse_quoted_string<I: Iterator<Item = Token>>(
|
|||||||
if first.kind.is_ascii_hexdigit() {
|
if first.kind.is_ascii_hexdigit() {
|
||||||
let mut value = 0;
|
let mut value = 0;
|
||||||
for _ in 0..6 {
|
for _ in 0..6 {
|
||||||
|
// todo: or patterns
|
||||||
let next = match toks.peek() {
|
let next = match toks.peek() {
|
||||||
Some(c) => c,
|
Some(c) => c,
|
||||||
None => break,
|
None => break,
|
||||||
|
@ -61,17 +61,17 @@ pub(crate) fn eat_variable_value<I: Iterator<Item = Token>>(
|
|||||||
}
|
}
|
||||||
'#' => {
|
'#' => {
|
||||||
val_toks.push(toks.next().unwrap());
|
val_toks.push(toks.next().unwrap());
|
||||||
match toks.peek().unwrap().kind {
|
match toks.peek() {
|
||||||
'{' => nesting += 1,
|
Some(Token { kind: '{', .. }) => nesting += 1,
|
||||||
';' => break,
|
Some(Token { kind: ';', .. }) => break,
|
||||||
'}' => {
|
Some(Token { kind: '}', .. }) => {
|
||||||
if nesting == 0 {
|
if nesting == 0 {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
nesting -= 1;
|
nesting -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
Some(..) | None => {}
|
||||||
}
|
}
|
||||||
val_toks.push(toks.next().unwrap());
|
val_toks.push(toks.next().unwrap());
|
||||||
}
|
}
|
||||||
@ -86,9 +86,9 @@ pub(crate) fn eat_variable_value<I: Iterator<Item = Token>>(
|
|||||||
}
|
}
|
||||||
'/' => {
|
'/' => {
|
||||||
let next = toks.next().unwrap();
|
let next = toks.next().unwrap();
|
||||||
match toks.peek().unwrap().kind {
|
match toks.peek() {
|
||||||
'/' => read_until_newline(toks),
|
Some(Token { kind: '/', .. }) => read_until_newline(toks),
|
||||||
_ => val_toks.push(next),
|
Some(..) | None => val_toks.push(next),
|
||||||
};
|
};
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ pub(crate) fn eat_calc_args<I: Iterator<Item = Token>>(
|
|||||||
buf.push(' ');
|
buf.push(' ');
|
||||||
}
|
}
|
||||||
'#' => {
|
'#' => {
|
||||||
if toks.peek().is_some() && toks.peek().unwrap().kind == '{' {
|
if let Some(Token { kind: '{', .. }) = toks.peek() {
|
||||||
let span_before = toks.next().unwrap().pos();
|
let span_before = toks.next().unwrap().pos();
|
||||||
let interpolation =
|
let interpolation =
|
||||||
parse_interpolation(toks, scope, super_selector, span_before)?;
|
parse_interpolation(toks, scope, super_selector, span_before)?;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user