diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-09-15 13:12:07 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-09-15 13:12:07 +0200 |
| commit | ea921aca5d6268474383b6bac8fdd78de1f23c5a (patch) | |
| tree | 797aa10f026abab2c9bde6fef17026f83338dd11 /src | |
| parent | 5de791d9e6a1006dc6a017ec8e20a1c70a91a780 (diff) | |
Blocks directly in template also scope
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval/mod.rs | 8 | ||||
| -rw-r--r-- | src/parse/mod.rs | 10 | ||||
| -rw-r--r-- | src/syntax/expr.rs | 2 | ||||
| -rw-r--r-- | src/syntax/visit.rs | 8 |
4 files changed, 9 insertions, 19 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 9fe86ebe..58f7e4d7 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -269,9 +269,7 @@ impl Eval for BlockExpr { type Output = Value; fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { - if self.scoping { - ctx.scopes.enter(); - } + ctx.scopes.enter(); let mut output = Value::None; for expr in &self.exprs { @@ -279,9 +277,7 @@ impl Eval for BlockExpr { output = ops::join(output, value).at(expr.span())?; } - if self.scoping { - ctx.scopes.exit(); - } + ctx.scopes.exit(); Ok(output) } diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 7451384b..ee18e697 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -125,7 +125,7 @@ fn markup_node(p: &mut Parser, at_start: &mut bool) -> Option<MarkupNode> { } // Block and template. - Token::LeftBrace => return Some(MarkupNode::Expr(block(p, false))), + Token::LeftBrace => return Some(MarkupNode::Expr(block(p))), Token::LeftBracket => return Some(MarkupNode::Expr(template(p))), // Comments. @@ -316,7 +316,7 @@ fn primary(p: &mut Parser, atomic: bool) -> Option<Expr> { // Structures. Some(Token::LeftParen) => parenthesized(p), Some(Token::LeftBracket) => Some(template(p)), - Some(Token::LeftBrace) => Some(block(p, true)), + Some(Token::LeftBrace) => Some(block(p)), // Keywords. Some(Token::Let) => let_expr(p), @@ -527,7 +527,7 @@ fn template(p: &mut Parser) -> Expr { } /// Parse a code block: `{...}`. -fn block(p: &mut Parser, scoping: bool) -> Expr { +fn block(p: &mut Parser) -> Expr { p.start_group(Group::Brace, TokenMode::Code); let mut exprs = vec![]; while !p.eof() { @@ -544,7 +544,7 @@ fn block(p: &mut Parser, scoping: bool) -> Expr { p.eat_while(|t| matches!(t, Token::Space(_))); } let span = p.end_group(); - Expr::Block(Box::new(BlockExpr { span, exprs, scoping })) + Expr::Block(Box::new(BlockExpr { span, exprs })) } /// Parse a function call. @@ -789,7 +789,7 @@ fn ident(p: &mut Parser) -> Option<Ident> { fn body(p: &mut Parser) -> Option<Expr> { match p.peek() { Some(Token::LeftBracket) => Some(template(p)), - Some(Token::LeftBrace) => Some(block(p, true)), + Some(Token::LeftBrace) => Some(block(p)), _ => { p.expected_at(p.prev_end(), "body"); None diff --git a/src/syntax/expr.rs b/src/syntax/expr.rs index 11a85404..68b96f9c 100644 --- a/src/syntax/expr.rs +++ b/src/syntax/expr.rs @@ -190,8 +190,6 @@ pub struct BlockExpr { pub span: Span, /// The list of expressions contained in the block. pub exprs: Vec<Expr>, - /// Whether the block should create a scope. - pub scoping: bool, } /// A unary operation: `-x`. diff --git a/src/syntax/visit.rs b/src/syntax/visit.rs index d689209b..40e8eb93 100644 --- a/src/syntax/visit.rs +++ b/src/syntax/visit.rs @@ -158,15 +158,11 @@ impl_visitors! { } visit_block(v, block: BlockExpr) { - if block.scoping { - v.visit_enter(); - } + v.visit_enter(); for expr in r!(block.exprs) { v.visit_expr(expr); } - if block.scoping { - v.visit_exit(); - } + v.visit_exit(); } visit_binary(v, binary: BinaryExpr) { |
