Skip to content

Call to undefined method Rector\Core\PhpParser\Printer\BetterStandardPrinter::pPHPStan_Node_AlwaysRememberedExpr() #8105

@smortexa

Description

@smortexa

rector: v0.17

Reproduction:

Try to refactor the following code with Rector:

/**
     * @throws Throwable
     */
    public function show(Category $category, Request $request): View|RedirectResponse|EntityCollection
    {


        $this->type = match (request('type')) {
            'multimedia' => 'multimedia',
            default => 'news'
        };

        $not_published_news_in_category = $category
            ->news()
            ->select(['news.id'])
            ->notPublished()
            ->orderBy('news.created_at', 'desc')
            ->toBase()
            ->get(250)
            ->pluck('id')
            ->toArray();

        $not_published_multimedia_in_category = $category
            ->multimedia()
            ->select(['multimedia.id'])
            ->notPublished()
            ->orderBy('multimedia.created_at', 'desc')
            ->toBase()
            ->get(250)
            ->pluck('id')
            ->toArray();

        $topEntities = rescue(fn (): Collection => Categorizable::query()
            ->select(['id', 'order', 'categorizable_id', 'categorizable_type'])
            ->where('category_id', $category->id)
            ->where(function (Builder $query) use (
                &$not_published_multimedia_in_category,
                &$not_published_news_in_category
            ): void {
                $query->where(function (Builder $query) use (&$not_published_news_in_category): void {
                    $query->where('categorizable_type', array_search(News::class, Relation::morphMap(), true));
                    $query->whereIntegerNotInRaw('categorizable_id', $not_published_news_in_category);
                });
                $query->orWhere(function (Builder $query) use (&$not_published_multimedia_in_category): void {
                    $query->where('categorizable_type', array_search(Multimedia::class, Relation::morphMap(), true));
                    $query->whereIntegerNotInRaw('categorizable_id', $not_published_multimedia_in_category);
                });
            })
            ->orderByRaw('ISNULL(`order`), `order` ASC')
            ->orderBy('created_at', 'desc')
            ->take(3)
            ->get()
            ->transform(function (Categorizable $item): ?Model {
                $entityType = Relation::getMorphedModel($item['categorizable_type']);

                $entity = match ($entityType) {
                    News::class => News::query()
                        ->select(columns: array_map(fn ($item) => "news.$item", HomeController::$columns))
                        ->published()
                        ->with('categories')
                        ->withCount('allComments')
                        ->firstWhere('id', $item['categorizable_id'])
                        ?->setAttribute('order', $item['order']),
                    Multimedia::class => Multimedia::query()
                        ->select(columns: [
                            ...array_map(fn ($item) => "multimedia.$item", HomeController::$columns), 'multimedia.type',
                        ])
                        ->published()
                        ->with('categories')
                        ->withCount('allComments')
                        ->firstWhere('id', $item['categorizable_id'])
                        ?->setAttribute('order', $item['order']),
                };

                if ($entity instanceof Model) {
                    if (News::class === $entityType) {
                        $this->category_top_news_id[] = $entity['id'];
                    }

                    if (Multimedia::class === $entityType) {
                        $this->category_top_multimedia_id[] = $entity['id'];
                    }
                }

                return $entity;
            }));

        $items_builder = diligently(function () use (&$category, &$request): MorphToMany {
            return match ($this->type) {
                'multimedia' => $this->query($category->multimedia()),
                default => $this->query($category->news()),
            };
        });

        return match (request()->wantsJson()) {
            true => new EntityCollection($items_builder->take(10)->get()),
            default => view('categories.single', [
                'category' => $category,
                'items' => $items_builder->paginate(10),
                'topEntities' => $topEntities,
            ])
        };
    }
