diff options
Diffstat (limited to '')
| -rw-r--r-- | askama_derive/src/generator.rs | 43 | ||||
| -rw-r--r-- | askama_derive/src/input.rs | 46 | 
2 files changed, 45 insertions, 44 deletions
| diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index 3374161..21b8d25 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -31,7 +31,7 @@ pub(crate) fn build_template(ast: &syn::DeriveInput) -> Result<String, CompileEr      };      let mut templates = HashMap::new(); -    find_used_templates(&input, &mut templates, source)?; +    input.find_used_templates(&mut templates, source)?;      let mut contexts = HashMap::new();      for (path, parsed) in &templates { @@ -66,47 +66,6 @@ pub(crate) fn build_template(ast: &syn::DeriveInput) -> Result<String, CompileEr      Ok(code)  } -fn find_used_templates( -    input: &TemplateInput<'_>, -    map: &mut HashMap<PathBuf, Parsed>, -    source: String, -) -> Result<(), CompileError> { -    let mut dependency_graph = Vec::new(); -    let mut check = vec![(input.path.clone(), source)]; -    while let Some((path, source)) = check.pop() { -        let parsed = Parsed::new(source, input.syntax)?; -        for n in parsed.nodes() { -            match n { -                Node::Extends(extends) => { -                    let extends = input.config.find_template(extends.path, Some(&path))?; -                    let dependency_path = (path.clone(), extends.clone()); -                    if dependency_graph.contains(&dependency_path) { -                        return Err(format!( -                            "cyclic dependency in graph {:#?}", -                            dependency_graph -                                .iter() -                                .map(|e| format!("{:#?} --> {:#?}", e.0, e.1)) -                                .collect::<Vec<String>>() -                        ) -                        .into()); -                    } -                    dependency_graph.push(dependency_path); -                    let source = get_template_source(&extends)?; -                    check.push((extends, source)); -                } -                Node::Import(import) => { -                    let import = input.config.find_template(import.path, Some(&path))?; -                    let source = get_template_source(&import)?; -                    check.push((import, source)); -                } -                _ => {} -            } -        } -        map.insert(path, parsed); -    } -    Ok(()) -} -  struct Generator<'a> {      // The template input state: original struct AST and attributes      input: &'a TemplateInput<'a>, diff --git a/askama_derive/src/input.rs b/askama_derive/src/input.rs index 5977058..03817f1 100644 --- a/askama_derive/src/input.rs +++ b/askama_derive/src/input.rs @@ -1,3 +1,4 @@ +use std::collections::hash_map::HashMap;  use std::path::{Path, PathBuf};  use std::str::FromStr; @@ -5,9 +6,9 @@ use mime::Mime;  use quote::ToTokens;  use syn::punctuated::Punctuated; -use crate::config::Config; +use crate::config::{get_template_source, Config};  use crate::CompileError; -use parser::Syntax; +use parser::{Node, Parsed, Syntax};  pub(crate) struct TemplateInput<'a> {      pub(crate) ast: &'a syn::DeriveInput, @@ -100,6 +101,47 @@ impl TemplateInput<'_> {          })      } +    pub(crate) fn find_used_templates( +        &self, +        map: &mut HashMap<PathBuf, Parsed>, +        source: String, +    ) -> Result<(), CompileError> { +        let mut dependency_graph = Vec::new(); +        let mut check = vec![(self.path.clone(), source)]; +        while let Some((path, source)) = check.pop() { +            let parsed = Parsed::new(source, self.syntax)?; +            for n in parsed.nodes() { +                match n { +                    Node::Extends(extends) => { +                        let extends = self.config.find_template(extends.path, Some(&path))?; +                        let dependency_path = (path.clone(), extends.clone()); +                        if dependency_graph.contains(&dependency_path) { +                            return Err(format!( +                                "cyclic dependency in graph {:#?}", +                                dependency_graph +                                    .iter() +                                    .map(|e| format!("{:#?} --> {:#?}", e.0, e.1)) +                                    .collect::<Vec<String>>() +                            ) +                            .into()); +                        } +                        dependency_graph.push(dependency_path); +                        let source = get_template_source(&extends)?; +                        check.push((extends, source)); +                    } +                    Node::Import(import) => { +                        let import = self.config.find_template(import.path, Some(&path))?; +                        let source = get_template_source(&import)?; +                        check.push((import, source)); +                    } +                    _ => {} +                } +            } +            map.insert(path, parsed); +        } +        Ok(()) +    } +      #[inline]      pub(crate) fn extension(&self) -> Option<&str> {          ext_default_to_path(self.ext.as_deref(), &self.path) | 
