Как я могу сделать граф вызовов статического анализа для Perl?

Вот еще отправленный ответ и это потерялись. FF и мой прокси-сервер не проживают.

я думаю, что нет никакого способа просто изменить цвет parens, они, кажется, следуют за цветом текста. Я действительно находил этот инструмент , который позволяет Вам сделать все виды вещей с цветом paren; посмотревшая симпатичная острота за 49$.

12
задан 5 revs, 4 users 53% 11 September 2009 в 13:40
поделиться

3 ответа

Не могу в общем случае:

my $obj    = Obj->new;
my $method = some_external_source();

$obj->$method();

Однако, но даже у него будут проблемы с такими вещами, как $ obj -> $ method () .

Просто потому, что мне было скучно, вот версия, которая использует PPI . Он находит только вызовы функций (не вызовы методов). Он также не пытается сохранить уникальность имен подпрограмм (т.е. если вы вызываете одну и ту же подпрограмму более одного раза, она будет отображаться более одного раза).

#!/usr/bin/perl

use strict;
use warnings;

use PPI;
use Data::Dumper;
use Scalar::Util qw/blessed/;

sub is {
    my ($obj, $class) = @_;
    return blessed $obj and $obj->isa($class);
}

my $program = PPI::Document->new(shift);

my $subs = $program->find(
    sub { $_[1]->isa('PPI::Statement::Sub') and $_[1]->name }
);

die "no subroutines declared?" unless $subs;

for my $sub (@$subs) {
    print $sub->name, "\n";
    next unless my $function_calls = $sub->find(
        sub { 
            $_[1]->isa('PPI::Statement')             and
            $_[1]->child(0)->isa("PPI::Token::Word") and
            not (
                $_[1]->isa("PPI::Statement::Scheduled") or
                $_[1]->isa("PPI::Statement::Package")   or
                $_[1]->isa("PPI::Statement::Include")   or
                $_[1]->isa("PPI::Statement::Sub")       or
                $_[1]->isa("PPI::Statement::Variable")  or
                $_[1]->isa("PPI::Statement::Compound")  or
                $_[1]->isa("PPI::Statement::Break")     or
                $_[1]->isa("PPI::Statement::Given")     or
                $_[1]->isa("PPI::Statement::When")
            )
        }
    );
    print map { "\t" . $_->child(0)->content . "\n" } @$function_calls;
}
8
ответ дан 2 December 2019 в 19:32
поделиться

Я не уверен, что это на 100% выполнимо (поскольку код Perl не может быть статически проанализирован теоретически из-за блоков BEGIN и т.п. - см. недавнее обсуждение SO ). Кроме того, ссылки на подпрограммы могут очень затруднить выполнение даже в тех местах, где блоки BEGIN не используются.

Однако кто-то явно сделал попытку - только я знаю об этом, но никогда не использовал, поэтому покупатель остерегается.

4
ответ дан 2 December 2019 в 19:32
поделиться

Я не думаю, что существует "статический" генератор графов вызовов для Perl.

Следующим ближайшим вариантом будет Devel :: NYTProf .

Основная цель - профилирование, но его выходные данные могут сказать вам, сколько раз вызывалась подпрограмма и откуда.

Если вам нужно убедиться, что каждая подпрограмма вызывается, вы также можете использовать Devel: : Cover , который проверяет, охватывает ли ваш набор тестов все подпрограммы.

4
ответ дан 2 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: