Bug Report
| Subject |
Details |
| Rector version |
2.2.14 |
| PHP version |
8.2.30 NTS x64 (Ubuntu) |
| Symfony version |
5.4.50 |
Hello team,
I was testing an upgrade from an old symfony code - from 3.4 to 5.4 - and it was going great until today.
Everytime I try to run the demo, it returns the folloing exception: "System error: "PhpParser\NodeAbstract::getComments(): Return value must be of type array, bool returned".
Minimal PHP Code Causing Issue
For some reason, the demo throws the message: Expected config should return callable RectorConfig instance
rector.php
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\SetList;
use Rector\Symfony\Set\SymfonySetList;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/src',
__DIR__ . '/tests',
]);
$rectorConfig->importNames(true, false);
$rectorConfig->skip([
__DIR__ . '/assets',
__DIR__ . '/templates',
__DIR__ . '/docs',
__DIR__ . '/public',
__DIR__ . '/web',
__DIR__ . '/node_modules',
__DIR__ . '/vendor',
// Skip all naming rules in entities
SetList::NAMING => [
__DIR__ . '/src/GroupName/*/Entity/*',
],
]);
$rectorConfig->sets([
\Rector\Set\ValueObject\LevelSetList::UP_TO_PHP_82,
SymfonySetList::SYMFONY_54,
SymfonySetList::SYMFONY_CODE_QUALITY,
SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION,
SetList::CODE_QUALITY,
SetList::DEAD_CODE,
SetList::TYPE_DECLARATION,
SetList::PRIVATIZATION,
SetList::INSTANCEOF,
SetList::EARLY_RETURN,
]);
};
IpListTextareaType.php
<?php
declare(strict_types=1);
namespace GroupName\PackageBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
final class IpListTextareaType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
parent::buildForm($builder, $options);
$builder->addModelTransformer(new CallbackTransformer(
function ($ipsAsArray): string {
return (!empty($ipsAsArray)) ? implode(';', $ipsAsArray) : '';
},
function ($ipsAsString): array {
return array_unique(
preg_split(
"/[\s;,\r\n]/",
(string)$ipsAsString,
0,
PREG_SPLIT_NO_EMPTY
)
);
}
));
}
public function getParent(): string
{
return TextareaType::class;
}
}
Stack trace
[ERROR] Could not process
"/home/username/projects/project-upgrade/src/GroupName/PackageBundle/Form/Type/IpListTex
tareaType.php" file, due to:
"System error: "PhpParser\NodeAbstract::getComments(): Return value must be of type array, bool returned"
Stack trace:
#0 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php(119):
PhpParser\NodeAbstract->getComments()
#1 vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php(77):
PhpParser\NodeAbstract->getDocComment()
#2 vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php(152):
Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory->createFromNode()
#3 vendor/rector/rector/src/Rector/AbstractRector.php(115):
Rector\Php80\Rector\Class_\AnnotationToAttributeRector->refactor()
#4 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(91):
Rector\Rector\AbstractRector->enterNode()
#5 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(187):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#6 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(78):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseArray()
#7 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(114):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#8 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(187):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#9 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(78):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseArray()
#10 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(114):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#11 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(187):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#12 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(78):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseArray()
#13 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(187):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#14 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(78):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseArray()
#15 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(187):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#16 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(78):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseArray()
#17 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(187):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseNode()
#18 vendor/rector/rector/src/PhpParser/NodeTraverser/AbstractImmutableNodeTraverser.php(60):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverseArray()
#19 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(51):
Rector\PhpParser\NodeTraverser\AbstractImmutableNodeTraverser->traverse()
#20 vendor/rector/rector/src/Application/FileProcessor.php(95):
Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverse()
#21 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(178):
Rector\Application\FileProcessor->processFile()
#22 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(152):
Rector\Application\ApplicationFileProcessor->processFile()
#23 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(128):
Rector\Application\ApplicationFileProcessor->processFiles()
#24 vendor/rector/rector/src/Console/Command/ProcessCommand.php(182):
Rector\Application\ApplicationFileProcessor->run()
#25 vendor/rector/rector/vendor/symfony/console/Command/Command.php(289):
Rector\Console\Command\ProcessCommand->execute()
#26 vendor/rector/rector/vendor/symfony/console/Application.php(899):
RectorPrefix202512\Symfony\Component\Console\Command\Command->run()
#27 vendor/rector/rector/vendor/symfony/console/Application.php(279):
RectorPrefix202512\Symfony\Component\Console\Application->doRunCommand()
#28 vendor/rector/rector/src/Console/ConsoleApplication.php(60):
RectorPrefix202512\Symfony\Component\Console\Application->doRun()
#29 vendor/rector/rector/vendor/symfony/console/Application.php(162):
Rector\Console\ConsoleApplication->doRun()
#30 vendor/rector/rector/bin/rector.php(130): RectorPrefix202512\Symfony\Component\Console\Application->run()
#31 vendor/rector/rector/bin/rector(5): require_once('...')
#32 vendor/bin/rector(117): include('...')
#33 {main}". On line: 110
Expected Behaviour
The minimum behaviour is to warn the developer to refactor the code or to rector change it by itself.
Bug Report
Hello team,
I was testing an upgrade from an old symfony code - from 3.4 to 5.4 - and it was going great until today.
Everytime I try to run the demo, it returns the folloing exception: "System error: "PhpParser\NodeAbstract::getComments(): Return value must be of type array, bool returned".
Minimal PHP Code Causing Issue
For some reason, the demo throws the message: Expected config should return callable RectorConfig instance
rector.php
IpListTextareaType.php
Stack trace
Expected Behaviour
The minimum behaviour is to warn the developer to refactor the code or to rector change it by itself.