From abb9c51aa8e822f7d40be12facda43408db6ffbd Mon Sep 17 00:00:00 2001 From: dakkar Date: Tue, 27 Sep 2011 23:40:08 +0100 Subject: fix: Role/PPI is broken, inject same code in multiple files --- lib/Dist/Zilla/Plugin/Boilerplate.pm | 73 +++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 34 deletions(-) (limited to 'lib/Dist/Zilla') diff --git a/lib/Dist/Zilla/Plugin/Boilerplate.pm b/lib/Dist/Zilla/Plugin/Boilerplate.pm index 13b087e..cf80b9a 100644 --- a/lib/Dist/Zilla/Plugin/Boilerplate.pm +++ b/lib/Dist/Zilla/Plugin/Boilerplate.pm @@ -31,7 +31,7 @@ has code_line => ( required => 1, ); -sub code { shift->code_line->join("\n") } +sub code { shift->code_line->join("\n")."\n" } has _parsed_code => ( is => 'ro', @@ -98,52 +98,57 @@ sub munge_files { sub munge_file { my ($self, $file) = @_; - my $doc = $self->ppi_document_for_file($file); - my $my_uses = $doc->find( - sub{ - my $element = $_[1]; - $element->isa('PPI::Statement::Include') && - $element->type eq 'use' && - $element->module eq __PACKAGE__ - } - ); + my ($doc,$my_uses) = $self->_find_uses($file); return unless $my_uses; + for my $use ($my_uses->flatten) { my $tags = $self->_find_tags_from_ppi($use->arguments); - if ($tags->first(sub{$_ eq $self->plugin_name})) { + if ($tags->grep(sub{$_ eq $self->plugin_name})->length) { for my $elem ($self->_parsed_code->children) { - $use->insert_before($elem) + $use->insert_before($elem->clone) or $self->log_fatal("Couldn't insert $elem before $use\n"); } - $use->delete; } } - $self->save_ppi_document_to_file($doc,$file); + $file->content($doc->serialize); +} + +sub _find_uses { + my ($self,$file) = @_; + + my $content = $file->content; + my $doc = PPI::Document->new(\$content); + return $doc,$doc->find( + sub{ + my $element = $_[1]; + $element->isa('PPI::Statement::Include') && + $element->type eq 'use' && + $element->module eq __PACKAGE__ + } + ); } sub _find_tags_from_ppi { - my ($self,$node) = @_; + my ($self,@nodes) = @_; - if ($node->isa('PPI::Token::Quote')) { - return [$node->string]; - } - elsif ($node->isa('PPI::Token::QuoteLike::Words')) { - return [$node->literal]; - } - elsif ($node->isa('PPI::Token')) { - return [ $node->content ]; # probably wrong - } - elsif ($node->can('find')) { - return [ - ($node->find('PPI::Token::Quote') || []) - ->map(sub{$_->string})->flatten(), - ($node->find('PPI::Token::QuoteLike::Words') || []) - ->map(sub{$_->literal})->flatten, - ]; - } - else { - return [] + my @ret; + for my $node (@nodes) { + if ($node->isa('PPI::Token::Quote')) { + push @ret, $node->string; + } + elsif ($node->isa('PPI::Token::QuoteLike::Words')) { + push @ret, $node->literal; + } + elsif ($node->can('find')) { + push @ret, ( + ($node->find('PPI::Token::Quote') || []) + ->map(sub{$_->string})->flatten(), + ($node->find('PPI::Token::QuoteLike::Words') || []) + ->map(sub{$_->literal})->flatten, + ); + } } + return \@ret; } } package Dist::Zilla::Plugin::Boilerplate::Chrome;{ -- cgit v1.2.3