phpmd / phpmd

PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD. PHPMD can be seen as an user friendly frontend application for the raw metrics stream measured by PHP Depend.

Home Page:https://phpmd.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

PHPMD crashes when parsing enum with a value named "DEFAULT"

guvra opened this issue · comments

commented
  • PHPMD version: 2.13.0 (and pdepend 2.12.1)
  • PHP Version: 8.1.7
  • Installation type: composer
  • Operating System / Distribution & Version: Alpine 3.16 (docker container)

Current Behavior

When an enum contains a value named DEFAULT, phpmd crashes.

<?php

enum Example
{
    case DEFAULT;
}

Error message:

Unexpected token: DEFAULT, line: 5, col: 10, file: /var/www/html/dev/packages/module-dataflow/Component/Database/InsertMode.php.
#0 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(7966): PDepend\Source\Parser\UnexpectedTokenException-&gt;__construct(Object(PDepend\Source\Tokenizer\Token), Object(PDepend\Source\AST\ASTCompilationUnit))
#1 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(8116): PDepend\Source\Language\PHP\AbstractPHPParser-&gt;getUnexpectedTokenException()
#2 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(1099): PDepend\Source\Language\PHP\AbstractPHPParser-&gt;parseEnumCase()
#3 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion81.php(164): PDepend\Source\Language\PHP\AbstractPHPParser-&gt;parseTypeBody(Object(PDepend\Source\AST\ASTEnum))
#4 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(6578): PDepend\Source\Language\PHP\PHPParserVersion81-&gt;parseEnumDeclaration()
#5 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(516): PDepend\Source\Language\PHP\AbstractPHPParser-&gt;parseOptionalStatement()
#6 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php(606): PDepend\Source\Language\PHP\AbstractPHPParser-&gt;parse()
#7 /var/www/html/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php(351): PDepend\Engine-&gt;performParseProcess()
#8 /var/www/html/vendor/phpmd/phpmd/src/main/php/PHPMD/Parser.php(99): PDepend\Engine-&gt;analyze()
#9 /var/www/html/vendor/phpmd/phpmd/src/main/php/PHPMD/PHPMD.php(240): PHPMD\Parser-&gt;parse(Object(PHPMD\Report))
#10 /var/www/html/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php(136): PHPMD\PHPMD-&gt;processFiles(&#039;dev/packages/mo...&#039;, &#039;phpmd.xml.dist&#039;, Array, Object(PHPMD\RuleSetFactory), Object(PHPMD\Report))
#11 /var/www/html/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php(184): PHPMD\TextUI\Command-&gt;run(Object(PHPMD\TextUI\CommandLineOptions), Object(PHPMD\RuleSetFactory))
#12 /var/www/html/vendor/phpmd/phpmd/src/bin/phpmd(61): PHPMD\TextUI\Command::main(Array)
#13 /var/www/html/vendor/bin/phpmd(120): include(&#039;/var/www/html/v...&#039;)
#14 {main}

Expected Behavior

Expected behavior is no error, just a successful analysis.

Steps To Reproduce:

  1. Create a file with the enum in the above example.
  2. Run phpmd on this file.

Hello, i have the same problem with the value named NEW

PHPMD version: 2.13.0
PHP Version: 8.1.10
Installation type: composer
Operating System / Distribution & Version: Alpine 3.16 (docker container)
<?php

enum Example
{
    case NEW;
}

Error message:

