package Devel::REPL::Plugin::MultiLine::PPI;
-use Moose::Role;
+use Devel::REPL::Plugin;
use PPI;
use namespace::clean -except => [ 'meta' ];
my $append = $self->read(@args);
$self->line_depth($self->line_depth - 1);
- $line .= $append if defined($append);
+ $line .= "\n$append" if defined($append);
$self->prompt($orig_prompt);
{
my $repl = shift;
my $line = shift;
+
+ # add this so we can test whether the document ends in PPI::Statement::Null
+ $line .= "\n;;";
+
my $document = PPI::Document->new(\$line);
- return 0 if !defined($document);
+ unless ( defined($document) ) {
+ die "PPI failed to parse document '$line'\n";
+ }
+
+ # adding ";" to a complete document adds a PPI::Statement::Null. we added a ;;
+ # so if it doesn't end in null then there's probably something that's
+ # incomplete
+ unless ( $document->child(-1)->isa('PPI::Statement::Null') ) {
+ return 1;
+ }
# this could use more logic, such as returning 1 on s/foo/ba<Enter>
my $unfinished_structure = sub
{
my ($document, $element) = @_;
return 0 unless $element->isa('PPI::Structure');
- return 1 unless $element->start && $element->finish;
+ return 1 unless $element->finish;
return 0;
};