summaryrefslogtreecommitdiff
path: root/src/eval/capture.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/capture.rs')
-rw-r--r--src/eval/capture.rs39
1 files changed, 11 insertions, 28 deletions
diff --git a/src/eval/capture.rs b/src/eval/capture.rs
index 74da4747..64275e93 100644
--- a/src/eval/capture.rs
+++ b/src/eval/capture.rs
@@ -2,7 +2,7 @@ use std::rc::Rc;
use super::{Scope, Scopes, Value};
use crate::syntax::visit::{visit_expr, Visit};
-use crate::syntax::{Expr, Ident, Node};
+use crate::syntax::{Expr, Ident};
/// A visitor that captures variable slots.
#[derive(Debug)]
@@ -26,37 +26,20 @@ impl<'a> CapturesVisitor<'a> {
pub fn finish(self) -> Scope {
self.captures
}
-
- /// Find out whether the name is not locally defined and if so if it can be
- /// captured.
- fn process(&mut self, name: &str) {
- if self.internal.get(name).is_none() {
- if let Some(slot) = self.external.get(name) {
- self.captures.def_slot(name, Rc::clone(slot));
- }
- }
- }
}
impl<'ast> Visit<'ast> for CapturesVisitor<'_> {
- fn visit_node(&mut self, node: &'ast Node) {
- match node {
- Node::Text(_) => {}
- Node::Space => {}
- Node::Linebreak(_) => self.process(Node::LINEBREAK),
- Node::Parbreak(_) => self.process(Node::PARBREAK),
- Node::Strong(_) => self.process(Node::STRONG),
- Node::Emph(_) => self.process(Node::EMPH),
- Node::Heading(_) => self.process(Node::HEADING),
- Node::Raw(_) => self.process(Node::RAW),
- Node::Expr(expr) => self.visit_expr(expr),
- }
- }
-
fn visit_expr(&mut self, node: &'ast Expr) {
- match node {
- Expr::Ident(ident) => self.process(ident),
- expr => visit_expr(self, expr),
+ if let Expr::Ident(ident) = node {
+ // Find out whether the name is not locally defined and if so if it
+ // can be captured.
+ if self.internal.get(ident).is_none() {
+ if let Some(slot) = self.external.get(ident) {
+ self.captures.def_slot(ident.as_str(), Rc::clone(slot));
+ }
+ }
+ } else {
+ visit_expr(self, node);
}
}