mirror of
https://github.com/askama-rs/askama.git
synced 2025-10-02 23:35:07 +00:00
Inline scope tracking abstraction again
This commit is contained in:
parent
1a9a82ac7d
commit
8bda0d64d5
@ -181,24 +181,6 @@ impl<'a> Generator<'a> {
|
|||||||
self.prepare_ws(ws);
|
self.prepare_ws(ws);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper methods for dealing with scope */
|
|
||||||
|
|
||||||
fn is_local(&self, var: &str) -> bool {
|
|
||||||
self.locals.contains(&var)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_local<'s>(&mut self, var: &'a str) {
|
|
||||||
self.locals.insert(var);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn push_scope(&mut self) {
|
|
||||||
self.locals.push();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn pop_scope(&mut self) {
|
|
||||||
self.locals.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Visitor methods for expression types */
|
/* Visitor methods for expression types */
|
||||||
|
|
||||||
fn visit_num_lit(&mut self, s: &str) {
|
fn visit_num_lit(&mut self, s: &str) {
|
||||||
@ -210,7 +192,7 @@ impl<'a> Generator<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_var(&mut self, s: &str) {
|
fn visit_var(&mut self, s: &str) {
|
||||||
if self.is_local(s) {
|
if self.locals.contains(s) {
|
||||||
self.write(s);
|
self.write(s);
|
||||||
} else {
|
} else {
|
||||||
self.write(&format!("self.{}", s));
|
self.write(&format!("self.{}", s));
|
||||||
@ -358,11 +340,11 @@ impl<'a> Generator<'a> {
|
|||||||
fn write_loop(&mut self, ws1: &WS, var: &'a Target, iter: &Expr,
|
fn write_loop(&mut self, ws1: &WS, var: &'a Target, iter: &Expr,
|
||||||
body: &'a [Node], ws2: &WS) {
|
body: &'a [Node], ws2: &WS) {
|
||||||
self.handle_ws(ws1);
|
self.handle_ws(ws1);
|
||||||
self.push_scope();
|
self.locals.push();
|
||||||
self.write("for (_loop_index, ");
|
self.write("for (_loop_index, ");
|
||||||
let targets = self.visit_target(var);
|
let targets = self.visit_target(var);
|
||||||
for name in &targets {
|
for name in &targets {
|
||||||
self.make_local(name);
|
self.locals.insert(name);
|
||||||
self.write(name);
|
self.write(name);
|
||||||
}
|
}
|
||||||
self.write(") in (&");
|
self.write(") in (&");
|
||||||
@ -372,7 +354,7 @@ impl<'a> Generator<'a> {
|
|||||||
self.handle(body);
|
self.handle(body);
|
||||||
self.handle_ws(ws2);
|
self.handle_ws(ws2);
|
||||||
self.writeln("}");
|
self.writeln("}");
|
||||||
self.pop_scope();
|
self.locals.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_block(&mut self, ws1: &WS, name: &str, ws2: &WS) {
|
fn write_block(&mut self, ws1: &WS, name: &str, ws2: &WS) {
|
||||||
@ -592,8 +574,8 @@ impl<'a, T: 'a> SetChain<'a, T> where T: cmp::Eq + hash::Hash {
|
|||||||
fn with_parent<'p>(parent: &'p SetChain<T>) -> SetChain<'p, T> {
|
fn with_parent<'p>(parent: &'p SetChain<T>) -> SetChain<'p, T> {
|
||||||
SetChain { parent: Some(parent), scopes: vec![HashSet::new()] }
|
SetChain { parent: Some(parent), scopes: vec![HashSet::new()] }
|
||||||
}
|
}
|
||||||
fn contains(&self, val: &T) -> bool {
|
fn contains(&self, val: T) -> bool {
|
||||||
self.scopes.iter().rev().any(|set| set.contains(val)) ||
|
self.scopes.iter().rev().any(|set| set.contains(&val)) ||
|
||||||
match self.parent {
|
match self.parent {
|
||||||
Some(set) => set.contains(val),
|
Some(set) => set.contains(val),
|
||||||
None => false,
|
None => false,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user