diff options
| author | 2018-09-02 15:25:47 +0200 | |
|---|---|---|
| committer | 2018-09-02 16:00:54 +0200 | |
| commit | 16b577e3070ca935180652e7ce24563bd396babc (patch) | |
| tree | d727345845ad67f791a09b5405eccf569d4e81e9 /askama_derive/src | |
| parent | 979dd1ea1115a52a3225fa5b1c706aeb70b84b5f (diff) | |
| download | askama-16b577e3070ca935180652e7ce24563bd396babc.tar.gz askama-16b577e3070ca935180652e7ce24563bd396babc.tar.bz2 askama-16b577e3070ca935180652e7ce24563bd396babc.zip | |
Fix nested macro calls into different scopes
Diffstat (limited to '')
| -rw-r--r-- | askama_derive/src/generator.rs | 29 | 
1 files changed, 18 insertions, 11 deletions
| diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index cf3a950..a64d72d 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -263,7 +263,7 @@ impl<'a> Generator<'a> {                      self.write_loop(ctx, buf, ws1, var, iter, body, ws2);                  }                  Node::BlockDef(ws1, name, _, ws2) => { -                    if let AstLevel::Nested = level { +                    if let AstLevel::Nested(_) = level {                          panic!(                              "blocks ('{}') are only allowed at the top level of a template \                               or another block", @@ -277,7 +277,7 @@ impl<'a> Generator<'a> {                      self.handle_include(ctx, buf, ws, path);                  }                  Node::Call(ws, scope, name, ref args) => { -                    self.write_call(ctx, buf, ws, scope, name, args); +                    self.write_call(ctx, buf, ws, scope, name, args, level);                  }                  Node::Macro(_, ref m) => {                      if level != AstLevel::Top { @@ -324,7 +324,7 @@ impl<'a> Generator<'a> {              }              buf.writeln(" {");              self.locals.push(); -            self.handle(ctx, nodes, buf, AstLevel::Nested); +            self.handle(ctx, nodes, buf, AstLevel::Nested(None));              self.locals.pop();          }          self.handle_ws(buf, ws); @@ -374,7 +374,7 @@ impl<'a> Generator<'a> {              }              buf.writeln(" => {");              self.handle_ws(buf, ws); -            self.handle(ctx, body, buf, AstLevel::Nested); +            self.handle(ctx, body, buf, AstLevel::Nested(None));              buf.writeln("}");              self.locals.pop();          } @@ -405,7 +405,7 @@ impl<'a> Generator<'a> {          }          buf.writeln(&format!(") in (&{}).into_iter().enumerate() {{", expr_code)); -        self.handle(ctx, body, buf, AstLevel::Nested); +        self.handle(ctx, body, buf, AstLevel::Nested(None));          self.handle_ws(buf, ws2);          buf.writeln("}");          self.locals.pop(); @@ -419,13 +419,20 @@ impl<'a> Generator<'a> {          scope: Option<&str>,          name: &str,          args: &[Expr], +        level: AstLevel,      ) {          if name == "super" {              self.write_block(buf, None, ws);              return;          } -        let def = if let Some(s) = scope { +        let def = if let Some(s) = match scope { +            None => match level { +                AstLevel::Nested(s) => s, +                _ => None +            }, +            s => s, +        } {              let path = ctx.imports                  .get(s)                  .unwrap_or_else(|| panic!("no import found for scope '{}'", s)); @@ -454,7 +461,7 @@ impl<'a> Generator<'a> {              buf.writeln(&format!("let {} = &{};", arg, expr_code));              self.locals.insert(arg);          } -        self.handle(ctx, &def.nodes, buf, AstLevel::Nested); +        self.handle(ctx, &def.nodes, buf, AstLevel::Nested(scope));          self.flush_ws(buf, def.ws2);          buf.writeln("}"); @@ -473,7 +480,7 @@ impl<'a> Generator<'a> {              // Since nodes must not outlive the Generator, we instantiate              // a nested Generator here to handle the include's nodes.              let mut gen = self.child(); -            gen.handle(ctx, &nodes, buf, AstLevel::Nested); +            gen.handle(ctx, &nodes, buf, AstLevel::Nested(None));          }          self.prepare_ws(ws);      } @@ -1004,13 +1011,13 @@ where  }  #[derive(Clone, PartialEq)] -enum AstLevel { +enum AstLevel<'a> {      Top,      Block, -    Nested, +    Nested(Option<&'a str>),  } -impl Copy for AstLevel {} +impl<'a> Copy for AstLevel<'a> {}  #[derive(Clone)]  enum DisplayWrap { | 
