/usr/share/perl5/Devel/REPL/Plugin/CompletionDriver/INC.pm is in libdevel-repl-perl 1.003026-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | use strict;
use warnings;
package Devel::REPL::Plugin::CompletionDriver::INC;
BEGIN {
$Devel::REPL::Plugin::CompletionDriver::INC::AUTHORITY = 'cpan:PHAYLON';
}
$Devel::REPL::Plugin::CompletionDriver::INC::VERSION = '1.003026';
use Devel::REPL::Plugin;
use Devel::REPL::Plugin::Completion; # die early if cannot load
use File::Next;
use File::Spec;
use namespace::autoclean;
sub BEFORE_PLUGIN {
my $self = shift;
$self->load_plugin('Completion');
}
around complete => sub {
my $orig = shift;
my ($self, $text, $document) = @_;
my $last = $self->last_ppi_element($document, 'PPI::Statement::Include');
return $orig->(@_)
unless $last->isa('PPI::Statement::Include');
my @elements = $last->children;
shift @elements; # use or require
# too late for us to care, they're completing on something like
# use List::Util qw(m
# OR they just have "use " and are tab completing. we'll spare them the flood
return $orig->(@_)
if @elements != 1;
my $package = shift @elements;
my $outsep = '::';
my $insep = "::";
my $keep_extension = 0;
my $prefix = '';
# require "Foo/Bar.pm" -- not supported yet, ->string doesn't work for
# partially completed elements
#if ($package->isa('PPI::Token::Quote'))
#{
# # we need to strip off the leading quote and stash it
# $package = $package->string;
# my $start = index($package->quote, $package);
# $prefix = substr($package->quote, 0, $start);
# # we're completing something like: require "Foo/Bar.pm"
# $outsep = $insep = '/';
# $keep_extension = 1;
#}
if ($package =~ /'/)
{
# the goofball is using the ancient ' package sep, we'll humor him
$outsep = "'";
$insep = "'|::";
}
my @directories = split $insep, $package;
# split drops trailing fields
push @directories, '' if $package =~ /(?:$insep)$/;
my $final = pop @directories;
my $final_re = qr/^\Q$final/;
my @found;
# most VCSes don't litter every single fucking directory with garbage. if you
# know of any other, just stick them in here. No one wants to complete
# Devel::REPL::Plugin::.svn
my %ignored =
(
'.' => 1,
'..' => 1,
'.svn' => 1,
);
# this will take a directory and add to @found all of the possible matches
my $add_recursively;
$add_recursively = sub {
my ($path, $iteration, @more) = @_;
opendir((my $dirhandle), $path) || return;
for (grep { !$ignored{$_} } readdir $dirhandle)
{
my $match = $_;
# if this is the first time around, we need respect whatever the user had
# at the very end when he pressed tab
next if $iteration == 0 && $match !~ $final_re;
my $fullmatch = File::Spec->rel2abs($match, $path);
if (-d $fullmatch)
{
$add_recursively->($fullmatch, $iteration + 1, @more, $match);
}
else
{
$match =~ s/\..*// unless $keep_extension;
push @found, join '', $prefix,
join $outsep, @directories, @more, $match;
}
}
};
# look through all of
INC: for (@INC)
{
my $path = $_;
# match all of the fragments they have, so "use Moose::Meta::At<tab>"
# will only begin looking in ../Moose/Meta/
for my $subdir (@directories)
{
$path = File::Spec->catdir($path, $subdir);
-d $path or next INC;
}
$add_recursively->($path, 0);
}
return $orig->(@_), @found;
};
1;
__END__
=head1 NAME
Devel::REPL::Plugin::CompletionDriver::INC - Complete module names in use and require
=head1 VERSION
version 1.003026
=head1 AUTHOR
Shawn M Moore, C<< <sartak at gmail dot com> >>
=cut
|