staudenmeir / laravel-adjacency-list

Recursive Laravel Eloquent relationships with CTEs
MIT License
1.29k stars 104 forks source link

Internal error: Internal error: Method newEloquentBuilder() was not found in reflection of class Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Descendants. #233

Open marco76tv opened 3 months ago

marco76tv commented 3 months ago

when running php i get this error

Internal error: Internal error: Method newEloquentBuilder() was not found in reflection of class Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Descendants.

staudenmeir commented 3 months ago

Hi @marco76tv, Do you get this error when running PHPStan?

What version of laravel-adjacency-list are you using?

marco76tv commented 3 months ago

yes running with phpstan

larastan/larastan v2.9.2 Larastan

staudenmeir commented 3 months ago

What version of laravel-adjacency-list are you using?

marco76tv commented 3 months ago

staudenmeir/laravel-adjacency-list v1.21

staudenmeir commented 3 months ago

What does your PHPStan/Larastan configuration look like?

marco76tv commented 3 months ago

includes:

parameters:

level: max

paths:
    - ./Modules
    - ./Themes

ignoreErrors:
    - '#Unsafe usage of new static#'
    - '#Unsafe call to private method#'
    - '#PHPDoc tag @mixin contains unknown class #'

excludePaths:
    - ./*/vendor/*
    - ./*/build/*
    - ./*/docs/*
    # - ./*/Tests/*
    - ./*/rector.php
    - ./*/phpinsights.php

bootstrapFiles:
    - ./phpstan_constants.php
#    - ./vendor/amenadiel/jpgraph/src/config.inc.php

scanFiles:
    - ./Modules/Xot/Helpers/Helper.php

editorUrl: 'vscode://file/%%file%%:%%line%%'

tmpDir: ./build/phpstan

checkUnusedViews: false
checkModelProperties: false
checkMissingIterableValueType: false
checkGenericClassInNonGenericObjectType: false
treatPhpDocTypesAsCertain: false
reportUnmatchedIgnoredErrors: false
checkOctaneCompatibility: false
staudenmeir commented 3 months ago

Internal error: Internal error: Method newEloquentBuilder() was not found in reflection of class Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Descendants.

Is that the whole message? Do you see where the error is coming from?

marco76tv commented 3 months ago

 Error

Internal error: Internal error: Method newEloquentBuilder() was not found in reflection of class Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Descendants. while analysing file xxx/xxx/xxx.php Run PHPStan with -v option and post the stack trace to: https://github.com/phpstan/phpstan/issues/new?template=Bug_report.yaml Child process error (exit code 1):

staudenmeir commented 3 months ago

xxx/xxx/xxx.php

This is the relevant part. What is the content of this file?

mxaGianluca commented 3 months ago

Hi @staudenmeir, i've just hit the same issue.

This is the complete output i'm getting:

 -- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
     Error                                                                                                                                                                         
 -- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
     Internal error: Internal error: Method newEloquentBuilder() was not found in reflection of class Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors. while         
     analysing file {application path omitted}/app/Models/FsDirectory.php                                                                                               

     Post the following stack trace to https://github.com/phpstan/phpstan/issues/new?template=Bug_report.yaml:                                                                     
     ## phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Reflection/ClassReflection.php(558)                                                   
     #0 {application path omitted}/vendor/larastan/larastan/src/Methods/BuilderHelper.php(215):                                                                         
     PHPStan\Reflection\ClassReflection->getNativeMethod('newEloquentBuil...')                                                                                                     
     #1 {application path omitted}/vendor/larastan/larastan/src/Methods/RelationForwardsCallsExtension.php(79):                                                         
     Larastan\Larastan\Methods\BuilderHelper->determineBuilderName('Staudenmeir\\Lar...')                                                                                          
     #2 {application path omitted}/vendor/larastan/larastan/src/Methods/RelationForwardsCallsExtension.php(39):                                                         
     Larastan\Larastan\Methods\RelationForwardsCallsExtension->findMethod(Object(PHPStan\Reflection\ClassReflection), 'breadthFirst')                                              
     #3 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Reflection/ClassReflection.php(506):                                                  
     Larastan\Larastan\Methods\RelationForwardsCallsExtension->hasMethod(Object(PHPStan\Reflection\ClassReflection), 'breadthFirst')                                               
     #4 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Type/ObjectType.php(551):                                                             
     PHPStan\Reflection\ClassReflection->hasMethod('breadthFirst')                                                                                                                 
     #5 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(3578): PHPStan\Type\ObjectType->hasMethod('breadthFirst')  
     #6 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(3606):                                                     
     PHPStan\Analyser\MutatingScope->filterTypeWithMethod(Object(PHPStan\Type\Generic\GenericObjectType), 'breadthFirst')                                                          
     #7 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(1417):                                                     
     PHPStan\Analyser\MutatingScope->methodCallReturnType(Object(PHPStan\Type\Generic\GenericObjectType), 'breadthFirst', Object(PhpParser\Node\Expr\MethodCall))                  
     #8 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(1423):                                                     
     PHPStan\Analyser\MutatingScope->PHPStan\Analyser\{closure}()                                                                                                                  
     #9 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(588):                                                      
     PHPStan\Analyser\MutatingScope->resolveType('$this->ancestor...', Object(PhpParser\Node\Expr\MethodCall))                                                                     
     #10 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Rules/FunctionReturnTypeCheck.php(52):                                               
     PHPStan\Analyser\MutatingScope->getType(Object(PhpParser\Node\Expr\MethodCall))                                                                                               
     #11 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Rules/Methods/ReturnTypeRule.php(43):                                                
     PHPStan\Rules\FunctionReturnTypeCheck->checkReturnType(Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Type\ObjectType), Object(PhpParser\Node\Expr\MethodCall),       
     Object(PhpParser\Node\Stmt\Return_), 'Method App\\Mode...', 'Method App\\Mode...', 'Method App\\Mode...', 'Method App\\Mode...', false)                                       
     #12 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(107):                                                      
     PHPStan\Rules\Methods\ReturnTypeRule->processNode(Object(PhpParser\Node\Stmt\Return_), Object(PHPStan\Analyser\MutatingScope))                                                
     #13 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Node/ClassStatementsGatherer.php(108):                                               
     PHPStan\Analyser\FileAnalyser->PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Return_), Object(PHPStan\Analyser\MutatingScope))                                        
     #14 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(586):                                                 
     PHPStan\Node\ClassStatementsGatherer->__invoke(Object(PhpParser\Node\Stmt\Return_), Object(PHPStan\Analyser\MutatingScope))                                                   
     #15 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(477):                                                 
     PHPStan\Analyser\NodeScopeResolver::PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Return_), Object(PHPStan\Analyser\MutatingScope))                                   
     #16 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(420):                                                 
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Return_), Object(PHPStan\Analyser\MutatingScope), Object(Closure),                             
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                    
     #17 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(604):                                                 
     PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\ClassMethod), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),                 
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                    
     #18 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(420):                                                 
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\ClassMethod), Object(PHPStan\Analyser\MutatingScope),                                          
     Object(PHPStan\Node\ClassStatementsGatherer), Object(PHPStan\Analyser\StatementContext))                                                                                      
     #19 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(687):                                                 
     PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Class_), Array, Object(PHPStan\Analyser\MutatingScope),                                       
     Object(PHPStan\Node\ClassStatementsGatherer), Object(PHPStan\Analyser\StatementContext))                                                                                      
     #20 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(420):                                                 
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope), Object(Closure),                              
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                    
     #21 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(659):                                                 
     PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Namespace_), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),                  
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                    
     #22 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(389):                                                 
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Namespace_), Object(PHPStan\Analyser\MutatingScope), Object(Closure),                          
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                    
     #23 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(166):                                                      
     PHPStan\Analyser\NodeScopeResolver->processNodes(Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure))                                                              
     #24 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(132):                                                      
     PHPStan\Analyser\FileAnalyser->analyseFile('...', Array, Object(PHPStan\Rules\LazyRegistry), Object(PHPStan\Collectors\Registry), NULL)                        
     #25 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                      
     PHPStan\Command\WorkerCommand->PHPStan\Command\{closure}(Array)                                                                                                               
     #26 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/clue/ndjson-react/src/Decoder.php(117):                                           
     _PHPStan_5473b6701\Evenement\EventEmitter->emit('data', Array)                                                                                                                
     #27 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                      
     _PHPStan_5473b6701\Clue\React\NDJson\Decoder->handleData(Array)                                                                                                               
     #28 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/Util.php(62):                                                    
     _PHPStan_5473b6701\Evenement\EventEmitter->emit('data', Array)                                                                                                                
     #29 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                      
     _PHPStan_5473b6701\React\Stream\Util::_PHPStan_5473b6701\React\Stream\{closure}('{"action":"anal...')                                                                         
     #30 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/DuplexResourceStream.php(154):                                   
     _PHPStan_5473b6701\Evenement\EventEmitter->emit('data', Array)                                                                                                                
     #31 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(201):                                   
     _PHPStan_5473b6701\React\Stream\DuplexResourceStream->handleData(Resource id #6845)                                                                                           
     #32 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(173):                                   
     _PHPStan_5473b6701\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)                                                                                              
     #33 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(98):                                                       
     _PHPStan_5473b6701\React\EventLoop\StreamSelectLoop->run()                                                                                                                    
     #34 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Command/Command.php(259):                                         
     PHPStan\Command\WorkerCommand->execute(Object(_PHPStan_5473b6701\Symfony\Component\Console\Input\ArgvInput),                                                                  
     Object(_PHPStan_5473b6701\Symfony\Component\Console\Output\ConsoleOutput))                                                                                                    
     #35 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(870):                                             
     _PHPStan_5473b6701\Symfony\Component\Console\Command\Command->run(Object(_PHPStan_5473b6701\Symfony\Component\Console\Input\ArgvInput),                                       
     Object(_PHPStan_5473b6701\Symfony\Component\Console\Output\ConsoleOutput))                                                                                                    
     #36 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(261):                                             
     _PHPStan_5473b6701\Symfony\Component\Console\Application->doRunCommand(Object(PHPStan\Command\WorkerCommand),                                                                 
     Object(_PHPStan_5473b6701\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_5473b6701\Symfony\Component\Console\Output\ConsoleOutput))                              
     #37 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(157):                                             
     _PHPStan_5473b6701\Symfony\Component\Console\Application->doRun(Object(_PHPStan_5473b6701\Symfony\Component\Console\Input\ArgvInput),                                         
     Object(_PHPStan_5473b6701\Symfony\Component\Console\Output\ConsoleOutput))                                                                                                    
     #38 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(124): _PHPStan_5473b6701\Symfony\Component\Console\Application->run()        
     #39 phar://{application path omitted}/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(125): _PHPStan_5473b6701\{closure}()                                         
     #40 {application path omitted}/vendor/phpstan/phpstan/phpstan(8): require('phar:///Users/g...')                                                                    
     #41 {application path omitted}/vendor/bin/phpstan(119): include('...')                                                                              
     #42 {main}                                                                                                                                                                    
     Child process error (exit code 1):       

phpstan.neon:

includes:
    - ./vendor/larastan/larastan/extension.neon
    - ./vendor/ekino/phpstan-banned-code/extension.neon
    - ./vendor/bensampo/laravel-enum/extension.neon

parameters:

    paths:
        - app

    # The level 8 is the highest level
    level: 5

    ignoreErrors:

    banned_code:
        nodes:
            -
                type: Stmt_Echo
                functions: null
            -
                type: Expr_Eval
                functions: null
            -
                type: Expr_Exit
                functions: null
            -
                type: Expr_FuncCall
                functions:
                    - dd
                    - debug_backtrace
                    - dump
                    - exec
                    - passthru
                    - phpinfo
                    - print_r
                    - proc_open
                    - shell_exec
                    - system
                    - var_dump

    excludePaths:
        - ./*/*/FileToBeExcluded.php

    checkMissingIterableValueType: false

