5 Sepia::Xref - Generates cross reference database for use by Perl programs.
9 use Sepia::Xref qw(rebuild defs callers);
13 printf "%s:%d: sub %s\::foo() defined\n", @{$_}[0..2];
17 printf "%s:%d: sub foo() called by %s\::%s().\n", @{$_}[0..3];
22 C<Sepia::Xref> is intended as a programmatic interface to the
23 information supplied by L<B::Xref>. It is intended to be a component
24 for interactive Perl development, with other packages providing a
25 friendly interface to the raw information it extracts. C<B::Xref>
26 could be seen as an example of this sort of user-level tool, if it
27 weren't for the fact that this module was created later, and stole
32 # use Sepia '_apropos_re';
34 BEGIN { *_apropos_re
= *Sepia
::_apropos_re
; }
40 use B
qw(peekop class comppadlist main_start svref_2object walksymtable
41 OPpLVAL_INTRO SVf_POK OPpOUR_INTRO OPf_MOD OPpDEREF_HV OPpDEREF_AV
44 no warnings
'uninitialized';
52 A map of subs to call locations and callers
56 A map of subs to subs called.
60 A map of global/package variables to uses.
64 A map of global/package variables to definitions (usually empty, since
65 it only picks up local (...) declarations.
77 our @ISA = 'Exporter';
78 my @most = qw(redefined forget rebuild callers callees
81 our @EXPORT_OK = (@most,
82 qw(xref_definitions xref_object xref_main
83 %call %callby %var_use %var_def));
86 (':all' => \@EXPORT_OK,
89 ######################################################################
90 ## Xref state variables:
92 sub UNKNOWN { ["?", "?", "?"] }
94 my @pad; # lexicals in current pad
95 # as ["(lexical)", type, name]
97 our %done; # keyed by $$op: set when each $op is done
98 my $top = UNKNOWN; # shadows top element of stack as
99 # [pack, type, name] (pack can be "(lexical)")
100 our $file; # shadows current filename
101 my $line; # shadows current line number
102 our $subname; # shadows current sub name
103 our @todo = (); # List of CVs that need processing
104 my $lastclass; # last bareword seen after entersub.
110 $res =~ s/%//g; # XXX: work around EPL's misuse of (message)
111 print STDERR "@_" if $DEBUG =~ /$type/;
114 my %code = (intro => "i", used => "",
115 subdef => "s", subused => "&",
116 formdef => "f", meth => "->");
122 =item C<guess_module_file($pack, $ofile)>
124 XXX: it turns out that rooting around trying to figure out the file
125 ourselves is more reliable than what we grab from the op. Are we
130 sub guess_module_file {
131 my ($pack, $ofile) = @_;
134 # XXX: is this why we get the bogus defs?
135 return undef if $ofile =~ /Exporter\.pm$/;
136 # Try for standard translation in %INC:
137 (my $fn = $pack) =~ s/::/\//g;
138 return unless $fn; # stupid warnings...
139 if (exists $INC{"$fn.pm"}) {
140 return $INC{"$fn.pm"};
143 # Try what they told us:
145 return $ofile if -f $ofile;
147 # Try "parent" packages:
148 while ($fn =~ s|/?[^/]+$|| && !$file) {
149 $file ||= $INC{"$fn.pm"};
152 if ($file && $file !~ /^\//) {
153 $file = abs_path($file);
156 if (!$file || !-f $file) {
162 # XXX: should weed through the code below so it only generates decent
163 # package names, but this will fix it for now.
166 if (!defined $p || $p eq '?' || $p eq '(method)') {
175 # Turn a possibly-qualified name into a package and basename.
179 if (/^(.*)::(.+)$/) {
182 ($p, $s) = ('main', $_);
184 undef $s if $s eq '?';
189 my ($var, $event) = @_;
190 my ($pack, $type, $name) = @$var;
191 $pack = realpack($pack);
192 dprint 'loud', "Processing $event: @$var ($subname)";
194 if ($event eq "used" || $event eq 'set') {
196 } elsif ($event eq "subused") {
198 } elsif ($event eq "meth") {
202 $type =~ s/(.)\*$/$1/g;
203 $file = guess_module_file($pack, $file);
205 if (($type eq '&' || $type eq '->') && $subname ne '(definitions)') {
206 # Handle caller/callee relations
207 my ($spack, $sname) = split_name($subname);
209 $call{$name}{$pack}{$subname} = 1;
210 $callby{$sname}{$spack}{"$pack\::$name"} = 1;
211 } elsif ($type eq 's' || $subname eq '(definitions)') {
213 } elsif ($name !~ /^[\x00-\x1f^] | ^\d+$ | ^[\W_]$
214 | ^(?:ENV|INC|STD(?:IN|OUT|ERR)|SIG)$ /x
215 && realpack($pack)) {
216 # Variables, but ignore specials and lexicals
217 my ($spack, $sname) = split_name($subname);
218 if ($event eq 'intro') {
219 $var_def{$name}{$pack} =
225 } elsif ($event eq 'used' || $event eq 'set') {
226 push @{$var_use{$name}{$pack}},
231 assign => ($event eq 'set'),
234 dprint 'ignore', "Ignoring var event $event";
237 dprint 'ignore', "Ignoring $type event $event";
243 my ($namelistav, $vallistav, @namelist, $ix);
246 return if class($padlist) eq "SPECIAL";
247 ($namelistav,$vallistav) = $padlist->ARRAY;
248 @namelist = $namelistav->ARRAY;
249 for ($ix = 1; $ix < @namelist; $ix++) {
250 my $namesv = $namelist[$ix];
251 next if class($namesv) eq "SPECIAL";
252 my ($type, $name) = $namesv->PV =~ /^(.)([^\0]*)(\0.*)?$/;
253 $pad[$ix] = [undef, $type, $name];
255 if ($Config{useithreads}) {
257 @vallist = $vallistav->ARRAY;
258 for ($ix = 1; $ix < @vallist; $ix++) {
259 my $valsv = $vallist[$ix];
260 next unless class($valsv) eq "GV";
261 # these pad GVs don't have corresponding names, so same @pad
262 # array can be used without collisions
264 # XXX: for some reason, on 5.10 $valsv->STASH can be a
265 # B::SPECIAL, which doesn't have a name.
267 # XXX: this segfaults on 5.10 for some reason while
268 # traversing File::Find::contract_name from main
270 next if ref $valsv->STASH eq 'B::SPECIAL';
271 $pad[$ix] = [$valsv->STASH->NAME, "*", $valsv->NAME];
274 @padval = $vallistav->ARRAY;
280 for ($op = $start; $$op; $op = $op->next) {
281 last if $done{$$op}++;
282 my $opname = $op->name;
283 if ($opname =~ /^(or|and|mapwhile|grepwhile|range|cond_expr)$/) {
285 } elsif ($opname eq "match" || $opname eq "subst") {
286 xref($op->pmreplstart);
287 } elsif ($opname eq "substcont") {
288 xref($op->other->pmreplstart);
291 } elsif ($opname eq "enterloop") {
295 } elsif ($opname eq "subst") {
296 xref($op->pmreplstart);
299 my $ppname = "pp_$opname";
300 &$ppname($op) if defined(&$ppname);
307 my $pack = $cv->GV->STASH->NAME;
308 local $subname = ($pack eq "main" ? "" : "$pack\::") . $cv->GV->NAME;
309 load_pad($cv->PADLIST);
315 local (@todo, %done);
316 my $cv = svref_2object($cvref);
318 dprint 'todo', "todo = (@todo)";
320 process([$gv->STASH->NAME, '&', $gv->NAME], 'subdef');
325 load_pad(comppadlist);
328 xref_cv(shift @todo);
335 if (($class = $op->next)->name eq 'const') {
338 # constant could be in the pad (under useithreads)
339 if (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK) {
340 $classname = $sv->PV;
342 my $pv = $padval[$class->targ];
343 if (class($pv) =~ /^PV/ && class($sv) eq 'SPECIAL'
344 ## bareword flag -- should use this?
345 # && ($op->private & 64)
347 $classname = $pv->PV;
350 $lastclass = $classname;
357 die "pp_nextstate: $file" if $file =~ /::/;
364 if ($op->private & (OPpLVAL_INTRO | OPpOUR_INTRO)) {
366 } elsif ($op->flags & OPf_MOD
367 && !($op->private & (OPpDEREF_HV | OPpDEREF_AV))) {
376 $top = $pad[$op->targ];
377 # process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
380 sub pp_padav { pp_padsv(@_) }
381 sub pp_padhv { pp_padsv(@_) }
384 my ($op, $var, $as) = @_;
385 $var->[1] = $as . $var->[1];
386 process($var, use_type $op);
389 sub pp_rv2cv { deref(shift, $top, "&"); }
390 sub pp_rv2hv { deref(shift, $top, "%"); }
391 sub pp_rv2sv { deref(shift, $top, "\$"); }
392 sub pp_rv2av { deref(shift, $top, "\@"); }
393 sub pp_rv2gv { deref(shift, $top, "*"); }
398 if ($Config{useithreads}) {
399 $top = $pad[$op->padix];
400 $top = UNKNOWN unless $top;
405 $top = [$gv->STASH->NAME, '$', $gv->SAFENAME];
407 process($top, use_type $op);
413 if ($Config{useithreads}) {
414 $top = $pad[$op->padix];
415 $top = UNKNOWN unless $top;
420 $top = [$gv->STASH->NAME, "*", $gv->SAFENAME];
422 process($top, use_type $op);
427 $top = [$lastclass || "(method)", "->".$top->[1], $top->[2]];
428 dprint 'method', "pp_method($top->[1])";
432 sub pp_method_named {
436 my $pviv = $padval[$op->targ];
437 if ($pviv && class($pviv) =~ /^PV/) {
438 my $name = $pviv->PV;
439 dprint 'method_named', $op->targ.": $name";
440 undef $top->[2] if $top->[2] eq '?';
441 $top = [$lastclass || "(method)", '->', $name];
444 dprint 'method_named', "method_named: wtf: sizeof padval = ".@padval;
450 if ($top->[1] =~ /^(?:m$|->)/) {
451 dprint 'method', "call to (@$top) from $subname";
452 process($top, "meth");
454 process($top, "subused");
461 # Stuff for cross referencing definitions of variables and subs
468 # XXX: sometimes the "file" is a module. Why?
471 #return if $done{$$cv}++;
472 process([$gv->STASH->NAME, "&", $gv->NAME], "subdef");
475 my $form = $gv->FORM;
477 return if $done{$$form}++;
478 process([$gv->STASH->NAME, "", $gv->NAME], "formdef");
482 ## Exclude all pragmatic modules (lowercase first letter) and the
483 ## following problematic things, which tend to cause more harm than
484 ## good when they get xref'd:
487 undef $exclude{"$_\::"}
488 for qw(B O AutoLoader DynaLoader XSLoader Config DB VMS
489 FileHandle Exporter Carp PerlIO::Layer);
494 $x =~ /^[a-z]/ || exists $exclude{$x};
497 sub xref_definitions
{
498 my ($pack, %exclude);
499 $subname = "(definitions)";
500 no strict
qw(vars refs);
501 walksymtable
(\
%{"main::"}, "xref", sub { !xref_exclude
($_[0]) });
506 Rebuild the Xref database.
511 %call = (); %callby = ();
512 %var_def = (); %var_use = ();
513 local (@todo, %done);
520 my ($h, $K, $V, $pack) = @_;
521 dprint
'unmention', "Unmentioning $K => $V";
522 while (my ($k, $v) = each %$h) {
523 while (my ($k2, $v2) = each %$v) {
524 if (ref $v2 eq 'ARRAY') {
526 $_->{$K} ne $V || !$pack || $pack ne $_->{package}
528 delete $v->{$k2} unless @
{$v->{$k2}};
530 delete $v->{$k2} if $k2 eq $V;
533 delete $h->{$k} unless keys %{$h->{$k}};
538 my ($h, $sub, $pack) = @_;
539 dprint
'unmention', "Unmentioning $pack\::$sub";
541 delete $h->{$sub}{$pack};
542 delete $h->{$sub} unless keys %{$h->{$sub}};
548 =item C<forget($func [, $mod])>
550 Forget that C<$func> was defined.
555 my ($obj, $pack) = @_;
556 unmention_sub \
%callby, @_;
557 unmention \
%call, 'sub', @_;
558 unmention \
%var_use, 'sub', @_;
559 unmention \
%var_def, 'sub', @_;
562 =item C<redefined($func [, $pack])>
564 Recompute xref info for C<$func>, or C<$pack::$func> if C<$pack> given.
572 my ($sub, $pack) = @_;
574 $sub = $pack eq 'main' ?
$sub : "$pack\::$sub";
575 local $subname = '(definitions)';
580 ######################################################################
581 # Apropos and definition-finding:
585 my ($h, $sub, $mod) = @_;
586 if ($sub =~ /^(.*)::([^:]+)$/) {
593 @r = keys %{$h->{$mod}};
595 # @r = map { @$_ } values %$h;
597 @h{keys %$_} = 1 for values %$h;
601 return wantarray ?
@r : \
@r;
606 my ($h, $v, $mod, $assign) = @_;
607 if ($v =~ /^(.*)::([^:]+)$/) {
614 @r = exists $h->{$mod} ? @
{$h->{$mod}} : ();
616 ## XXX: Need to revisit when this is/isn't an array!
617 @r = map { ref $_ eq 'ARRAY' ? @
$_ : $_ } values %$h;
619 @r = grep $_->{assign
}, @r if $assign;
620 @r = map { [@
{$_}{qw(file line sub package)}] } @r;
621 return wantarray ?
@r : \
@r;
624 =item C<callers($func)>
626 List callers of C<$func>.
631 _ret_list \
%call, @_;
634 =item C<callees($func)>
636 List callees of C<$func>.
641 _ret_list \
%callby, @_;
644 =item C<var_defs($var)>
646 Find locations where C<$var> is defined.
651 return _var_ret_list \
%var_def, @_;
654 =item C<var_uses($var)>
656 Find locations where C<$var> is used.
661 return _var_ret_list \
%var_use, @_;
664 =item C<var_assigns($var)>
666 Find locations where C<$var> is assigned to.
672 return _var_ret_list \
%var_use, $v, $pack, 1;
675 =item C<file_modules($file)>
677 List the modules defined in file C<$file>.
684 require Module
::Info
;
685 my $mod = Module
::Info
->new_from_file(abs_path
($file));
687 return $mod->packages_inside();
692 =item C<var_apropos($expr)>
694 Find variables matching C<$expr>.
699 my ($h, $re, $mod) = @_;
702 $re = _apropos_re
($re);
703 sort grep /$re/, keys %$h;
709 $mod = _apropos_re
($mod);
713 for (keys %{$h->{$_}}) {
714 $r{$_ eq 'main' ?
$sn : "$_\::$sn"} = 1 if /$mod/;
719 return wantarray ?
@r : \
@r;
723 _apropos \
%var_use, @_;
734 Nothing by default, but all sub and variable described above can be
735 imported. C<Sepia::Xref> also defines the tags C<:most> for the
736 above-listed functions, and C<:all> for those and the variables as
743 =item See L<B::Xref>.
745 =item module names are ignored when looking up a sub.
747 =item file and line number guessing is evil
749 Both should be done more cleanly and effectively. This is a hack
750 because I don't quite understand what perl saves. We should be able
751 to do as well as its warning messages.
753 =item Some packages are not xref'd.
755 Some "internal" packages are deliberately not cross-referenced, either
756 because they are hairy and cause us problems, or because they are so
757 commonly included as to be uninteresting. The current list includes
758 all pragmatic modules, plus: B, O, AutoLoader, DynaLoader, XSLoader,
759 Config, DB, VMS, FileHandle, Exporter, Carp, PerlIO::Layer.
761 =item Tree-view is not fully functional
763 Ideally, clicking the function names in tree view would take you to
764 that function. This doesn't work. Also, more keys (like "q" to quit)
765 should be implemented.
771 C<B::Xref>, of which C<Sepia::Xref> is a bastard child.
775 L<B::Xref> by Malcolm Beattie, m(angl|odifi)ed by Sean O'Rourke