Perl-Critic / PPI

54 stars 44 forks source link

Readline operator is not properly detected when preceded by a map block #221

Open s-nez opened 6 years ago

s-nez commented 6 years ago

When a <> operator is preceded by a map block, it is does not show up as PPI::Token::QuoteLike::Readline in the tree, instead two separate PPI::Token::Operators for '<' and '>' are created.

Example:

use PPI;
use PPI::Dumper;

print "Regular readline:\n";
my $doc_readline = PPI::Document->new(\'@lines = <$fh>');
PPI::Dumper->new($doc_readline)->print;

print "\nReadline with a map:\n";
my $doc_readline_map = PPI::Document->new(\'@lines = map { $_ } <$fh>');
PPI::Dumper->new($doc_readline_map)->print;

Output:

Regular readline:
PPI::Document
  PPI::Statement
    PPI::Token::Symbol      '@lines'
    PPI::Token::Whitespace      ' '
    PPI::Token::Operator    '='
    PPI::Token::Whitespace      ' '
    PPI::Token::QuoteLike::Readline     '<$fh>'

Readline with a map:
PPI::Document
  PPI::Statement
    PPI::Token::Symbol      '@lines'
    PPI::Token::Whitespace      ' '
    PPI::Token::Operator    '='
    PPI::Token::Whitespace      ' '
    PPI::Token::Word    'map'
    PPI::Token::Whitespace      ' '
    PPI::Structure::Block   { ... }
      PPI::Token::Whitespace    ' '
      PPI::Statement
        PPI::Token::Magic   '$_'
      PPI::Token::Whitespace    ' '
    PPI::Token::Whitespace      ' '
    PPI::Token::Operator    '<'
    PPI::Token::Symbol      '$fh'
    PPI::Token::Operator    '>'