Hope this helps.

staudenmeir commented 3 months ago

@mxaGianluca What does app/Models/FsDirectory.php look like?

mxaGianluca commented 3 months ago

@mxaGianluca What does app/Models/FsDirectory.php look like?

I've reduced it to this:

<?php

namespace App\Models;

use Staudenmeir\LaravelAdjacencyList\Eloquent\HasRecursiveRelationships;
use Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors;

class FsDirectory
{
    use HasRecursiveRelationships;

    public function ancestorDirectories(): Ancestors
    {
        return $this->ancestorsAndSelf()
            ->hasParent()
            ->breadthFirst();
    }
}

Removing the ancestorDirectories method will prevent the error from being thrown.

staudenmeir commented 3 months ago

Thanks @mxaGianluca. I can reproduce the error, but I don't know what the package can do to prevent it (if it can do anything). It only seems to occur when you call multiple scopes.

mxaGianluca commented 3 months ago

@staudenmeir i'm not 100% sure, but might this issue be related? https://github.com/larastan/larastan/issues/1759

staudenmeir commented 3 months ago

@mxaGianluca I've read that, but AFAICT, the package's generics are correct.

Did you just now add the ancestorDirectories() relationship and Larastan/PHPStan failed immediately? Or have you had it in your code for a while and the error only started occurring after a Larastan/PHPStan update?

mxaGianluca commented 3 months ago

In my specific case i updated from L9 -> L10 and i updated nunomaduro/larastan:2.2 to larastan/larastan:2.9.4.

I didn't have this error in the older version.

It looks like something that should be fixed upstream.

mxaGianluca commented 2 months ago

It's not a solution yet, but i have a workaround.

public function ancestorDirectories(): Ancestors
{
    return $this
        ->ancestorsAndSelf()
        ->addAncestorConstraints();
}

public function scopeAddAncestorConstraints($query)
{
    $query
        ->hasParent()
        ->breadthFirst();
}

This prevents the error from being thrown.