From ea921aca5d6268474383b6bac8fdd78de1f23c5a Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 15 Sep 2021 13:12:07 +0200 Subject: [PATCH] Blocks directly in template also scope --- src/eval/mod.rs | 8 ++------ src/parse/mod.rs | 10 +++++----- src/syntax/expr.rs | 2 -- src/syntax/visit.rs | 8 ++------ tests/typ/code/block.typ | 4 +++- tests/typ/code/import.typ | 2 -- 6 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 9fe86ebe8..58f7e4d7a 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 { - 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 7451384bb..ee18e6976 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 { } // 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 { // 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 { fn body(p: &mut Parser) -> Option { 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 11a854043..68b96f9cf 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, - /// 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 d689209b1..40e8eb93c 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) { diff --git a/tests/typ/code/block.typ b/tests/typ/code/block.typ index a54df4619..45ee92045 100644 --- a/tests/typ/code/block.typ +++ b/tests/typ/code/block.typ @@ -58,8 +58,10 @@ } --- -// Block in template does not create a scope. +// Block directly in template also creates a scope. { let x = 1 } + +// Error: 7-8 unknown variable #test(x, 1) --- diff --git a/tests/typ/code/import.typ b/tests/typ/code/import.typ index 953b522e1..bc96e80c8 100644 --- a/tests/typ/code/import.typ +++ b/tests/typ/code/import.typ @@ -21,8 +21,6 @@ test(b, 1) } -#test(b, 1) - // A wildcard import. #import * from "target.typ"