Unexpected token: NEW, line: 5, col: 10, file: /srv/app/src/Enum/Example.php.
#0 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(7966): PDepend\Source\Parser\UnexpectedTokenException->__construct(Object(PDepend\Source\Tokenizer\Token), Object(PDepend\Source\AST\ASTCompilationUnit))
#1 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(8116): PDepend\Source\Language\PHP\AbstractPHPParser->getUnexpectedTokenException()
#2 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(1099): PDepend\Source\Language\PHP\AbstractPHPParser->parseEnumCase()
#3 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion81.php(164): PDepend\Source\Language\PHP\AbstractPHPParser->parseTypeBody(Object(PDepend\Source\AST\ASTEnum))
#4 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(6578): PDepend\Source\Language\PHP\PHPParserVersion81->parseEnumDeclaration()
#5 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(516): PDepend\Source\Language\PHP\AbstractPHPParser->parseOptionalStatement()
#6 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php(606): PDepend\Source\Language\PHP\AbstractPHPParser->parse()
#7 /srv/app/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php(351): PDepend\Engine->performParseProcess()
#8 /srv/app/vendor/phpmd/phpmd/src/main/php/PHPMD/Parser.php(99): PDepend\Engine->analyze()
#9 /srv/app/vendor/phpmd/phpmd/src/main/php/PHPMD/PHPMD.php(240): PHPMD\Parser->parse(Object(PHPMD\Report))
#10 /srv/app/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php(136): PHPMD\PHPMD->processFiles('src/', 'config/linters/...', Array, Object(PHPMD\RuleSetFactory), Object(PHPMD\Report))
#11 /srv/app/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php(184): PHPMD\TextUI\Command->run(Object(PHPMD\TextUI\CommandLineOptions), Object(PHPMD\RuleSetFactory))
#12 /srv/app/vendor/phpmd/phpmd/src/bin/phpmd(61): PHPMD\TextUI\Command::main(Array)
#13 /srv/app/vendor/bin/phpmd(120): include('/srv/app/vendor...')
#14 {main}

Hell @guvra and @GErpeldinger

Thanks for reporting, this is a bug in PDepend. I have created an issue for that: pdepend/pdepend#635

same behavior with CONTINUE keyword

commented

I have the same problem with Return

enum OrderSupplierStatusUsableInEnum: String
{
    case Return = 'return';
}
Unexpected token: Return, line: 6, col: 10, file: /shared/httpd/project/src/OrderSupplier/Domain/Enums/OrderSupplierStatusUsableInEnum.php.
#0 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(8027): PDepend\Source\Parser\UnexpectedTokenException->__construct(Object(PDepend\Source\Tokenizer\Token), Object(PDepend\Source\AST\ASTCompilationUnit))
#1 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(8183): PDepend\Source\Language\PHP\AbstractPHPParser->getUnexpectedTokenException()
#2 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(1123): PDepend\Source\Language\PHP\AbstractPHPParser->parseEnumCase()
#3 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion81.php(164): PDepend\Source\Language\PHP\AbstractPHPParser->parseTypeBody(Object(PDepend\Source\AST\ASTEnum))
#4 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(6641): PDepend\Source\Language\PHP\PHPParserVersion81->parseEnumDeclaration()
#5 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php(516): PDepend\Source\Language\PHP\AbstractPHPParser->parseOptionalStatement()
#6 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php(606): PDepend\Source\Language\PHP\AbstractPHPParser->parse()
#7 /shared/httpd/nucleus/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php(351): PDepend\Engine->performParseProcess()
#8 /shared/httpd/nucleus/vendor/phpmd/phpmd/src/main/php/PHPMD/Parser.php(99): PDepend\Engine->analyze()
#9 /shared/httpd/nucleus/vendor/phpmd/phpmd/src/main/php/PHPMD/PHPMD.php(240): PHPMD\Parser->parse(Object(PHPMD\Report))
#10 /shared/httpd/nucleus/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php(131): PHPMD\PHPMD->processFiles('./', 'phpmd-ruleset.x...', Array, Object(PHPMD\RuleSetFactory), Object(PHPMD\Report))
#11 /shared/httpd/nucleus/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php(184): PHPMD\TextUI\Command->run(Object(PHPMD\TextUI\CommandLineOptions), Object(PHPMD\RuleSetFactory))
#12 /shared/httpd/nucleus/vendor/phpmd/phpmd/src/bin/phpmd(61): PHPMD\TextUI\Command::main(Array)
#13 /shared/httpd/nucleus/vendor/bin/phpmd(117): include('/shared/httpd/n...')
#14 {main}
commented

@julianphp It happens with any php keyword.

commented

null, default and new were fixed in 2.13.0
And the rest of the keyword is fixed on pdepend/pdepend:dev-master