Perl-Critic / PPI

54 stars 44 forks source link

try/catch syntax misparsed #269

Open oalders opened 2 years ago

oalders commented 2 years ago

Not sure how fixable this is, but just noting that PPI doesn't know that the try statement ends at catch ($e) {}, which causes it to misparse the code below. Adding a semicolon after the catch fixes this.

use experimental 'try';

try {
    print 'ok';
}
catch ($e) {}

for my $fh ( \*STDIN, \*STDOUT, \*STDERR ) {
    binmode $fh, ':raw:encoding(UTF-8)';
}
PPI::Document
  PPI::Statement::Include
    PPI::Token::Word    'use'
    PPI::Token::Whitespace      ' '
    PPI::Token::Word    'experimental'
    PPI::Token::Whitespace      ' '
    PPI::Token::Quote::Single   ''try''
    PPI::Token::Structure       ';'
  PPI::Token::Whitespace        '\n'
  PPI::Token::Whitespace        '\n'
  PPI::Statement
    PPI::Token::Word    'try'
    PPI::Token::Whitespace      ' '
    PPI::Structure::Block       { ... }
      PPI::Token::Whitespace    '\n'
      PPI::Token::Whitespace    '    '
      PPI::Statement
        PPI::Token::Word        'print'
        PPI::Token::Whitespace          ' '
        PPI::Token::Quote::Single       ''ok''
        PPI::Token::Structure   ';'
      PPI::Token::Whitespace    '\n'
    PPI::Token::Whitespace      '\n'
    PPI::Token::Word    'catch'
    PPI::Token::Whitespace      ' '
    PPI::Structure::List        ( ... )
      PPI::Statement::Expression
        PPI::Token::Symbol      '$e'
    PPI::Token::Whitespace      ' '
    PPI::Structure::Block       { ... }
    PPI::Token::Whitespace      '\n'
    PPI::Token::Whitespace      '\n'
    PPI::Token::Word    'for'
    PPI::Token::Whitespace      ' '
    PPI::Token::Word    'my'
    PPI::Token::Whitespace      ' '
    PPI::Token::Symbol          '$fh'
    PPI::Token::Whitespace      ' '
    PPI::Structure::List        ( ... )
      PPI::Token::Whitespace    ' '
      PPI::Statement::Expression
        PPI::Token::Cast        '\'
        PPI::Token::Symbol      '*STDIN'
        PPI::Token::Operator    ','
        PPI::Token::Whitespace          ' '
        PPI::Token::Cast        '\'
        PPI::Token::Symbol      '*STDOUT'
        PPI::Token::Operator    ','
        PPI::Token::Whitespace          ' '
        PPI::Token::Cast        '\'
        PPI::Token::Symbol      '*STDERR'
      PPI::Token::Whitespace    ' '
    PPI::Token::Whitespace      ' '
    PPI::Structure::Block       { ... }
      PPI::Token::Whitespace    '\n'
      PPI::Token::Whitespace    '    '
      PPI::Statement
        PPI::Token::Word        'binmode'
        PPI::Token::Whitespace          ' '
        PPI::Token::Symbol      '$fh'
        PPI::Token::Operator    ','
        PPI::Token::Whitespace          ' '
        PPI::Token::Quote::Single       '':raw:encoding(UTF-8)''
        PPI::Token::Structure   ';'
      PPI::Token::Whitespace    '\n'
  PPI::Token::Whitespace        '\n'
use experimental 'try';

try {
    print 'ok';
}
catch ($e) {};

for my $fh ( \*STDIN, \*STDOUT, \*STDERR ) {
    binmode $fh, ':raw:encoding(UTF-8)';
}
PPI::Document
  PPI::Statement::Include
    PPI::Token::Word    'use'
    PPI::Token::Whitespace      ' '
    PPI::Token::Word    'experimental'
    PPI::Token::Whitespace      ' '
    PPI::Token::Quote::Single   ''try''
    PPI::Token::Structure       ';'
  PPI::Token::Whitespace        '\n'
  PPI::Token::Whitespace        '\n'
  PPI::Statement
    PPI::Token::Word    'try'
    PPI::Token::Whitespace      ' '
    PPI::Structure::Block       { ... }
      PPI::Token::Whitespace    '\n'
      PPI::Token::Whitespace    '    '
      PPI::Statement
        PPI::Token::Word        'print'
        PPI::Token::Whitespace          ' '
        PPI::Token::Quote::Single       ''ok''
        PPI::Token::Structure   ';'
      PPI::Token::Whitespace    '\n'
    PPI::Token::Whitespace      '\n'
    PPI::Token::Word    'catch'
    PPI::Token::Whitespace      ' '
    PPI::Structure::List        ( ... )
      PPI::Statement::Expression
        PPI::Token::Symbol      '$e'
    PPI::Token::Whitespace      ' '
    PPI::Structure::Block       { ... }
    PPI::Token::Structure       ';'
  PPI::Token::Whitespace        '\n'
  PPI::Token::Whitespace        '\n'
  PPI::Statement::Compound
    PPI::Token::Word    'for'
    PPI::Token::Whitespace      ' '
    PPI::Token::Word    'my'
    PPI::Token::Whitespace      ' '
    PPI::Token::Symbol          '$fh'
    PPI::Token::Whitespace      ' '
    PPI::Structure::List        ( ... )
      PPI::Token::Whitespace    ' '
      PPI::Statement
        PPI::Token::Cast        '\'
        PPI::Token::Symbol      '*STDIN'
        PPI::Token::Operator    ','
        PPI::Token::Whitespace          ' '
        PPI::Token::Cast        '\'
        PPI::Token::Symbol      '*STDOUT'
        PPI::Token::Operator    ','
        PPI::Token::Whitespace          ' '
        PPI::Token::Cast        '\'
        PPI::Token::Symbol      '*STDERR'
      PPI::Token::Whitespace    ' '
    PPI::Token::Whitespace      ' '
    PPI::Structure::Block       { ... }
      PPI::Token::Whitespace    '\n'
      PPI::Token::Whitespace    '    '
      PPI::Statement
        PPI::Token::Word        'binmode'
        PPI::Token::Whitespace          ' '
        PPI::Token::Symbol      '$fh'
        PPI::Token::Operator    ','
        PPI::Token::Whitespace          ' '
        PPI::Token::Quote::Single       '':raw:encoding(UTF-8)''
        PPI::Token::Structure   ';'
      PPI::Token::Whitespace    '\n'
  PPI::Token::Whitespace        '\n'