rectorphp / rector

Instant Upgrades and Automated Refactoring of any PHP 5.3+ code
https://getrector.com
MIT License
8.59k stars 680 forks source link

Crash in PregReplaceEModifierRector #7573

Closed jtojnar closed 1 year ago

jtojnar commented 1 year ago

Bug Report

Running Rector on https://github.com/fossar/selfoss/blob/3ac16cd741f2d6cf591dc17ab5238cd48fbc6f54/src/helpers/Configuration.php makes it crash with:

 [ERROR] Could not process "/home/jtojnar/Projects/selfoss/src/helpers/Configuration.php" file, due to:                 
         "System error: "Syntax error, unexpected '$':1"                                                                

         Stack trace:                                                                                                   
         #0 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php(143):                         
         PhpParser\ParserAbstract->doParse()                                                                            
         #1 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php(48):                         
         PhpParser\ParserAbstract->parse('<?php _$0;', Object(PhpParser\ErrorHandler\Throwing))                         
         #2 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php(31):                         
         PhpParser\Parser\Multiple->tryParse(Object(PhpParser\Parser\Php7), Object(PhpParser\ErrorHandler\Throwing), '<?php
         _$0;')                                                                                                         
         #3 vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php(37): PhpParser\Parser\Multiple->parse('<?php _$0;')
         #4 vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php(171):                             
         Rector\Core\PhpParser\Parser\SimplePhpParser->parseString('<?php _$0;')                                        
         #5 vendor/rector/rector/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php(103):                       
         Rector\Php72\NodeFactory\AnonymousFunctionFactory->createAnonymousFunctionFromExpr(Object(PhpParser\Node\Scalar\String_
         ))                                                                                                             
         #6 vendor/rector/rector/src/Rector/AbstractRector.php(220):                                                    
         Rector\Php55\Rector\FuncCall\PregReplaceEModifierRector->refactor(Object(PhpParser\Node\Expr\FuncCall))        
         #7 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(113):                          
         Rector\Core\Rector\AbstractRector->enterNode(Object(PhpParser\Node\Expr\FuncCall))                             
         #8 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                          
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Expression))                                  
         #9 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                          
         PhpParser\NodeTraverser->traverseArray(Array)                                                                  
         #10 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Namespace_))                                  
         #11 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(85):                          
         PhpParser\NodeTraverser->traverseArray(Array)                                                                  
         #12 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(42):                              
         PhpParser\NodeTraverser->traverse(Array)                                                                       
         #13 vendor/rector/rector/src/Application/FileProcessor.php(60):                                                
         Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser->traverse(Array)                                       
         #14 vendor/rector/rector/src/Application/FileProcessor/PhpFileProcessor.php(133):                              
         Rector\Core\Application\FileProcessor->refactor(Object(Rector\Core\ValueObject\Application\File),              
         Object(Rector\Core\ValueObject\Configuration))                                                                 
         #15 vendor/rector/rector/src/Application/FileProcessor/PhpFileProcessor.php(101):                              
         Rector\Core\Application\FileProcessor\PhpFileProcessor->refactorNodesWithRectors(Object(Rector\Core\ValueObject\Applica
         tion\File), Object(Rector\Core\ValueObject\Configuration))                                                     
         #16 vendor/rector/rector/packages/Parallel/WorkerRunner.php(98):                                               
         Rector\Core\Application\FileProcessor\PhpFileProcessor->process(Object(Rector\Core\ValueObject\Application\File),
         Object(Rector\Core\ValueObject\Configuration))                                                                 
         #17 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
         Rector\Parallel\WorkerRunner->Rector\Parallel\{closure}(Array)                                                 
         #18 vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php(110):                                        
         RectorPrefix202211\Evenement\EventEmitter->emit('data', Array)                                                 
         #19 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
         RectorPrefix202211\Clue\React\NDJson\Decoder->handleData(Array)                                                
         #20 vendor/rector/rector/vendor/react/stream/src/Util.php(62): RectorPrefix202211\Evenement\EventEmitter->emit('data',
         Array)                                                                                                         
         #21 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
         RectorPrefix202211\React\Stream\Util::RectorPrefix202211\React\Stream\{closure}('{"action":"main...')          
         #22 vendor/rector/rector/vendor/react/stream/src/DuplexResourceStream.php(154):                                
         RectorPrefix202211\Evenement\EventEmitter->emit('data', Array)                                                 
         #23 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(201):                                
         RectorPrefix202211\React\Stream\DuplexResourceStream->handleData(Resource id #2766)                            
         #24 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(173):                                
         RectorPrefix202211\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)                               
         #25 vendor/rector/rector/src/Console/Command/WorkerCommand.php(63):                                            
         RectorPrefix202211\React\EventLoop\StreamSelectLoop->run()                                                     
         #26 vendor/rector/rector/vendor/symfony/console/Command/Command.php(307):                                      
         Rector\Core\Console\Command\WorkerCommand->execute(Object(RectorPrefix202211\Symfony\Component\Console\Input\ArgvInput)
         , Object(RectorPrefix202211\Symfony\Component\Console\Output\ConsoleOutput))                                   
         #27 vendor/rector/rector/vendor/symfony/console/Application.php(896):                                          
         RectorPrefix202211\Symfony\Component\Console\Command\Command->run(Object(RectorPrefix202211\Symfony\Component\Console\I
         nput\ArgvInput), Object(RectorPrefix202211\Symfony\Component\Console\Output\ConsoleOutput))                    
         #28 vendor/rector/rector/vendor/symfony/console/Application.php(312):                                          
         RectorPrefix202211\Symfony\Component\Console\Application->doRunCommand(Object(Rector\Core\Console\Command\WorkerCommand
         ), Object(RectorPrefix202211\Symfony\Component\Console\Input\ArgvInput),                                       
         Object(RectorPrefix202211\Symfony\Component\Console\Output\ConsoleOutput))                                     
         #29 vendor/rector/rector/src/Console/ConsoleApplication.php(49):                                               
         RectorPrefix202211\Symfony\Component\Console\Application->doRun(Object(RectorPrefix202211\Symfony\Component\Console\Inp
         ut\ArgvInput), Object(RectorPrefix202211\Symfony\Component\Console\Output\ConsoleOutput))                      
         #30 vendor/rector/rector/vendor/symfony/console/Application.php(208):                                          
         Rector\Core\Console\ConsoleApplication->doRun(Object(RectorPrefix202211\Symfony\Component\Console\Input\ArgvInput),
         Object(RectorPrefix202211\Symfony\Component\Console\Output\ConsoleOutput))                                     
         #31 vendor/rector/rector/bin/rector.php(128): RectorPrefix202211\Symfony\Component\Console\Application->run()  
         #32 vendor/rector/rector/bin/rector(5): require_once('/home/jtojnar/P...')                                     
         #33 vendor/bin/rector(120): include('/home/jtojnar/P...')                                                      
         #34 {main}". On line: 269                                                                                      
Subject Details
Rector version dev-main@ecee0c released at 2022-11-02 15:41:41

Minimal PHP Code Causing Issue

<?php
preg_replace('([[:upper:]]+)', '_$0', 'foo');
<?php

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;

return static function (RectorConfig $rectorConfig): void {
    $rectorConfig->sets([
       LevelSetList::UP_TO_PHP_72
    ]);
};
jtojnar commented 1 year ago

By the way, if I paste the full file to https://getrector.org/demo, I get error 500.

jtojnar commented 1 year ago

@TomasVotruba looks like the demo still fails with the full file. Should I open a new issue?

samsonasik commented 1 year ago

@jtojnar we limit the code submitted to demo page to 100 lines.

More than 100 lines should show flash message, if it got 500 error, it possibly bug on getrector.org setting somewhere