This commit is contained in:
ConnorSkees 2020-02-17 09:37:34 -05:00
parent 36ec80e0da
commit bb16060ddb

View File

@ -327,7 +327,7 @@ struct StyleSheetParser<'a> {
impl<'a> StyleSheetParser<'a> { impl<'a> StyleSheetParser<'a> {
fn parse_toplevel(mut self) -> SassResult<(Vec<Stmt>, Scope)> { fn parse_toplevel(mut self) -> SassResult<(Vec<Stmt>, Scope)> {
let mut rules: Vec<Stmt> = Vec::new(); let mut rules: Vec<Stmt> = Vec::new();
while let Some(Token { kind, pos }) = self.lexer.peek() { while let Some(Token { kind, .. }) = self.lexer.peek() {
match kind { match kind {
TokenKind::Ident(_) TokenKind::Ident(_)
| TokenKind::Attribute(_) | TokenKind::Attribute(_)
@ -361,7 +361,8 @@ impl<'a> StyleSheetParser<'a> {
{ {
self.error(pos, "unexpected variable use at toplevel"); self.error(pos, "unexpected variable use at toplevel");
} }
let VariableDecl { val, default } = eat_variable_value(&mut self.lexer, &self.global_scope)?; let VariableDecl { val, default } =
eat_variable_value(&mut self.lexer, &self.global_scope)?;
if !default || self.global_scope.get_var(&name).is_err() { if !default || self.global_scope.get_var(&name).is_err() {
self.global_scope.insert_var(&name, val); self.global_scope.insert_var(&name, val);
} }
@ -378,9 +379,11 @@ impl<'a> StyleSheetParser<'a> {
}; };
rules.push(Stmt::MultilineComment(comment)); rules.push(Stmt::MultilineComment(comment));
} }
TokenKind::AtRule(AtRuleKind::Include) => { TokenKind::AtRule(AtRuleKind::Include) => rules.extend(eat_include(
rules.extend(eat_include(&mut self.lexer, &self.global_scope, &Selector(Vec::new()))?) &mut self.lexer,
} &self.global_scope,
&Selector(Vec::new()),
)?),
TokenKind::AtRule(AtRuleKind::Import) => { TokenKind::AtRule(AtRuleKind::Import) => {
let Token { pos, .. } = self let Token { pos, .. } = self
.lexer .lexer
@ -437,16 +440,22 @@ impl<'a> StyleSheetParser<'a> {
AtRule::Function(name, func) => { AtRule::Function(name, func) => {
self.global_scope.insert_fn(&name, *func); self.global_scope.insert_fn(&name, *func);
} }
AtRule::Charset(toks) => rules.push(Stmt::AtRule(AtRule::Charset(toks))), AtRule::Charset(toks) => {
rules.push(Stmt::AtRule(AtRule::Charset(toks)))
}
AtRule::Error(pos, message) => self.error(pos, &message), AtRule::Error(pos, message) => self.error(pos, &message),
AtRule::Warn(pos, message) => self.warn(pos, &message), AtRule::Warn(pos, message) => self.warn(pos, &message),
AtRule::Debug(pos, message) => self.debug(pos, &message), AtRule::Debug(pos, message) => self.debug(pos, &message),
AtRule::Return(_) => return Err("This at-rule is not allowed here.".into()), AtRule::Return(_) => {
return Err("This at-rule is not allowed here.".into())
}
} }
} }
} }
TokenKind::Symbol(Symbol::BitAnd) => { TokenKind::Symbol(Symbol::BitAnd) => {
return Err(SassError::new("Base-level rules cannot contain the parent-selector-referencing character '&'.", *pos)) return Err(
"Top-level selectors may not contain the parent selector \"&\".".into(),
)
} }
_ => match dbg!(self.lexer.next()) { _ => match dbg!(self.lexer.next()) {
Some(Token { pos, .. }) => self.error(pos, "unexpected toplevel token"), Some(Token { pos, .. }) => self.error(pos, "unexpected toplevel token"),