-
-
Notifications
You must be signed in to change notification settings - Fork 930
Closed
phpstan/phpstan-src
#1421Labels
Milestone
Description
Bug report
Following custom rule code leads to mentioned Uncaught Error. Calling getName() works fine. Appears since 1.7.11. Stack trace:
bin/phpstan analyse --debug src/AnyFile.php
Note: Using configuration file /app/phpstan.neon.
/app/src/AnyFile.php
Uncaught Error: Typed property ReflectionParameter::$name must not be accessed before initialization in /app/build/PHPStan/Rule/ExampleRule.php:45
#0 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(102): ShipMonk\Rules\PHPStan\Rule\ExampleRule->processNode(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope))
#1 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(380): PHPStan\Analyser\FileAnalyser->PHPStan\Analyser\{closure}(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope))
#2 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(325): PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope), Object(Closure))
#3 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(525): PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Namespace_), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure))
#4 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(296): PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Namespace_), Object(PHPStan\Analyser\MutatingScope), Object(Closure))
#5 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(189): PHPStan\Analyser\NodeScopeResolver->processNodes(Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure))
#6 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/Analyser.php(61): PHPStan\Analyser\FileAnalyser->analyseFile('...', Array, Object(PHPStan\Rules\Registry), NULL)
#7 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyserRunner.php(62): PHPStan\Analyser\Analyser->analyse(Array, Object(Closure), NULL, true, Array)
#8 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyseApplication.php(144): PHPStan\Command\AnalyserRunner->runAnalyser(Array, Array, Object(Closure), NULL, true, true, '...', NULL, NULL, Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Input\ArgvInput))
#9 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyseApplication.php(72): PHPStan\Command\AnalyseApplication->runAnalyser(Array, Array, true, '...', Object(PHPStan\Command\Symfony\SymfonyOutput), Object(PHPStan\Command\Symfony\SymfonyOutput), Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Input\ArgvInput))
#10 phar:///app/vendor/phpstan/phpstan/phpstan.phar/src/Command/AnalyseCommand.php(168): PHPStan\Command\AnalyseApplication->analyse(Array, true, Object(PHPStan\Command\Symfony\SymfonyOutput), Object(PHPStan\Command\Symfony\SymfonyOutput), false, true, '...', Array, Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Input\ArgvInput))
#11 phar:///app/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Command/Command.php(259): PHPStan\Command\AnalyseCommand->execute(Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Output\ConsoleOutput))
#12 phar:///app/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(856): _PHPStan_23e95a9f5\Symfony\Component\Console\Command\Command->run(Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Output\ConsoleOutput))
#13 phar:///app/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(259): _PHPStan_23e95a9f5\Symfony\Component\Console\Application->doRunCommand(Object(PHPStan\Command\AnalyseCommand), Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Output\ConsoleOutput))
#14 phar:///app/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(157): _PHPStan_23e95a9f5\Symfony\Component\Console\Application->doRun(Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_23e95a9f5\Symfony\Component\Console\Output\ConsoleOutput))
#15 phar:///app/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(127): _PHPStan_23e95a9f5\Symfony\Component\Console\Application->run()
#16 phar:///app/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(128): _PHPStan_23e95a9f5\{closure}()
#17 /app/bin/phpstan(8): require('...')
#18 {main}
ExampleClass looks like this:
class ExampleClass
{
private function exampleMethod(string $arg): void
{
}
}
Code snippet that reproduces the problem
/**
* @implements Rule<Class_>
*/
class ExampleRule implements Rule
{
private ReflectionProvider $reflectionProvider;
public function __construct(ReflectionProvider $reflectionProvider)
{
$this->reflectionProvider = $reflectionProvider;
}
public function getNodeType(): string
{
return Class_::class;
}
/**
* @param Class_ $node
* @return string[] errors
*/
public function processNode(Node $node, Scope $scope): array
{
$classReflection = $this->reflectionProvider->getClass(ExampleClass::class)->getNativeReflection();
$methodReflection = $classReflection->getMethod('exampleMethod');
foreach ($methodReflection->getParameters() as $parameter) {
if ($parameter->name === 'arg') { // getName works
return [];
}
}
return [];
}
}
Expected output
No error.