[ERROR] Could not process "/Users/home/www/ion/app/Http/Controllers/CategoryController.php" file, due to:           
         "System error: "Call to undefined method                                                                       
         Rector\Core\PhpParser\Printer\BetterStandardPrinter::pPHPStan_Node_AlwaysRememberedExpr()"                     
                                                                                                                        
         Stack trace:                                                                                                   
         #0 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(140):                                  
         PhpParser\PrettyPrinterAbstract->p(Object(PHPStan\Node\Expr\AlwaysRememberedExpr), false)                      
         #1 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php(579):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->p(Object(PHPStan\Node\Expr\AlwaysRememberedExpr))         
         #2 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(499):                  
         PhpParser\PrettyPrinter\Standard->pExpr_Match(Object(PhpParser\Node\Expr\Match_))                              
         #3 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(140):                                  
         PhpParser\PrettyPrinterAbstract->p(Object(PhpParser\Node\Expr\Match_), false)                                  
         #4 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php(777):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->p(Object(PhpParser\Node\Expr\Match_))                     
         #5 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(499):                  
         PhpParser\PrettyPrinter\Standard->pStmt_Return(Object(PhpParser\Node\Stmt\Return_))                            
         #6 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(140):                                  
         PhpParser\PrettyPrinterAbstract->p(Object(PhpParser\Node\Stmt\Return_), false)                                 
         #7 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(289):                  
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->p(Object(PhpParser\Node\Stmt\Return_))                    
         #8 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(306):                                  
         PhpParser\PrettyPrinterAbstract->pStmts(Array, true)                                                           
         #9 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php(575):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->pStmts(Array)                                             
         #10 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(247):                                 
         PhpParser\PrettyPrinter\Standard->pExpr_Closure(Object(PhpParser\Node\Expr\Closure))                           
         #11 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(499):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->pExpr_Closure(Object(PhpParser\Node\Expr\Closure))        
         #12 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(140):                                 
         PhpParser\PrettyPrinterAbstract->p(Object(PhpParser\Node\Expr\Closure), false)                                 
         #13 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php(25):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->p(Object(PhpParser\Node\Expr\Closure))                    
         #14 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(499):                 
         PhpParser\PrettyPrinter\Standard->pArg(Object(PhpParser\Node\Arg))                                             
         #15 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(140):                                 
         PhpParser\PrettyPrinterAbstract->p(Object(PhpParser\Node\Arg), false)                                          
         #16 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(377):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->p(Object(PhpParser\Node\Arg))                             
         #17 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(391):                 
         PhpParser\PrettyPrinterAbstract->pImplode(Array, ', ')                                                         
         #18 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(362):                                 
         PhpParser\PrettyPrinterAbstract->pCommaSeparated(Array)                                                        
         #19 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php(943):                
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->pCommaSeparated(Array)                                    
         #20 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php(484):                
         PhpParser\PrettyPrinter\Standard->pMaybeMultiline(Array)                                                       
         #21 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(499):                 
         PhpParser\PrettyPrinter\Standard->pExpr_FuncCall(Object(PhpParser\Node\Expr\FuncCall))                         
         #22 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(140):                                 
         PhpParser\PrettyPrinterAbstract->p(Object(PhpParser\Node\Expr\FuncCall), false)                                
         #23 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(289):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->p(Object(PhpParser\Node\Expr\FuncCall))                   
         #24 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(306):                                 
         PhpParser\PrettyPrinterAbstract->pStmts(Array, false)                                                          
         #25 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php(203):                 
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->pStmts(Array, false)                                      
         #26 vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php(119):                                 
         PhpParser\PrettyPrinterAbstract->prettyPrint(Array)                                                            
         #27 vendor/rector/rector/src/PhpParser/Comparing/NodeComparator.php(33):                                       
         Rector\Core\PhpParser\Printer\BetterStandardPrinter->print(Array)                                              
         #28 vendor/rector/rector/src/PhpParser/Comparing/NodeComparator.php(52):                                       
         Rector\Core\PhpParser\Comparing\NodeComparator->printWithoutComments(Array)                                    
         #29 vendor/rector/rector/rules/DeadCode/Rector/Expression/SimplifyMirrorAssignRector.php(47):                  
         Rector\Core\PhpParser\Comparing\NodeComparator->areNodesEqual(Object(PhpParser\Node\Expr\Variable),            
         Object(PhpParser\Node\Expr\FuncCall))                                                                          
         #30 vendor/rector/rector/src/Rector/AbstractRector.php(204):                                                   
         Rector\DeadCode\Rector\Expression\SimplifyMirrorAssignRector->refactor(Object(PhpParser\Node\Stmt\Expression)) 
         #31 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(176):                         
         Rector\Core\Rector\AbstractRector->enterNode(Object(PhpParser\Node\Stmt\Expression))                           
         #32 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                         
         PhpParser\NodeTraverser->traverseArray(Array)                                                                  
         #33 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\ClassMethod))                                 
         #34 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                         
         PhpParser\NodeTraverser->traverseArray(Array)                                                                  
         #35 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))                                      
         #36 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                         
         PhpParser\NodeTraverser->traverseArray(Array)                                                                  
         #37 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Namespace_))                                  
         #38 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(85):                          
         PhpParser\NodeTraverser->traverseArray(Array)                                                                  
         #39 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(43):                              
         PhpParser\NodeTraverser->traverse(Array)                                                                       
         #40 vendor/rector/rector/src/Application/FileProcessor.php(44):                                                
         Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser->traverse(Array)                                       
         #41 vendor/rector/rector/src/Application/FileProcessor/PhpFileProcessor.php(108):                              
         Rector\Core\Application\FileProcessor->refactor(Object(Rector\Core\ValueObject\Application\File))              
         #42 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(171):                                    
         Rector\Core\Application\FileProcessor\PhpFileProcessor->process(Object(Rector\Core\ValueObject\Application\Fil 
         e), Object(Rector\Core\ValueObject\Configuration))                                                             
         #43 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(144):                                    
         Rector\Core\Application\ApplicationFileProcessor->processFile(Object(Rector\Core\ValueObject\Application\File) 
         , Array, Object(Rector\Core\ValueObject\Configuration))                                                        
         #44 vendor/rector/rector/packages/Parallel/WorkerRunner.php(65):                                               
         Rector\Core\Application\ApplicationFileProcessor->processFiles(Array,                                          
         Object(Rector\Core\ValueObject\Configuration))                                                                 
         #45 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
         Rector\Parallel\WorkerRunner->Rector\Parallel\{closure}(Array)                                                 
         #46 vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php(117):                                        
         RectorPrefix202307\Evenement\EventEmitter->emit('data', Array)                                                 
         #47 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
         RectorPrefix202307\Clue\React\NDJson\Decoder->handleData(Array)                                                
         #48 vendor/rector/rector/vendor/react/stream/src/Util.php(62):                                                 
         RectorPrefix202307\Evenement\EventEmitter->emit('data', Array)                                                 
         #49 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                   
         RectorPrefix202307\React\Stream\Util::RectorPrefix202307\React\Stream\{closure}('{"action":"main...')          
         #50 vendor/rector/rector/vendor/react/stream/src/DuplexResourceStream.php(154):                                
         RectorPrefix202307\Evenement\EventEmitter->emit('data', Array)                                                 
         #51 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(201):                                
         RectorPrefix202307\React\Stream\DuplexResourceStream->handleData(Resource id #2861)                            
         #52 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(173):                                
         RectorPrefix202307\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)                               
         #53 vendor/rector/rector/src/Console/Command/WorkerCommand.php(63):                                            
         RectorPrefix202307\React\EventLoop\StreamSelectLoop->run()                                                     
         #54 vendor/rector/rector/vendor/symfony/console/Command/Command.php(325):                                      
         Rector\Core\Console\Command\WorkerCommand->execute(Object(RectorPrefix202307\Symfony\Component\Console\Input\A 
         rgvInput), Object(RectorPrefix202307\Symfony\Component\Console\Output\ConsoleOutput))                          
         #55 vendor/rector/rector/vendor/symfony/console/Application.php(944):                                          
         RectorPrefix202307\Symfony\Component\Console\Command\Command->run(Object(RectorPrefix202307\Symfony\Component\ 
         Console\Input\ArgvInput), Object(RectorPrefix202307\Symfony\Component\Console\Output\ConsoleOutput))           
         #56 vendor/rector/rector/vendor/symfony/console/Application.php(326):                                          
         RectorPrefix202307\Symfony\Component\Console\Application->doRunCommand(Object(Rector\Core\Console\Command\Work 
         erCommand), Object(RectorPrefix202307\Symfony\Component\Console\Input\ArgvInput),                              
         Object(RectorPrefix202307\Symfony\Component\Console\Output\ConsoleOutput))                                     
         #57 vendor/rector/rector/src/Console/ConsoleApplication.php(54):                                               
         RectorPrefix202307\Symfony\Component\Console\Application->doRun(Object(RectorPrefix202307\Symfony\Component\Co 
         nsole\Input\ArgvInput), Object(RectorPrefix202307\Symfony\Component\Console\Output\ConsoleOutput))             
         #58 vendor/rector/rector/vendor/symfony/console/Application.php(212):                                          
         Rector\Core\Console\ConsoleApplication->doRun(Object(RectorPrefix202307\Symfony\Component\Console\Input\ArgvIn 
         put), Object(RectorPrefix202307\Symfony\Component\Console\Output\ConsoleOutput))                               
         #59 vendor/rector/rector/bin/rector.php(132): RectorPrefix202307\Symfony\Component\Console\Application->run()  
         #60 vendor/rector/rector/bin/rector(5): require_once('/Users/mortexa/...')                                     
         #61 vendor/bin/rector(120): include('/Users/mortexa/...')                                                      
         #62 {main}". On line: 499 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions