Devel-Refactor
view release on metacpan or search on metacpan
Refactor.pm view on Meta::CPAN
=head1 TODO LIST
=over 2
=item Come up with a more uniform approach to B<ACCESSORS>.
=item Add more refactoring features, such as I<add_parameter>.
=item Add a SEE ALSO section with URLs for eclipse/EPIC, refactoring.com, etc.
=back
=cut
###################################################################################
############################## Utility Methods ####################################
sub _parse_vars {
my $self = shift;
my $var;
my $hint;
# find the variables
while ( $self->{code_snippet} =~ /([\$\@]\w+?)(\W\W)/g ) {
$var = $1;
$hint = $2;
if ( $hint =~ /^{/ ) { #}/
$var =~ s/\$/\%/;
$self->{hash_vars}->{$var}++;
} elsif ( $hint =~ /^\[>/ ) {
$var =~ s/\$/\@/;
$self->{array_vars}->{$var}++;
} elsif ( $var =~ /^\@/ ){
$self->{array_vars}->{$var}++;
} elsif ( $var =~ /^\%/ ) {
$self->{hash_vars}->{$var}++;
} else {
$self->{scalar_vars}->{$var}++;
}
}
}
sub _parse_local_vars {
my $self = shift;
my $reg;
my $reg2;
my $reg3; # To find loops variables declared in for and foreach
# figure out which are declared in the snippet
foreach my $var ( keys %{ $self->{scalar_vars} } ) {
$reg = "\\s*my\\s*\\$var\\s*[=;\(]";
$reg2 = "\\s*my\\s*\\(.*?\\$var.*?\\)";
$reg3 = "(?:for|foreach)\\s+my\\s*\\$var\\s*\\(";
if ( $var =~ /(?:\$\d+$|\$[ab]$)/ ) {
$self->{local_scalars}->{$var}++;
} elsif ( $self->{code_snippet} =~ /$reg|$reg2/ ) {
$self->{local_scalars}->{$var}++;
# skip loop variables
if ( $self->{code_snippet} =~ /$reg3/ ) {
$self->{loop_scalars}->{$var}++;
}
}
}
foreach my $var ( keys %{ $self->{array_vars}} ) {
$var =~ s/\$/\@/;
$reg = "\\s*my\\s*\\$var\\s*[=;\(]";
$reg2 = "\\s*my\\s*\\(.*?\\$var.*?\\)";
if ( $self->{code_snippet} =~ /$reg|$reg2/ ) {
$self->{local_arrays}->{$var}++;
}
}
foreach my $var ( keys %{ $self->{hash_vars}} ) {
$var =~ s/\$/\%/;
$reg = "\\s*my\\s*\\$var\\s*[=;\(]";
$reg2 = "\\s*my\\s*\\(.*?\\$var.*?\\)";
if ( $self->{code_snippet} =~ /$reg|$reg2/ ) {
$self->{local_hashes}->{$var}++;
}
}
}
sub _syntax_check{
my $self = shift;
my $tmp;
my $eval_stmt = "my (". join ', ', @{$self->{parms}};
$eval_stmt .= ");\n";
$eval_stmt .= $self->get_sub_call();
$eval_stmt .= $self->get_new_code();
$self->{eval_code} = $eval_stmt;
eval " $eval_stmt ";
if ($@) {
$self->{eval_err} = $@;
my @errs = split /\n/, $self->{eval_err};
my @tmp = split /\n/, $self->{return_snippet};
my $line;
foreach my $err (@errs){
if ($err =~ /line\s(\d+)/){
$line = ($1 - 3);
$tmp[$line] .= " #<--- ".$err;
}
}
$self->{return_snippet} = join "\n", @tmp;
}
( run in 2.382 seconds using v1.01-cache-2.11-cpan-5b529ec07f3 )