summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-09-15 13:12:07 +0200
committerLaurenz <laurmaedje@gmail.com>2021-09-15 13:12:07 +0200
commitea921aca5d6268474383b6bac8fdd78de1f23c5a (patch)
tree797aa10f026abab2c9bde6fef17026f83338dd11 /src
parent5de791d9e6a1006dc6a017ec8e20a1c70a91a780 (diff)
Blocks directly in template also scope
Diffstat (limited to 'src')
-rw-r--r--src/eval/mod.rs8
-rw-r--r--src/parse/mod.rs10
-rw-r--r--src/syntax/expr.rs2
-rw-r--r--src/syntax/visit.rs8
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) {