Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reference to self::* in @extends tag create infinite loop #9039

Closed
VincentLanglet opened this issue Mar 14, 2023 · 6 comments
Closed

Reference to self::* in @extends tag create infinite loop #9039

VincentLanglet opened this issue Mar 14, 2023 · 6 comments
Labels

Comments

@VincentLanglet
Copy link
Contributor

Bug report

The playground crash with

<?php declare(strict_types = 1);

/**
 * @template T
 */
class Voter
{
}

/**
 * @template-extends Voter<self::*>
 */
class Test extends Voter
{
	public const FOO = 'foo';
	public const BAR = 'bar';
	
	private const RULES = [
        self::FOO,
        self::BAR,
    ];
}

but not without the private const https://phpstan.org/r/7af29668-b2a8-44af-9d5e-32a3f7e44a2d

@ondrejmirtes
Copy link
Member

Stack trace:

Uncaught Error: Xdebug has detected a possible infinite loop, and aborted your script with a stack depth of '200' frames in /Users/ondrej/Development/phpstan/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php:110
#0 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(196): PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode->getExtendsTagValues('@extends')
#1 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#2 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#3 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#4 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#5 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#6 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#7 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#8 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#9 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#10 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#11 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#12 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#13 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#14 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#15 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#16 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#17 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#18 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#19 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#20 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#21 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#22 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#23 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#24 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#25 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#26 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#27 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#28 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#29 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#30 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#31 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#32 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#33 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#34 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#35 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#36 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#37 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#38 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#39 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#40 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#41 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#42 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#43 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#44 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#45 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#46 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#47 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#48 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#49 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#50 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#51 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#52 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#53 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#54 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#55 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#56 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#57 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#58 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#59 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#60 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#61 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#62 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#63 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#64 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#65 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#66 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#67 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#68 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#69 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#70 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#71 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#72 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#73 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#74 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#75 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#76 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#77 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#78 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#79 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#80 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#81 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#82 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#83 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#84 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#85 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#86 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#87 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#88 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#89 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#90 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#91 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#92 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#93 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#94 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#95 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#96 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#97 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#98 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#99 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#100 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#101 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#102 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#103 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#104 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#105 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#106 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#107 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#108 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#109 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#110 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#111 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#112 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#113 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#114 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#115 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#116 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#117 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#118 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#119 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#120 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#121 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#122 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#123 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#124 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#125 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#126 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#127 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#128 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#129 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#130 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#131 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#132 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#133 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#134 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#135 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#136 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#137 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#138 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#139 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#140 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#141 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#142 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#143 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#144 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#145 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#146 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#147 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#148 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#149 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#150 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#151 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#152 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#153 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#154 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#155 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#156 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#157 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#158 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#159 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(311): PHPStan\Reflection\ClassReflection->getParentClass()
#160 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(281): PHPStan\PhpDoc\PhpDocBlock::getParentReflections(Object(PHPStan\Reflection\ClassReflection))
#161 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(225): PHPStan\PhpDoc\PhpDocBlock::resolveParentPhpDocBlocks(Object(PHPStan\Reflection\ClassReflection), 'FOO', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', false, Array)
#162 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocBlock.php(172): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockTree(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', 'hasConstant', 'getConstant', 'resolvePhpDocBl...', NULL, Array, Array)
#163 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocInheritanceResolver.php(58): PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), NULL, 'FOO', '/Users/ondrej/D...', NULL, Array, Array)
#164 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(941): PHPStan\PhpDoc\PhpDocInheritanceResolver->resolvePhpDocForConstant(NULL, Object(PHPStan\Reflection\ClassReflection), '/Users/ondrej/D...', 'FOO')
#165 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1871): PHPStan\Reflection\ClassReflection->getConstant('FOO')
#166 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(1921): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchTypeByReflection(Object(PhpParser\Node\Name), 'FOO', Object(PHPStan\Reflection\ClassReflection), Object(Closure))
#167 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(168): PHPStan\Reflection\InitializerExprTypeResolver->getClassConstFetchType(Object(PhpParser\Node\Name), 'FOO', 'Test', Object(Closure))
#168 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\ClassConstFetch), Object(PHPStan\Reflection\InitializerExprContext))
#169 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(496): PHPStan\Reflection\InitializerExprTypeResolver->PHPStan\Reflection\{closure}(Object(PhpParser\Node\Expr\ClassConstFetch))
#170 /Users/ondrej/Development/phpstan/src/Reflection/InitializerExprTypeResolver.php(160): PHPStan\Reflection\InitializerExprTypeResolver->getArrayType(Object(PhpParser\Node\Expr\Array_), Object(Closure))
#171 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(907): PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Expr\Array_), Object(PHPStan\Reflection\InitializerExprContext))
#172 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(163): PHPStan\PhpDoc\TypeNodeResolver->resolveConstTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#173 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(1000): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\ConstTypeNode), Object(PHPStan\Analyser\NameScope))
#174 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(552): PHPStan\PhpDoc\TypeNodeResolver->resolveMultiple(Array, Object(PHPStan\Analyser\NameScope))
#175 /Users/ondrej/Development/phpstan/src/PhpDoc/TypeNodeResolver.php(155): PHPStan\PhpDoc\TypeNodeResolver->resolveGenericTypeNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#176 /Users/ondrej/Development/phpstan/src/PhpDoc/PhpDocNodeResolver.php(198): PHPStan\PhpDoc\TypeNodeResolver->resolve(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(PHPStan\Analyser\NameScope))
#177 /Users/ondrej/Development/phpstan/src/PhpDoc/ResolvedPhpDocBlock.php(430): PHPStan\PhpDoc\PhpDocNodeResolver->resolveExtendsTags(Object(PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode), Object(PHPStan\Analyser\NameScope))
#178 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1355): PHPStan\PhpDoc\ResolvedPhpDocBlock->getExtendsTags()
#179 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(1340): PHPStan\Reflection\ClassReflection->getExtendsTags()
#180 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(193): PHPStan\Reflection\ClassReflection->getFirstExtendsTag()
#181 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(798): PHPStan\Reflection\ClassReflection->getParentClass()
#182 /Users/ondrej/Development/phpstan/src/Reflection/ClassReflection.php(751): PHPStan\Reflection\ClassReflection->getImmediateInterfaces()
#183 /Users/ondrej/Development/phpstan/src/Dependency/DependencyResolver.php(462): PHPStan\Reflection\ClassReflection->getInterfaces()
#184 /Users/ondrej/Development/phpstan/src/Dependency/DependencyResolver.php(49): PHPStan\Dependency\DependencyResolver->addClassToDependencies('Test', Array)
#185 /Users/ondrej/Development/phpstan/src/Analyser/FileAnalyser.php(160): PHPStan\Dependency\DependencyResolver->resolveDependencies(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope))
#186 /Users/ondrej/Development/phpstan/src/Analyser/NodeScopeResolver.php(392): PHPStan\Analyser\FileAnalyser->PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope))
#187 /Users/ondrej/Development/phpstan/src/Analyser/NodeScopeResolver.php(248): PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope), Object(Closure), Object(PHPStan\Analyser\StatementContext))
#188 /Users/ondrej/Development/phpstan/src/Analyser/FileAnalyser.php(179): PHPStan\Analyser\NodeScopeResolver->processNodes(Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure))
#189 /Users/ondrej/Development/phpstan/src/Analyser/Analyser.php(71): PHPStan\Analyser\FileAnalyser->analyseFile('/Users/ondrej/D...', Array, Object(PHPStan\Rules\LazyRegistry), Object(PHPStan\Collectors\Registry), NULL)
#190 /Users/ondrej/Development/phpstan/src/Command/AnalyserRunner.php(68): PHPStan\Analyser\Analyser->analyse(Array, Object(Closure), NULL, true, Array)
#191 /Users/ondrej/Development/phpstan/src/Command/AnalyseApplication.php(235): PHPStan\Command\AnalyserRunner->runAnalyser(Array, Array, Object(Closure), NULL, true, true, '/Users/ondrej/D...', Object(Symfony\Component\Console\Input\ArgvInput))
#192 /Users/ondrej/Development/phpstan/src/Command/AnalyseApplication.php(81): PHPStan\Command\AnalyseApplication->runAnalyser(Array, Array, true, '/Users/ondrej/D...', Object(PHPStan\Command\Symfony\SymfonyOutput), Object(PHPStan\Command\Symfony\SymfonyOutput), Object(Symfony\Component\Console\Input\ArgvInput))
#193 /Users/ondrej/Development/phpstan/src/Command/AnalyseCommand.php(237): PHPStan\Command\AnalyseApplication->analyse(Array, true, Object(PHPStan\Command\Symfony\SymfonyOutput), Object(PHPStan\Command\Symfony\SymfonyOutput), false, true, '/Users/ondrej/D...', Array, Object(Symfony\Component\Console\Input\ArgvInput))
#194 /Users/ondrej/Development/phpstan/vendor/symfony/console/Command/Command.php(298): PHPStan\Command\AnalyseCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#195 /Users/ondrej/Development/phpstan/vendor/symfony/console/Application.php(1040): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#196 /Users/ondrej/Development/phpstan/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand(Object(PHPStan\Command\AnalyseCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#197 /Users/ondrej/Development/phpstan/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#198 /Users/ondrej/Development/phpstan/bin/phpstan(169): Symfony\Component\Console\Application->run()
#199 /Users/ondrej/Development/phpstan/bin/phpstan(170): {closure}()
#200 {main}

@VincentLanglet
Copy link
Contributor Author

The example can be simplified to

<?php declare(strict_types = 1);

/**
 * @template T
 */
class Voter
{
}

/**
 * @template-extends Voter<self::RULES>
 */
class Test extends Voter
{
	private const RULES = 'Foo';
}

@VincentLanglet
Copy link
Contributor Author

Hi @herndlm @ondrejmirtes, I saw you solved multiple infinite loop on phpstan any tips on this one ?

I'm not sure to understand the difference between

/**
 * @template-extends Voter<self::RULES>
 */
class Test extends Voter
{
	private const RULES = 'Foo';
}

and

/**
 * @template-extends Voter<self::RULES>
 */
class Test extends Voter
{
	public const RULES = 'Foo';
}

for the PHPStan stacktrace...

@ondrejmirtes
Copy link
Member

@VincentLanglet Xdebug will give you the stack trace thanks to https://xdebug.org/docs/all_settings#max_nesting_level

@ondrejmirtes
Copy link
Member

Fixed: phpstan/phpstan-src#2414

@github-actions
Copy link

This thread has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Oct 31, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

2 participants