From f6811898ebcb3a4a5853056d6bb1f5920776fbf2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 4 Oct 2012 13:57:25 -0500 Subject: handle defaulting to variables more sanely --- lib/Text/Xslate/Syntax/Handlebars.pm | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index 59ece35..5ec07b5 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -196,6 +196,8 @@ sub preprocess { sub init_symbols { my $self = shift; + $self->symbol('(variable)')->set_nud($self->can('nud_variable')); + $self->infix('.', 256, $self->can('led_dot')); $self->infix('/', 256, $self->can('led_dot')); @@ -215,16 +217,11 @@ sub nud_name { my $self = shift; my ($symbol) = @_; - if ($symbol->is_defined) { - return $self->call( - $self->SUPER::nud_name($symbol), - # XXX this won't handle multiple arguments - $self->expression($symbol->lbp), - ); - } - else { - return $self->nud_variable(@_); - } + return $self->call( + $self->SUPER::nud_name($symbol), + # XXX this won't handle multiple arguments + $self->expression($symbol->lbp), + ); } sub nud_variable { @@ -426,6 +423,13 @@ sub std_partial { ); } +sub undefined_name { + my $self = shift; + my ($name) = @_; + + return $self->symbol('(variable)')->clone(id => $name); +} + sub define_function { my $self = shift; my (@names) = @_; @@ -442,8 +446,12 @@ sub is_valid_field { my $self = shift; my ($field) = @_; + # undefined symbols are all treated as variables - see undefined_name + return 1 if $field->arity eq 'variable'; + # allow ../../foo return 1 if $field->id eq '..'; - return $self->SUPER::is_valid_field(@_); + + return; } sub make_field_lookup { -- cgit v1.2.3-54-g00ecf