/**
* @param \PhpParser\Node\Stmt\ClassMethod $node
* @param \PHPStan\Analyser\Scope $scope
* @return string[]
*/
public function processNode(Node $node, Scope $scope) : array
{
if ($node->name !== '__construct') {
return [];
}
$className = $scope->getClass();
if ($className === null) {
return [];
// anonymous class
}
$classReflection = $this->broker->getClass($className);
if ($classReflection->isInterface()) {
return [];
}
if ($this->callsParentConstruct($node)) {
if ($classReflection->getParentClass() === false) {
return [sprintf('%s::__construct() calls parent constructor but does not extend any class.', $className)];
}
if ($this->getParentConstructorClass($classReflection) === false) {
return [sprintf('%s::__construct() calls parent constructor but parent does not have one.', $className)];
}
} else {
$parentClass = $this->getParentConstructorClass($classReflection);
if ($parentClass !== false) {
return [sprintf('%s::__construct() does not call parent constructor from %s.', $className, $parentClass->getName())];
}
}
return [];
}