rectorphp / rector

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

System error: "Multiple variants - use selectFromArgs() instead. #7762

Closed sakarikl closed 1 year ago

sakarikl commented 1 year ago

[ERROR] Could not process "tests/unit/lib/Vk/Cache/ArrayCache/RedisArrayCacheUnitTest.php" file, due to:
"System error: "Multiple variants - use selectFromArgs() instead."

     Stack trace:                                                                                                   
     #0 vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php(126):    
     PHPStan\Reflection\ParametersAcceptorSelector::selectSingle(Array)                                             
     #1 vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php(103):    
     Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard->isReturnTypeChangeAllowed(Object(PhpP 
     arser\Node\Stmt\ClassMethod))                                                                                  
     #2                                                                                                             
     vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnAnnotationIncorrectNullableRector.php(99): 
     Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard->shouldSkipClassMethod(Object(PhpParse 
     r\Node\Stmt\ClassMethod))                                                                                      
     #3 vendor/rector/rector/src/Rector/AbstractRector.php(217):                                                    
     Rector\TypeDeclaration\Rector\ClassMethod\ReturnAnnotationIncorrectNullableRector->refactor(Object(PhpParser\N 
     ode\Stmt\ClassMethod))                                                                                         
     #4 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(176):                          
     Rector\Core\Rector\AbstractRector->enterNode(Object(PhpParser\Node\Stmt\ClassMethod))                          
     #5 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                          
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #6 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(133):                          
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))                                      
     #7 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(133):                          
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Expr\New_))                                        
     #8 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(133):                          
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Expr\Assign))                                      
     #9 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                          
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Expression))                                  
     #10 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                         
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #11 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\ClassMethod))                                 
     #12 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                         
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #13 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))                                      
     #14 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                         
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #15 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Namespace_))                                  
     #16 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(85):                          
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #17 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(42):                              
     PhpParser\NodeTraverser->traverse(Array)                                                                       
     #18 vendor/rector/rector/src/Application/FileProcessor.php(60):                                                
     Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser->traverse(Array)                                       
     #19 vendor/rector/rector/src/Application/FileProcessor/PhpFileProcessor.php(100):                              
     Rector\Core\Application\FileProcessor->refactor(Object(Rector\Core\ValueObject\Application\File),              
     Object(Rector\Core\ValueObject\Configuration))                                                                 
     #20 vendor/rector/rector/packages/Parallel/WorkerRunner.php(135):                                              
     Rector\Core\Application\FileProcessor\PhpFileProcessor->process(Object(Rector\Core\ValueObject\Application\Fil 
     e), Object(Rector\Core\ValueObject\Configuration))                                                             
     #21 vendor/rector/rector/packages/Parallel/WorkerRunner.php(106):                                              
     Rector\Parallel\WorkerRunner->processFiles(Object(Rector\Core\ValueObject\Application\File),                   
     Object(Rector\Core\ValueObject\Configuration), Array)                                                          
     #22 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
     Rector\Parallel\WorkerRunner->Rector\Parallel\{closure}(Array)                                                 
     #23 vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php(117):                                        
     RectorPrefix202302\Evenement\EventEmitter->emit('data', Array)                                                 
     #24 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
     RectorPrefix202302\Clue\React\NDJson\Decoder->handleData(Array)                                                
     #25 vendor/rector/rector/vendor/react/stream/src/Util.php(62):                                                 
     RectorPrefix202302\Evenement\EventEmitter->emit('data', Array)                                                 
     #26 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
     RectorPrefix202302\React\Stream\Util::RectorPrefix202302\React\Stream\{closure}('{"action":"main...')          
     #27 vendor/rector/rector/vendor/react/stream/src/DuplexResourceStream.php(154):                                
     RectorPrefix202302\Evenement\EventEmitter->emit('data', Array)                                                 
     #28 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(201):                                
     RectorPrefix202302\React\Stream\DuplexResourceStream->handleData(Resource id #2827)                            
     #29 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(173):                                
     RectorPrefix202302\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)                               
     #30 vendor/rector/rector/src/Console/Command/WorkerCommand.php(63):                                            
     RectorPrefix202302\React\EventLoop\StreamSelectLoop->run()                                                     
     #31 vendor/rector/rector/vendor/symfony/console/Command/Command.php(311):                                      
     Rector\Core\Console\Command\WorkerCommand->execute(Object(RectorPrefix202302\Symfony\Component\Console\Input\A 
     rgvInput), Object(RectorPrefix202302\Symfony\Component\Console\Output\ConsoleOutput))                          
     #32 vendor/rector/rector/vendor/symfony/console/Application.php(899):                                          
     RectorPrefix202302\Symfony\Component\Console\Command\Command->run(Object(RectorPrefix202302\Symfony\Component\ 
     Console\Input\ArgvInput), Object(RectorPrefix202302\Symfony\Component\Console\Output\ConsoleOutput))           
     #33 vendor/rector/rector/vendor/symfony/console/Application.php(320):                                          
     RectorPrefix202302\Symfony\Component\Console\Application->doRunCommand(Object(Rector\Core\Console\Command\Work 
     erCommand), Object(RectorPrefix202302\Symfony\Component\Console\Input\ArgvInput),                              
     Object(RectorPrefix202302\Symfony\Component\Console\Output\ConsoleOutput))                                     
     #34 vendor/rector/rector/src/Console/ConsoleApplication.php(49):                                               
     RectorPrefix202302\Symfony\Component\Console\Application->doRun(Object(RectorPrefix202302\Symfony\Component\Co 
     nsole\Input\ArgvInput), Object(RectorPrefix202302\Symfony\Component\Console\Output\ConsoleOutput))             
     #35 vendor/rector/rector/vendor/symfony/console/Application.php(206):                                          
     Rector\Core\Console\ConsoleApplication->doRun(Object(RectorPrefix202302\Symfony\Component\Console\Input\ArgvIn 
     put), Object(RectorPrefix202302\Symfony\Component\Console\Output\ConsoleOutput))                               
     #36 vendor/rector/rector/bin/rector.php(128): RectorPrefix202302\Symfony\Component\Console\Application->run()  
     #37 vendor/rector/rector/bin/rector(5): require_once('/Volumes/Repo/v...')                                     
     #38 vendor/bin/rector(120): include('/Volumes/Repo/v...')                                                      
     #39 {main}". On line: 58               

