diff options
author | René Kijewski <kijewski@library.vetmed.fu-berlin.de> | 2022-01-31 08:38:44 +0100 |
---|---|---|
committer | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2022-01-31 12:02:43 +0100 |
commit | cd744f0aa705882f0e4fd0466e24cdbccf9fc28f (patch) | |
tree | 352b3e6e30d2713e4eea0447e4edc236d05dd0fb | |
parent | 91874702f0f3581549c129369a8bc0783006b5fa (diff) | |
download | askama-cd744f0aa705882f0e4fd0466e24cdbccf9fc28f.tar.gz askama-cd744f0aa705882f0e4fd0466e24cdbccf9fc28f.tar.bz2 askama-cd744f0aa705882f0e4fd0466e24cdbccf9fc28f.zip |
Make is_shadowing_variable() failable
-rw-r--r-- | askama_shared/src/generator.rs | 36 | ||||
-rw-r--r-- | testing/tests/ui/lit_on_assignment_lhs.stderr | 6 |
2 files changed, 27 insertions, 15 deletions
diff --git a/askama_shared/src/generator.rs b/askama_shared/src/generator.rs index 7080b87..acd716b 100644 --- a/askama_shared/src/generator.rs +++ b/askama_shared/src/generator.rs @@ -804,26 +804,38 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> { buf.writeln(";") } - fn is_shadowing_variable(&self, var: &Target<'a>) -> bool { + fn is_shadowing_variable(&self, var: &Target<'a>) -> Result<bool, CompileError> { match var { Target::Name(name) => { let name = normalize_identifier(name); match self.locals.get(&name) { // declares a new variable - None => false, + None => Ok(false), // an initialized variable gets shadowed - Some(meta) if meta.initialized => true, + Some(meta) if meta.initialized => Ok(true), // initializes a variable that was introduced in a LetDecl before - _ => false, + _ => Ok(false), } } - Target::Tuple(_, targets) => targets - .iter() - .any(|target| self.is_shadowing_variable(target)), - Target::Struct(_, named_targets) => named_targets - .iter() - .any(|(_, target)| self.is_shadowing_variable(target)), - _ => panic!("Cannot have literals on the left-hand-side of an assignment."), + Target::Tuple(_, targets) => { + for target in targets { + match self.is_shadowing_variable(target) { + Ok(false) => continue, + outcome => return outcome, + } + } + Ok(false) + } + Target::Struct(_, named_targets) => { + for (_, target) in named_targets { + match self.is_shadowing_variable(target) { + Ok(false) => continue, + outcome => return outcome, + } + } + Ok(false) + } + _ => Err("literals are not allowed on the left-hand side of an assignment".into()), } } @@ -838,7 +850,7 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> { let mut expr_buf = Buffer::new(0); self.visit_expr(&mut expr_buf, val)?; - let shadowed = self.is_shadowing_variable(var); + let shadowed = self.is_shadowing_variable(var)?; if shadowed { // Need to flush the buffer if the variable is being shadowed, // to ensure the old variable is used. diff --git a/testing/tests/ui/lit_on_assignment_lhs.stderr b/testing/tests/ui/lit_on_assignment_lhs.stderr index fa488cb..53bfc81 100644 --- a/testing/tests/ui/lit_on_assignment_lhs.stderr +++ b/testing/tests/ui/lit_on_assignment_lhs.stderr @@ -1,7 +1,7 @@ -error: proc-macro derive panicked - --> $DIR/lit_on_assignment_lhs.rs:3:10 +error: literals are not allowed on the left-hand side of an assignment + --> tests/ui/lit_on_assignment_lhs.rs:3:10 | 3 | #[derive(Template)] | ^^^^^^^^ | - = help: message: Cannot have literals on the left-hand-side of an assignment. + = note: this error originates in the derive macro `Template` (in Nightly builds, run with -Z macro-backtrace for more info) |