X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FREPL%2FPlugin%2FCompletionDriver%2FLexEnv.pm;fp=lib%2FDevel%2FREPL%2FPlugin%2FCompletionDriver%2FLexEnv.pm;h=2011896584f9b3634613cdaeb8437d80ca57d1e4;hb=314f229330cdc3be301a39eadb68ff8f2bf13043;hp=0000000000000000000000000000000000000000;hpb=1989c3d297823e55034a9cd22d79089fefcb93c3;p=p5sagit%2FDevel-REPL.git diff --git a/lib/Devel/REPL/Plugin/CompletionDriver/LexEnv.pm b/lib/Devel/REPL/Plugin/CompletionDriver/LexEnv.pm new file mode 100644 index 0000000..2011896 --- /dev/null +++ b/lib/Devel/REPL/Plugin/CompletionDriver/LexEnv.pm @@ -0,0 +1,38 @@ +package Devel::REPL::Plugin::CompletionDriver::LexEnv; +use Devel::REPL::Plugin; +use namespace::clean -except => [ 'meta' ]; + +sub AFTER_PLUGIN { + my ($_REPL) = @_; + + if (!$_REPL->can('lexical_environment')) { + warn "Devel::REPL::Plugin::CompletionDriver::LexEnv requires Devel::REPL::Plugin::LexEnv."; + } +} + +around complete => sub { + my $orig = shift; + my ($self, $text, $document) = @_; + + # recursively find the last element + my $last = $document; + while ($last->can('last_element') && defined($last->last_element)) { + $last = $last->last_element; + } + + return $orig->(@_) + unless $last->isa('PPI::Token::Symbol'); + + my $sigil = substr($last, 0, 1, ''); + my $re = qr/^\Q$last/; + + return $orig->(@_), + # ReadLine is weirdly inconsistent + map { $sigil eq '%' ? '%' . $_ : $_ } + grep { /$re/ } + map { substr($_, 1) } # drop lexical's sigil + keys %{$self->lexical_environment->get_context('_')}; +}; + +1; +