project_start/phpstorm-stubs/tests/Model/PHPInterface.php

92 lines
3.1 KiB
PHP

<?php
namespace StubTests\Model;
use Exception;
use PhpParser\Node\Stmt\Interface_;
use ReflectionClass;
use stdClass;
class PHPInterface extends BasePHPClass
{
public $parentInterfaces = [];
/**
* @param ReflectionClass $reflectionObject
* @return static
*/
public function readObjectFromReflection($reflectionObject)
{
$this->name = $reflectionObject->getName();
foreach ($reflectionObject->getMethods() as $method) {
if ($method->getDeclaringClass()->getName() !== $this->name) {
continue;
}
$this->methods[$method->name] = (new PHPMethod())->readObjectFromReflection($method);
}
$this->parentInterfaces = $reflectionObject->getInterfaceNames();
if (method_exists($reflectionObject, 'getReflectionConstants')) {
foreach ($reflectionObject->getReflectionConstants() as $constant) {
if ($constant->getDeclaringClass()->getName() !== $this->name) {
continue;
}
$this->constants[$constant->name] = (new PHPConst())->readObjectFromReflection($constant);
}
}
return $this;
}
/**
* @param Interface_ $node
* @return static
*/
public function readObjectFromStubNode($node)
{
$this->name = self::getFQN($node);
$this->collectTags($node);
$this->availableVersionsRangeFromAttribute = self::findAvailableVersionsRangeFromAttribute($node->attrGroups);
if (!empty($node->extends)) {
foreach ($node->extends as $extend) {
$this->parentInterfaces[] = $extend->name;
}
}
return $this;
}
/**
* @param stdClass|array $jsonData
* @throws Exception
*/
public function readMutedProblems($jsonData)
{
foreach ($jsonData as $interface) {
if ($interface->name === $this->name) {
if (!empty($interface->problems)) {
foreach ($interface->problems as $problem) {
switch ($problem->description) {
case 'wrong parent':
$this->mutedProblems[StubProblemType::WRONG_PARENT] = $problem->versions;
break;
case 'missing interface':
$this->mutedProblems[StubProblemType::STUB_IS_MISSED] = $problem->versions;
break;
default:
throw new Exception("Unexpected value $problem->description");
}
}
}
if (!empty($interface->methods)) {
foreach ($this->methods as $method) {
$method->readMutedProblems($interface->methods);
}
}
if (!empty($interface->constants)) {
foreach ($this->constants as $constant) {
$constant->readMutedProblems($interface->constants);
}
}
}
}
}
}