From: Arthur Axel "fREW" Schmidt Date: Fri, 10 Sep 2010 04:14:55 +0000 (+0000) Subject: initial start of warn-style caller info X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=637bb22cb431db6283cafc3770f30fcee44eb5e4;p=scpubgit%2FQ-Branch.git initial start of warn-style caller info --- diff --git a/lib/SQL/Abstract/Tree.pm b/lib/SQL/Abstract/Tree.pm index ada82df..28a276c 100644 --- a/lib/SQL/Abstract/Tree.pm +++ b/lib/SQL/Abstract/Tree.pm @@ -29,6 +29,7 @@ use base 'Class::Accessor::Grouped'; __PACKAGE__->mk_group_accessors( simple => $_ ) for qw( newline indent_string indent_amount colormap indentmap fill_in_placeholders + include_caller caller_depth ); # Parser states for _recurse_parse() @@ -122,6 +123,7 @@ my %indents = ( my %profiles = ( console => { + caller_depth => 0, fill_in_placeholders => 1, indent_string => ' ', indent_amount => 2, @@ -130,6 +132,7 @@ my %profiles = ( indentmap => { %indents }, }, console_monochrome => { + caller_depth => 0, fill_in_placeholders => 1, indent_string => ' ', indent_amount => 2, @@ -138,6 +141,7 @@ my %profiles = ( indentmap => { %indents }, }, html => { + caller_depth => 0, fill_in_placeholders => 1, indent_string => ' ', indent_amount => 2, @@ -332,7 +336,7 @@ sub _fill_in_placeholder { my ($self, $bindargs) = @_; if ($self->fill_in_placeholders) { - my $val = pop @{$bindargs}; + my $val = pop @{$bindargs} || ''; $val =~ s/\\/\\\\/g; $val =~ s/'/\\'/g; return qq('$val') @@ -340,10 +344,21 @@ sub _fill_in_placeholder { return '?' } +sub _caller_info { + my ($self, $depth) = @_; + + return '' if $depth != 1 or !$self->include_caller; + + my @caller_info = caller($self->caller_depth + 0); + + " at $caller_info[1] line $caller_info[2]."; +} + sub unparse { - my ($self, $tree, $bindargs, $depth) = @_; + my ($self, $tree, $bindargs, $indent, $depth) = @_; - $depth ||= 0; + $depth ||= 0; + $indent ||= 0; if (not $tree ) { return ''; @@ -353,7 +368,7 @@ sub unparse { my $cdr = $tree->[1]; if (ref $car) { - return join ('', map $self->unparse($_, $bindargs, $depth), @$tree); + return join ('', map $self->unparse($_, $bindargs, $indent, $depth + 1), @$tree); } elsif ($car eq 'LITERAL') { if ($cdr->[0] eq '?') { @@ -364,15 +379,15 @@ sub unparse { elsif ($car eq 'PAREN') { return '(' . join(' ', - map $self->unparse($_, $bindargs, $depth + 2), @{$cdr}) . - ($self->_is_key($cdr)?( $self->newline||'' ).$self->indent($depth + 1):'') . ') '; + map $self->unparse($_, $bindargs, $indent + 2, $depth + 1), @{$cdr}) . + ($self->_is_key($cdr)?( $self->newline||'' ).$self->indent($indent + 1):'') . ') '; } elsif ($car eq 'OR' or $car eq 'AND' or (grep { $car =~ /^ $_ $/xi } @binary_op_keywords ) ) { - return join (" $car ", map $self->unparse($_, $bindargs, $depth), @{$cdr}); + return join (" $car ", map $self->unparse($_, $bindargs, $indent, $depth + 1), @{$cdr}); } else { - my ($l, $r) = @{$self->whitespace($car, $depth)}; - return sprintf "$l%s %s$r", $self->format_keyword($car), $self->unparse($cdr, $bindargs, $depth); + my ($l, $r) = @{$self->whitespace($car, $indent)}; + return sprintf "$l%s %s$r%s", $self->format_keyword($car), $self->unparse($cdr, $bindargs, $indent, $depth + 1), $self->_caller_info($depth); } } diff --git a/t/15callerlog.t b/t/15callerlog.t new file mode 100644 index 0000000..5110800 --- /dev/null +++ b/t/15callerlog.t @@ -0,0 +1,26 @@ +use strict; +use warnings; + +use Test::More; +use SQL::Abstract::Tree; + +my $tree = SQL::Abstract::Tree->new({ + include_caller => 1, + caller_depth => 0, +}); + +my $tree2 = SQL::Abstract::Tree->new({ + include_caller => 1, + caller_depth => 1, +}); +my $out = $tree->_caller_info(1); +ok $out =~ /callerlog/ && $out =~ /line 16/, 'caller info is right for basic test'; + +my $o2; +sub lolz { $o2 = $tree2->_caller_info(1) } + +lolz; +ok $o2 =~ /callerlog/ && $o2 =~ /line 22/, 'caller info is right for more nested test'; + +ok !$tree2->_caller_info(2), 'caller info is blank unless arg == 1'; +done_testing;