deny mixins in functions, control flow, and mixins

This commit is contained in:
Connor Skees 2020-07-10 22:03:15 -04:00
parent 005f0e52e8
commit b4bdd2f926
2 changed files with 42 additions and 0 deletions

View File

@ -18,6 +18,19 @@ impl<'a> Parser<'a> {
pub(super) fn parse_mixin(&mut self) -> SassResult<()> { pub(super) fn parse_mixin(&mut self) -> SassResult<()> {
self.whitespace(); self.whitespace();
let Spanned { node: name, span } = self.parse_identifier()?; let Spanned { node: name, span } = self.parse_identifier()?;
if self.flags.in_mixin() {
return Err(("Mixins may not contain mixin declarations.", span).into());
}
if self.flags.in_function() {
return Err(("This at-rule is not allowed here.", span).into());
}
if self.flags.in_control_flow() {
return Err(("Mixins may not be declared in control directives.", span).into());
}
self.whitespace(); self.whitespace();
let args = match self.toks.next() { let args = match self.toks.next() {
Some(Token { kind: '(', .. }) => self.parse_func_args()?, Some(Token { kind: '(', .. }) => self.parse_func_args()?,

View File

@ -449,3 +449,32 @@ test!(
}", }",
"a {\n color: foo;\n color: foo;\n}\n" "a {\n color: foo;\n color: foo;\n}\n"
); );
error!(
mixin_in_function,
"@function foo() {
@mixin bar {}
}
a {
color: foo();
}
",
"Error: This at-rule is not allowed here."
);
error!(
mixin_in_mixin,
"@mixin foo {
@mixin bar {}
}
a {
@include foo;
}
",
"Error: Mixins may not contain mixin declarations."
);
error!(
mixin_in_control_directives,
"@if true {
@mixin bar {}
}",
"Error: Mixins may not be declared in control directives."
);