Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x

StaticServiceDeprecatedServiceRule.php

Namespace

mglaman\PHPStanDrupal\Rules\Deprecations

File

vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/StaticServiceDeprecatedServiceRule.php

View source
<?php

declare (strict_types=1);
namespace mglaman\PHPStanDrupal\Rules\Deprecations;

use mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition;
use mglaman\PHPStanDrupal\Drupal\ServiceMap;
use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;

/**
 * @implements Rule<Node\Expr\StaticCall>
 */
final class StaticServiceDeprecatedServiceRule implements Rule {
    
    /**
     * @var ServiceMap
     */
    private $serviceMap;
    public function __construct(ServiceMap $serviceMap) {
        $this->serviceMap = $serviceMap;
    }
    public function getNodeType() : string {
        return Node\Expr\StaticCall::class;
    }
    public function processNode(Node $node, Scope $scope) : array {
        if (!$node->name instanceof Node\Identifier) {
            return [];
        }
        $method_name = $node->name
            ->toString();
        if ($method_name !== 'service') {
            return [];
        }
        $class = $node->class;
        if ($class instanceof Node\Name) {
            $calledOnType = $scope->resolveTypeByName($class);
        }
        else {
            $calledOnType = $scope->getType($class);
        }
        $methodReflection = $scope->getMethodReflection($calledOnType, $node->name
            ->toString());
        if ($methodReflection === null) {
            return [];
        }
        $declaringClass = $methodReflection->getDeclaringClass();
        if ($declaringClass->getName() !== 'Drupal') {
            return [];
        }
        $serviceNameArg = $node->args[0];
        assert($serviceNameArg instanceof Node\Arg);
        $serviceName = $serviceNameArg->value;
        // @todo check if var, otherwise throw.
        // ACTUALLY what if it was a constant? can we use a resolver.
        if (!$serviceName instanceof Node\Scalar\String_) {
            return [];
        }
        $service = $this->serviceMap
            ->getService($serviceName->value);
        if ($service instanceof DrupalServiceDefinition && $service->isDeprecated()) {
            return [
                $service->getDeprecatedDescription(),
            ];
        }
        return [];
    }

}

Classes

Title Deprecated Summary
StaticServiceDeprecatedServiceRule @implements Rule<Node\Expr\StaticCall>

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal