diff --git a/src/atrule/if_rule.rs b/src/atrule/if_rule.rs index 98c3a90..c712fd1 100644 --- a/src/atrule/if_rule.rs +++ b/src/atrule/if_rule.rs @@ -1,4 +1,4 @@ -use codemap::Spanned; +use codemap::{Spanned, Span}; use peekmore::{PeekMore, PeekMoreIterator}; @@ -35,14 +35,21 @@ impl Branch { impl If { pub fn from_tokens>( toks: &mut PeekMoreIterator, + span_before: Span, ) -> SassResult { devour_whitespace_or_comment(toks)?; let mut branches = Vec::new(); let init_cond = read_until_open_curly_brace(toks); - toks.next(); + if toks.next().is_none() { + return Err(("Expected expression.", span_before).into()); + } devour_whitespace_or_comment(toks)?; let mut init_toks = read_until_closing_curly_brace(toks); - init_toks.push(toks.next().unwrap()); + if let Some(tok) = toks.next() { + init_toks.push(tok); + } else { + return Err(("expected \"}\".", span_before).into()) + } devour_whitespace(toks); branches.push(Branch::new(init_cond, init_toks)); diff --git a/src/atrule/mod.rs b/src/atrule/mod.rs index f6212c9..afb5c4c 100644 --- a/src/atrule/mod.rs +++ b/src/atrule/mod.rs @@ -216,7 +216,7 @@ impl AtRule { span: kind_span, }, AtRuleKind::If => Spanned { - node: AtRule::If(If::from_tokens(toks)?), + node: AtRule::If(If::from_tokens(toks, kind_span)?), span: kind_span, }, AtRuleKind::For => Spanned { diff --git a/tests/if.rs b/tests/if.rs index 6bd6cc7..56ec776 100644 --- a/tests/if.rs +++ b/tests/if.rs @@ -108,3 +108,13 @@ test!( "@if false {}\n\n@\\45lse {\n a {\n color: red;\n }\n}\n", "a {\n color: red;\n}\n" ); +error!( + nothing_after_if, + "@if", + "Error: Expected expression." +); +error!( + nothing_after_open_curly, + "@if foo {", + "Error: expected \"}\"." +);