aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askama_derive/src/generator.rs23
-rw-r--r--askama_derive/src/input.rs26
-rw-r--r--testing/tests/inheritance.rs44
3 files changed, 41 insertions, 52 deletions
diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs
index 5b8c19e..5921609 100644
--- a/askama_derive/src/generator.rs
+++ b/askama_derive/src/generator.rs
@@ -293,11 +293,6 @@ impl<'a> Generator<'a> {
// Takes a Context and generates the relevant implementations.
fn build(mut self, ctx: &'a Context<'_>) -> Result<String, CompileError> {
let mut buf = Buffer::new(0);
- if !ctx.blocks.is_empty() {
- if let Some(parent) = self.input.parent {
- self.deref_to_parent(&mut buf, parent)?;
- }
- };
self.impl_template(ctx, &mut buf)?;
self.impl_display(&mut buf)?;
@@ -378,24 +373,6 @@ impl<'a> Generator<'a> {
Ok(())
}
- // Implement `Deref<Parent>` for an inheriting context struct.
- fn deref_to_parent(
- &mut self,
- buf: &mut Buffer,
- parent_type: &syn::Type,
- ) -> Result<(), CompileError> {
- self.write_header(buf, "::std::ops::Deref", None)?;
- buf.writeln(&format!(
- "type Target = {};",
- parent_type.into_token_stream()
- ))?;
- buf.writeln("#[inline]")?;
- buf.writeln("fn deref(&self) -> &Self::Target {")?;
- buf.writeln("&self._parent")?;
- buf.writeln("}")?;
- buf.writeln("}")
- }
-
// Implement `Display` for the given context struct.
fn impl_display(&mut self, buf: &mut Buffer) -> Result<(), CompileError> {
self.write_header(buf, "::std::fmt::Display", None)?;
diff --git a/askama_derive/src/input.rs b/askama_derive/src/input.rs
index c09f3d0..68d01db 100644
--- a/askama_derive/src/input.rs
+++ b/askama_derive/src/input.rs
@@ -16,15 +16,13 @@ pub(crate) struct TemplateInput<'a> {
pub(crate) escaper: &'a str,
pub(crate) ext: Option<String>,
pub(crate) mime_type: String,
- pub(crate) parent: Option<&'a syn::Type>,
pub(crate) path: PathBuf,
}
impl TemplateInput<'_> {
/// Extract the template metadata from the `DeriveInput` structure. This
/// mostly recovers the data for the `TemplateInput` fields from the
- /// `template()` attribute list fields; it also finds the of the `_parent`
- /// field, if any.
+ /// `template()` attribute list fields.
pub(crate) fn new<'n>(
ast: &'n syn::DeriveInput,
config: &'n Config<'_>,
@@ -51,27 +49,6 @@ impl TemplateInput<'_> {
}
};
- // Check to see if a `_parent` field was defined on the context
- // struct, and store the type for it for use in the code generator.
- let parent = match ast.data {
- syn::Data::Struct(syn::DataStruct {
- fields: syn::Fields::Named(ref fields),
- ..
- }) => fields
- .named
- .iter()
- .find(|f| f.ident.as_ref().filter(|name| *name == "_parent").is_some())
- .map(|f| &f.ty),
- _ => None,
- };
-
- if parent.is_some() {
- eprint!(
- " --> in struct {}\n = use of deprecated field '_parent'\n",
- ast.ident
- );
- }
-
// Validate syntax
let syntax = syntax.map_or_else(
|| Ok(config.syntaxes.get(config.default_syntax).unwrap()),
@@ -117,7 +94,6 @@ impl TemplateInput<'_> {
escaper,
ext,
mime_type,
- parent,
path,
})
}
diff --git a/testing/tests/inheritance.rs b/testing/tests/inheritance.rs
index 2dac362..5d8aefb 100644
--- a/testing/tests/inheritance.rs
+++ b/testing/tests/inheritance.rs
@@ -1,3 +1,5 @@
+use std::ops::Deref;
+
use askama::Template;
#[derive(Template)]
@@ -9,7 +11,15 @@ struct BaseTemplate<'a> {
#[derive(Template)]
#[template(path = "child.html")]
struct ChildTemplate<'a> {
- _parent: BaseTemplate<'a>,
+ _parent: &'a BaseTemplate<'a>,
+}
+
+impl<'a> Deref for ChildTemplate<'a> {
+ type Target = BaseTemplate<'a>;
+
+ fn deref(&self) -> &Self::Target {
+ self._parent
+ }
}
#[test]
@@ -21,7 +31,7 @@ fn test_use_base_directly() {
#[test]
fn test_simple_extends() {
let t = ChildTemplate {
- _parent: BaseTemplate { title: "Bar" },
+ _parent: &BaseTemplate { title: "Bar" },
};
assert_eq!(
t.render().unwrap(),
@@ -43,6 +53,7 @@ fn test_empty_child() {
pub mod parent {
use askama::Template;
+
#[derive(Template)]
#[template(path = "base.html")]
pub struct BaseTemplate<'a> {
@@ -53,17 +64,26 @@ pub mod parent {
pub mod child {
use super::parent::*;
use askama::Template;
+
#[derive(Template)]
#[template(path = "child.html")]
pub struct ChildTemplate<'a> {
- pub _parent: BaseTemplate<'a>,
+ pub _parent: &'a BaseTemplate<'a>,
+ }
+
+ impl<'a> std::ops::Deref for ChildTemplate<'a> {
+ type Target = BaseTemplate<'a>;
+
+ fn deref(&self) -> &Self::Target {
+ self._parent
+ }
}
}
#[test]
fn test_different_module() {
let t = child::ChildTemplate {
- _parent: parent::BaseTemplate { title: "a" },
+ _parent: &parent::BaseTemplate { title: "a" },
};
assert_eq!(
t.render().unwrap(),
@@ -81,6 +101,14 @@ struct NestedChildTemplate {
_parent: NestedBaseTemplate,
}
+impl Deref for NestedChildTemplate {
+ type Target = NestedBaseTemplate;
+
+ fn deref(&self) -> &Self::Target {
+ &self._parent
+ }
+}
+
#[test]
fn test_nested_blocks() {
let t = NestedChildTemplate {
@@ -109,6 +137,14 @@ struct DeepKidTemplate {
item: String,
}
+impl Deref for DeepKidTemplate {
+ type Target = DeepMidTemplate;
+
+ fn deref(&self) -> &Self::Target {
+ &self._parent
+ }
+}
+
#[test]
fn test_deep() {
let t = DeepKidTemplate {