function SymfonyCmfRoutingInClassMethodSignatureRule::processNode
File
-
vendor/
mglaman/ phpstan-drupal/ src/ Rules/ Deprecations/ SymfonyCmfRoutingInClassMethodSignatureRule.php, line 31
Class
- SymfonyCmfRoutingInClassMethodSignatureRule
- @implements Rule<InClassMethodNode>
Namespace
mglaman\PHPStanDrupal\Rules\DeprecationsCode
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;
}