Minimal code to reproduce that error

<?php

declare(strict_types=1);

namespace Vk\Cache\ArrayCache;

class RedisArrayCacheUnitTest extends \PHPUnit\Framework\TestCase
{
    protected function getMockedRedis() : \Redis
    {
        $redis = new class() extends \Redis {
            public function __construct()
            {
                // noop
            }

            public function set($key, $value, $timeout = null)
            {
                throw new \BadMethodCallException('Not implemented in mock object');
            }
        };

        return $redis;
    }
}

with following config

return static function (RectorConfig $rectorConfig) : void {
    $rectorConfig->parallel(60 * 10, 8);

    $rectorConfig->rule(\Rector\CodeQuality\Rector\FuncCall\ChangeArrayPushToArrayAssignRector::class);
    $rectorConfig->ruleWithConfiguration(\Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector::class, [80100]);
    $rectorConfig->rule(\Rector\DeadCode\Rector\Foreach_\RemoveUnusedForeachKeyRector::class);
    $rectorConfig->rule(\Rector\DeadCode\Rector\Node\RemoveNonExistingVarAnnotationRector::class);
    $rectorConfig->rule(\Rector\DeadCode\Rector\Property\RemoveUselessVarTagRector::class);
    $rectorConfig->rule(\Rector\TypeDeclaration\Rector\ClassMethod\ParamAnnotationIncorrectNullableRector::class);
    $rectorConfig->rule(\Rector\TypeDeclaration\Rector\ClassMethod\ReturnAnnotationIncorrectNullableRector::class);
    $rectorConfig->rule(\Rector\TypeDeclaration\Rector\Property\VarAnnotationIncorrectNullableRector::class);
    $rectorConfig->rule(\Rector\Php53\Rector\FuncCall\DirNameFileConstantToDirConstantRector::class);
    $rectorConfig->rule(\Rector\Php71\Rector\List_\ListToArrayDestructRector::class);
    $rectorConfig->rule(\Rector\Php80\Rector\FuncCall\Php8ResourceReturnToObjectRector::class);
    $rectorConfig->rule(\Rector\Php80\Rector\Identical\StrEndsWithRector::class);
    $rectorConfig->rule(\Rector\Php80\Rector\Identical\StrStartsWithRector::class);
    $rectorConfig->rule(\Rector\Php80\Rector\NotIdentical\StrContainsRector::class);

    $rectorConfig->rule(\Rector\PHPUnit\Rector\MethodCall\AssertCompareToSpecificMethodRector::class);

    $rectorConfig->sets([
        PHPUnitSetList::PHPUNIT_100,
    ]);
};
TomasVotruba commented 1 year ago

Thank you for your report!

We'll need an isolated failing demo link from: http://getrector.org/demo, that way we can reproduce the bug.

sakarikl commented 1 year ago

https://getrector.com/demo/745539f2-7137-4808-ba4f-bb3dc1df407f

here.

samsonasik commented 1 year ago

That seems happen on ReturnAnnotationIncorrectNullableRector, ref https://getrector.com/demo/01883f96-77f9-40c8-ad1d-d50c3cffe61b

samsonasik commented 1 year ago

I created PR https://github.com/rectorphp/rector-src/pull/3359 for it.