Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
guvra opened this issue Oct 6, 2022 · 6 comments
Open

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

guvra opened this issue Oct 6, 2022 · 6 comments

Comments

@guvra
Copy link

guvra commented Oct 6, 2022

  • 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.
@GErpeldinger
Copy link

GErpeldinger commented Oct 19, 2022

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}

@tvbeek
Copy link
Member

tvbeek commented Oct 19, 2022

Hell @guvra and @GErpeldinger

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

@tvbeek tvbeek self-assigned this Nov 11, 2022
@florianajir
Copy link

same behavior with CONTINUE keyword

@julianphp
Copy link

julianphp commented Mar 13, 2023

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}

@guvra
Copy link
Author

guvra commented Mar 13, 2023

@julianphp It happens with any php keyword.

@kylekatarnls
Copy link
Member

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

@ravage84 ravage84 added this to the 2.x (unspecific) milestone May 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

7 participants