Skip to content

Internal error when using @var to override a type that casts array to object #12803

@canvural

Description

@canvural

Bug report

Hello 👋🏽

Recently I upgrade from 1.12.19 to 1.12.23 and encountered an issue. Sadly could not reproduce in playground. But it is basically this. The one that has comment triggers the error in WrongVariableNameInVarTagRule

Here is the stack trace
Internal error: Class Foo\Bar\stdClass was not found while trying to analyse it - discovering symbols is probably not configured properly. while analysing file
 /foo/bar/some_file.php
 Post the following stack trace to https://github.com/phpstan/phpstan/issues/new?template=Bug_report.yaml:
## phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Type/ObjectType.php(188)
 #0 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Type/ObjectType.php(173): PHPStan\Type\ObjectType->getUnresolvedPropertyPrototype('id',
 Object(PHPStan\Analyser\OutOfClassScope))
 #1 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Type/ObjectShapeType.php(212): PHPStan\Type\ObjectType->getProperty('id',
 Object(PHPStan\Analyser\OutOfClassScope))
 #2 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Type/ObjectShapeType.php(180):
 PHPStan\Type\ObjectShapeType->isSuperTypeOfWithReason(Object(PHPStan\Type\ObjectType))
 #3 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Type/TypeCombinator.php(948):
 PHPStan\Type\ObjectShapeType->isSuperTypeOf(Object(PHPStan\Type\ObjectType))
 #4 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/PhpDoc/TypeNodeResolver.php(475):
 PHPStan\Type\TypeCombinator::intersect(Object(PHPStan\Type\ObjectShapeType), Object(PHPStan\Type\ObjectType))
 #5 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/PhpDoc/TypeNodeResolver.php(176):
 PHPStan\PhpDoc\TypeNodeResolver->resolveIntersectionTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode), Object(PHPStan\Analyser\NameScope))
 #6 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/PhpDoc/TypeNodeResolver.php(928):
 PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode), Object(PHPStan\Analyser\NameScope))
 #7 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/PhpDoc/TypeNodeResolver.php(493): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array,
 Object(PHPStan\Analyser\NameScope))
 #8 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/PhpDoc/TypeNodeResolver.php(184):
 PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
 #9 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/VarTagTypeRuleHelper.php(192):
 PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
 #10 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/VarTagTypeRuleHelper.php(159):
 PHPStan\Rules\PhpDoc\VarTagTypeRuleHelper->isAtLeastMaybeSuperTypeOfVarType(Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Type\Generic\GenericObjectType),
 Object(PHPStan\Type\Generic\GenericObjectType))
 #11 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/VarTagTypeRuleHelper.php(145):
 PHPStan\Rules\PhpDoc\VarTagTypeRuleHelper->checkType(Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Type\Generic\GenericObjectType),
 Object(PHPStan\Type\Generic\GenericObjectType))
 #12 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/VarTagTypeRuleHelper.php(101):
 PHPStan\Rules\PhpDoc\VarTagTypeRuleHelper->shouldVarTagTypeBeReported(Object(PHPStan\Analyser\MutatingScope), Object(PhpParser\Node\Expr\MethodCall),
 Object(PHPStan\Type\Generic\GenericObjectType), Object(PHPStan\Type\Generic\GenericObjectType))
 #13 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/VarTagTypeRuleHelper.php(69):
 PHPStan\Rules\PhpDoc\VarTagTypeRuleHelper->checkExprType(Object(PHPStan\Analyser\MutatingScope), Object(PhpParser\Node\Expr\MethodCall),
 Object(PHPStan\Type\Generic\GenericObjectType))
 #14 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/WrongVariableNameInVarTagRule.php(120):
 PHPStan\Rules\PhpDoc\VarTagTypeRuleHelper->checkVarType(Object(PHPStan\Analyser\MutatingScope), Object(PhpParser\Node\Expr\Variable), Object(PhpParser\Node\Expr\MethodCall), Array,
 Array)
 #15 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/WrongVariableNameInVarTagRule.php(225):
 PHPStan\Rules\PhpDoc\WrongVariableNameInVarTagRule->processAssign(Object(PHPStan\Analyser\MutatingScope), Object(PhpParser\Node\Expr\Variable), Object(PhpParser\Node\Expr\MethodCall),
 Array)
 #16 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Rules/PhpDoc/WrongVariableNameInVarTagRule.php(84):
 PHPStan\Rules\PhpDoc\WrongVariableNameInVarTagRule->processExpression(Object(PHPStan\Analyser\MutatingScope), Object(PhpParser\Node\Expr\Assign), Array)
 #17 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(120):
 PHPStan\Rules\PhpDoc\WrongVariableNameInVarTagRule->processNode(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #18 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Node/ClassStatementsGatherer.php(119):
 PHPStan\Analyser\FileAnalyser->PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #19 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(655):
 PHPStan\Node\ClassStatementsGatherer->__invoke(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #20 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(730):
 PHPStan\Analyser\NodeScopeResolver::PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #21 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(3331):
 PHPStan\Analyser\NodeScopeResolver::PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #22 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(730):
 PHPStan\Analyser\NodeScopeResolver::PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #23 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(3331):
 PHPStan\Analyser\NodeScopeResolver::PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #24 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(535):
 PHPStan\Analyser\NodeScopeResolver::PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope))
 #25 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(465):
 PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #26 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(3356):
 PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Expr\Closure), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #27 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(3610):
 PHPStan\Analyser\NodeScopeResolver->processClosureNode(Object(PhpParser\Node\Stmt\Expression), Object(PhpParser\Node\Expr\Closure), Object(PHPStan\Analyser\MutatingScope),
 Object(Closure), Object(PHPStan\Analyser\ExpressionContext), Object(PHPStan\Type\ClosureType))
 #28 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(2225):
 PHPStan\Analyser\NodeScopeResolver->processArgs(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Reflection\ResolvedMethodReflection), NULL,
 Object(PHPStan\Reflection\ResolvedFunctionVariantWithOriginal), Object(PhpParser\Node\Expr\StaticCall), Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\ExpressionContext), NULL)
 #29 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(729):
 PHPStan\Analyser\NodeScopeResolver->processExprNode(Object(PhpParser\Node\Stmt\Expression), Object(PhpParser\Node\Expr\StaticCall), Object(PHPStan\Analyser\MutatingScope),
 Object(Closure), Object(PHPStan\Analyser\ExpressionContext))
 #30 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(465):
 PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #31 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(3356):
 PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Expr\Closure), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #32 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(3610):
 PHPStan\Analyser\NodeScopeResolver->processClosureNode(Object(PhpParser\Node\Stmt\Expression), Object(PhpParser\Node\Expr\Closure), Object(PHPStan\Analyser\MutatingScope),
 Object(Closure), Object(PHPStan\Analyser\ExpressionContext), Object(PHPStan\Type\CallableType))
 #33 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(2095):
 PHPStan\Analyser\NodeScopeResolver->processArgs(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Reflection\ResolvedMethodReflection),
 Object(PHPStan\Reflection\Php\PhpMethodReflection), Object(PHPStan\Reflection\ResolvedFunctionVariantWithOriginal), Object(PhpParser\Node\Expr\MethodCall),
 Object(PHPStan\Analyser\MutatingScope), Object(Closure), Object(PHPStan\Analyser\ExpressionContext))
 #34 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(729):
 PHPStan\Analyser\NodeScopeResolver->processExprNode(Object(PhpParser\Node\Stmt\Expression), Object(PhpParser\Node\Expr\MethodCall), Object(PHPStan\Analyser\MutatingScope),
 Object(Closure), Object(PHPStan\Analyser\ExpressionContext))
 #35 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(465):
 PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #36 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(654):
 PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\ClassMethod), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #37 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(465):
 PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\ClassMethod), Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Node\ClassStatementsGatherer),
 Object(PHPStan\Analyser\StatementContext))
 #38 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(794):
 PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Class_), Array, Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Node\ClassStatementsGatherer),
 Object(PHPStan\Analyser\StatementContext))
 #39 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(465):
 PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #40 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(761):
 PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Namespace_), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #41 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(430):
 PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Namespace_), Object(PHPStan\Analyser\MutatingScope), Object(Closure),
 Object(PHPStan\Analyser\StatementContext))
 #42 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(179): PHPStan\Analyser\NodeScopeResolver->processNodes(Array,
 Object(PHPStan\Analyser\MutatingScope), Object(Closure))
 #43 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/Analyser.php(79): PHPStan\Analyser\FileAnalyser->analyseFile('/home/can/code/...', Array,
 Object(PHPStan\Rules\LazyRegistry), Object(PHPStan\Collectors\Registry), NULL)
 #44 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyserRunner.php(74): PHPStan\Analyser\Analyser->analyse(Array, Object(Closure),
 Object(Closure), true, Array)
 #45 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyseApplication.php(159): PHPStan\Command\AnalyserRunner->runAnalyser(Array, Array,
 Object(Closure), Object(Closure), true, true, '/home/can/code/...', Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Input\ArgvInput))
 #46 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyseApplication.php(79): PHPStan\Command\AnalyseApplication->runAnalyser(Array, Array,
 true, '/home/can/code/...', Object(PHPStan\Command\Symfony\SymfonyOutput), Object(PHPStan\Command\Symfony\SymfonyOutput),
 Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Input\ArgvInput))
 #47 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyseCommand.php(227): PHPStan\Command\AnalyseApplication->analyse(Array, true,
 Object(PHPStan\Command\Symfony\SymfonyOutput), Object(PHPStan\Command\Symfony\SymfonyOutput), false, true, '/home/can/code/...', Array,
 Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Input\ArgvInput))
 #48 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Command/Command.php(259):
 PHPStan\Command\AnalyseCommand->execute(Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Input\ArgvInput),
 Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Output\ConsoleOutput))
 #49 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(870):
 _PHPStan_ce0aaf2bf\Symfony\Component\Console\Command\Command->run(Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Input\ArgvInput),
 Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Output\ConsoleOutput))
 #50 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(261):
 _PHPStan_ce0aaf2bf\Symfony\Component\Console\Application->doRunCommand(Object(PHPStan\Command\AnalyseCommand), Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Input\ArgvInput),
 Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Output\ConsoleOutput))
 #51 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(157):
 _PHPStan_ce0aaf2bf\Symfony\Component\Console\Application->doRun(Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Input\ArgvInput),
 Object(_PHPStan_ce0aaf2bf\Symfony\Component\Console\Output\ConsoleOutput))
 #52 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(127): _PHPStan_ce0aaf2bf\Symfony\Component\Console\Application->run()
 #53 phar:///foo/bar/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(128): _PHPStan_ce0aaf2bf\{closure}()
 #54 /foo/bar/vendor/phpstan/phpstan/phpstan(8): require('phar:///home/ca...')
 #55 /foo/bar/vendor/bin/phpstan(119): include('/home/can/code/...')
 #56 {main}

Error does not happen when I remove the @var annotation. I removed every extension and error still happens. I know it'll be hard to figure out if it's not reproducible, but I really tried hard to reproduce 😅 If you decide it's a fluke, feel free to close.

Code snippet that reproduces the problem

No response

Expected output

No errors.

Did PHPStan help you today? Did it make you happy in any way?

It helps me and makes me happy every day! Also annoys my coworkers, that's an added bonus.

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