ai_upgrade_assistant-0.2.0-alpha2/src/Service/NodeVisitor/DeprecatedFunctionVisitor.php
src/Service/NodeVisitor/DeprecatedFunctionVisitor.php
<?php
namespace Drupal\ai_upgrade_assistant\Service\NodeVisitor;
use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;
/**
* Node visitor that detects deprecated function calls.
*/
class DeprecatedFunctionVisitor extends NodeVisitorAbstract {
/**
* List of findings.
*
* @var array
*/
protected $findings = [];
/**
* List of deprecated functions and their replacements.
*
* @var array
*/
protected $deprecatedFunctions = [
// Core functions
'drupal_set_message' => [
'replacement' => '\Drupal::messenger()->addMessage()',
'version' => '8.5.0',
'critical' => true,
],
'format_date' => [
'replacement' => '\Drupal::service("date.formatter")->format()',
'version' => '8.0.0',
'critical' => true,
],
// Entity loading
'node_load' => [
'replacement' => '\Drupal::entityTypeManager()->getStorage("node")->load()',
'version' => '8.0.0',
'critical' => true,
],
'user_load' => [
'replacement' => '\Drupal::entityTypeManager()->getStorage("user")->load()',
'version' => '8.0.0',
'critical' => true,
],
'file_load' => [
'replacement' => '\Drupal::entityTypeManager()->getStorage("file")->load()',
'version' => '8.0.0',
'critical' => true,
],
'entity_load' => [
'replacement' => '\Drupal::entityTypeManager()->getStorage($entity_type)->load()',
'version' => '8.0.0',
'critical' => true,
],
// Database
'db_query' => [
'replacement' => '\Drupal::database()->query()',
'version' => '8.0.0',
'critical' => true,
],
'db_select' => [
'replacement' => '\Drupal::database()->select()',
'version' => '8.0.0',
'critical' => true,
],
// File system
'file_unmanaged_copy' => [
'replacement' => '\Drupal::service("file_system")->copy()',
'version' => '8.7.0',
'critical' => true,
],
'file_unmanaged_delete' => [
'replacement' => '\Drupal::service("file_system")->delete()',
'version' => '8.7.0',
'critical' => true,
],
'file_unmanaged_move' => [
'replacement' => '\Drupal::service("file_system")->move()',
'version' => '8.7.0',
'critical' => true,
],
// Cache
'cache_get' => [
'replacement' => '\Drupal::cache()->get()',
'version' => '8.0.0',
'critical' => true,
],
'cache_set' => [
'replacement' => '\Drupal::cache()->set()',
'version' => '8.0.0',
'critical' => true,
],
// URL/path handling
'drupal_get_path' => [
'replacement' => '\Drupal::service("extension.list.$type")->getPath()',
'version' => '9.3.0',
'critical' => true,
],
'drupal_get_filename' => [
'replacement' => '\Drupal::service("extension.list.$type")->getPathname()',
'version' => '9.3.0',
'critical' => true,
],
// Form API
'drupal_get_form' => [
'replacement' => '\Drupal::formBuilder()->getForm()',
'version' => '8.0.0',
'critical' => true,
],
'drupal_build_form' => [
'replacement' => '\Drupal::formBuilder()->buildForm()',
'version' => '8.0.0',
'critical' => true,
],
// Theme
'theme' => [
'replacement' => '\Drupal::theme()->render()',
'version' => '8.0.0',
'critical' => true,
],
// Language
'language_default' => [
'replacement' => '\Drupal::languageManager()->getDefaultLanguage()',
'version' => '8.0.0',
'critical' => true,
],
// State system
'variable_get' => [
'replacement' => '\Drupal::state()->get()',
'version' => '8.0.0',
'critical' => true,
],
'variable_set' => [
'replacement' => '\Drupal::state()->set()',
'version' => '8.0.0',
'critical' => true,
],
// Batch API
'batch_set' => [
'replacement' => '$batch = new Batch(); $batch->set()',
'version' => '10.0.0',
'critical' => false,
],
// Token handling
'token_replace' => [
'replacement' => '\Drupal::token()->replace()',
'version' => '8.0.0',
'critical' => true,
],
];
/**
* {@inheritdoc}
*/
public function leaveNode(Node $node) {
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
$name = $node->name->toString();
if (isset($this->deprecatedFunctions[$name])) {
$this->findings[] = [
'type' => 'deprecated_function',
'name' => $name,
'line' => $node->getLine(),
'replacement' => $this->deprecatedFunctions[$name]['replacement'],
'version' => $this->deprecatedFunctions[$name]['version'],
'critical' => $this->deprecatedFunctions[$name]['critical'],
'file' => $node->getAttribute('file'),
'args_count' => count($node->args),
];
// Add context about the function call
if ($node->args) {
$args = [];
foreach ($node->args as $arg) {
if ($arg->value instanceof Node\Scalar\String_) {
$args[] = $arg->value->value;
}
}
if ($args) {
$this->findings[count($this->findings) - 1]['arg_values'] = $args;
}
}
}
}
return null;
}
/**
* Gets the findings.
*
* @return array
* Array of findings.
*/
public function getFindings() {
return $this->findings;
}
/**
* Resets the findings.
*/
public function reset() {
$this->findings = [];
}
}
