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

Breadcrumb

  1. Drupal Core 11.1.x

SymfonyCmfRoutingInClassMethodSignatureRule.php

Namespace

mglaman\PHPStanDrupal\Rules\Deprecations

File

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

View source
<?php

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

use Drupal;
use mglaman\PHPStanDrupal\Internal\DeprecatedScopeCheck;
use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\InClassMethodNode;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\ObjectType;
use Symfony\Cmf\Component\Routing\LazyRouteCollection;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
use Symfony\Cmf\Component\Routing\RouteProviderInterface;
use function explode;
use function sprintf;

/**
 * @implements Rule<InClassMethodNode>
 */
final class SymfonyCmfRoutingInClassMethodSignatureRule implements Rule {
    public function getNodeType() : string {
        return InClassMethodNode::class;
    }
    public function processNode(Node $node, Scope $scope) : array {
        if (DeprecatedScopeCheck::inDeprecatedScope($scope)) {
            return [];
        }
        [
            $major,
            $minor,
        ] = explode('.', Drupal::VERSION, 3);
        if ($major !== '9' || (int) $minor < 1) {
            return [];
        }
        $method = $node->getMethodReflection();
        // @phpstan-ignore-next-line
        $cmfRouteObjectInterfaceType = new ObjectType(RouteObjectInterface::class);
        // @phpstan-ignore-next-line
        $cmfRouteProviderInterfaceType = new ObjectType(RouteProviderInterface::class);
        // @phpstan-ignore-next-line
        $cmfLazyRouteCollectionType = new ObjectType(LazyRouteCollection::class);
        $methodSignature = ParametersAcceptorSelector::selectFromArgs($scope, [], $method->getVariants());
        $errors = [];
        $errorMessage = 'Parameter $%s of method %s() uses deprecated %s and removed in Drupal 10. Use %s instead.';
        foreach ($methodSignature->getParameters() as $parameter) {
            foreach ($parameter->getType()
                ->getReferencedClasses() as $referencedClass) {
                $referencedClassType = new ObjectType($referencedClass);
                if ($cmfRouteObjectInterfaceType->equals($referencedClassType)) {
                    $errors[] = RuleErrorBuilder::message(sprintf($errorMessage, $parameter->getName(), $method->getName(), $referencedClass, '\\Drupal\\Core\\Routing\\RouteObjectInterface'))
                        ->tip('Change record: https://www.drupal.org/node/3151009')
                        ->build();
                }
                elseif ($cmfRouteProviderInterfaceType->equals($referencedClassType)) {
                    $errors[] = RuleErrorBuilder::message(sprintf($errorMessage, $parameter->getName(), $method->getName(), $referencedClass, '\\Drupal\\Core\\Routing\\RouteProviderInterface'))
                        ->tip('Change record: https://www.drupal.org/node/3151009')
                        ->build();
                }
                elseif ($cmfLazyRouteCollectionType->equals($referencedClassType)) {
                    $errors[] = RuleErrorBuilder::message(sprintf($errorMessage, $parameter->getName(), $method->getName(), $referencedClass, '\\Drupal\\Core\\Routing\\LazyRouteCollection'))
                        ->tip('Change record: https://www.drupal.org/node/3151009')
                        ->build();
                }
            }
        }
        $errorMessage = 'Return type of method %s::%s() has typehint with deprecated %s and is removed in Drupal 10. Use %s instead.';
        $returnClasses = $methodSignature->getReturnType()
            ->getReferencedClasses();
        foreach ($returnClasses as $returnClass) {
            $returnType = new ObjectType($returnClass);
            if ($cmfRouteObjectInterfaceType->equals($returnType)) {
                $errors[] = RuleErrorBuilder::message(sprintf($errorMessage, $method->getDeclaringClass()
                    ->getName(), $method->getName(), $returnClass, '\\Drupal\\Core\\Routing\\RouteObjectInterface'))
                    ->tip('Change record: https://www.drupal.org/node/3151009')
                    ->build();
            }
            elseif ($cmfRouteProviderInterfaceType->equals($returnType)) {
                $errors[] = RuleErrorBuilder::message(sprintf($errorMessage, $method->getDeclaringClass()
                    ->getName(), $method->getName(), $returnClass, '\\Drupal\\Core\\Routing\\RouteProviderInterface'))
                    ->tip('Change record: https://www.drupal.org/node/3151009')
                    ->build();
            }
            elseif ($cmfLazyRouteCollectionType->equals($returnType)) {
                $errors[] = RuleErrorBuilder::message(sprintf($errorMessage, $method->getDeclaringClass()
                    ->getName(), $method->getName(), $returnClass, '\\Drupal\\Core\\Routing\\LazyRouteCollection'))
                    ->tip('Change record: https://www.drupal.org/node/3151009')
                    ->build();
            }
        }
        return $errors;
    }

}

Classes

Title Deprecated Summary
SymfonyCmfRoutingInClassMethodSignatureRule @implements Rule<InClassMethodNode>

API Navigation

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