From c3213f10bc7f9b60b93684d3712bee8d116d5310 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Apr 2026 19:40:33 +0700 Subject: [PATCH 1/4] Allow rector ^2.4.1 and replace file with getFile() if method exists --- composer.json | 2 +- src/Rector/Convert/HookConvertRector.php | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 996ac159..d3fd7227 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "ast" ], "require": { - "rector/rector": "^1 || ^2", + "rector/rector": "^1 || ^2.4.1", "webflo/drupal-finder": "^1.2" }, "license": "MIT", diff --git a/src/Rector/Convert/HookConvertRector.php b/src/Rector/Convert/HookConvertRector.php index 00f977cf..304abce7 100644 --- a/src/Rector/Convert/HookConvertRector.php +++ b/src/Rector/Convert/HookConvertRector.php @@ -127,7 +127,9 @@ public function getNodeTypes(): array public function refactor(Node $node): Node|int|null { - $filePath = $this->file->getFilePath(); + $filePath = method_exists($this, 'getFile') + ? $this->file->getFilePath() + : $this->getFile()->getFilePath(); $ext = pathinfo($filePath, \PATHINFO_EXTENSION); if (!in_array($ext, ['inc', 'module'])) { return null; @@ -181,7 +183,9 @@ public function refactor(Node $node): Node|int|null protected function initializeHookClass(): void { $this->__destruct(); - $this->moduleDir = $this->file->getFilePath(); + $this->moduleDir = method_exists($this, 'getFile') + ? $this->file->getFilePath() + : $this->getFile()->getFilePath(); $this->inputFilename = $this->moduleDir; // Find the relevant info.yml: it's either in the current directory or // one of the parents. @@ -190,7 +194,7 @@ protected function initializeHookClass(): void if (!empty($info)) { $infoFile = reset($info); $this->module = basename($infoFile, '.info.yml'); - $filename = pathinfo($this->file->getFilePath(), \PATHINFO_FILENAME); + $filename = pathinfo(method_exists($this, 'getFile') ? $this->file->getFilePath() : $this->getFile()->getFilePath(), \PATHINFO_FILENAME); $hookClassName = ucfirst(CaseStringHelper::camelCase(str_replace('.', '_', $filename).'_hooks')); $counter = ''; do { From e4dc6ddbd59da01e46315c29975d0bf6857d1c4e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Apr 2026 19:45:52 +0700 Subject: [PATCH 2/4] Fix ternary check --- src/Rector/Convert/HookConvertRector.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Rector/Convert/HookConvertRector.php b/src/Rector/Convert/HookConvertRector.php index 304abce7..e28901fd 100644 --- a/src/Rector/Convert/HookConvertRector.php +++ b/src/Rector/Convert/HookConvertRector.php @@ -128,8 +128,8 @@ public function getNodeTypes(): array public function refactor(Node $node): Node|int|null { $filePath = method_exists($this, 'getFile') - ? $this->file->getFilePath() - : $this->getFile()->getFilePath(); + ? $this->getFile()->getFilePath() + : $this->file->getFilePath(); $ext = pathinfo($filePath, \PATHINFO_EXTENSION); if (!in_array($ext, ['inc', 'module'])) { return null; @@ -184,8 +184,8 @@ protected function initializeHookClass(): void { $this->__destruct(); $this->moduleDir = method_exists($this, 'getFile') - ? $this->file->getFilePath() - : $this->getFile()->getFilePath(); + ? $this->getFile()->getFilePath() + : $this->file->getFilePath(); $this->inputFilename = $this->moduleDir; // Find the relevant info.yml: it's either in the current directory or // one of the parents. @@ -194,7 +194,7 @@ protected function initializeHookClass(): void if (!empty($info)) { $infoFile = reset($info); $this->module = basename($infoFile, '.info.yml'); - $filename = pathinfo(method_exists($this, 'getFile') ? $this->file->getFilePath() : $this->getFile()->getFilePath(), \PATHINFO_FILENAME); + $filename = pathinfo(method_exists($this, 'getFile') ? $this->getFile()->getFilePath() : $this->file->getFilePath(), \PATHINFO_FILENAME); $hookClassName = ucfirst(CaseStringHelper::camelCase(str_replace('.', '_', $filename).'_hooks')); $counter = ''; do { From 274c9c521d4adad03e5ff230fc219327d845852e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Apr 2026 19:49:01 +0700 Subject: [PATCH 3/4] fix Use item usage --- src/Rector/Convert/HookConvertRector.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Rector/Convert/HookConvertRector.php b/src/Rector/Convert/HookConvertRector.php index e28901fd..521ee01f 100644 --- a/src/Rector/Convert/HookConvertRector.php +++ b/src/Rector/Convert/HookConvertRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Use_; +use PhpParser\Node\UseItem; use PhpParser\NodeFinder; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor; @@ -221,7 +222,7 @@ public function __destruct() $hookClassStmts = [ new Node\Stmt\Namespace_(new Node\Name($namespace)), ...$this->useStmts, - new Use_([new Node\Stmt\UseUse(new Node\Name('Drupal\Core\Hook\Attribute\Hook'))]), + new Use_([new UseItem(new Node\Name('Drupal\Core\Hook\Attribute\Hook'))]), $this->hookClass, ]; $this->hookClass->setDocComment(new \PhpParser\Comment\Doc("/**\n * Hook implementations for $this->module.\n */")); From ca3540066f2b3a9c0f720eb87de4277ea9dbb6d7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Apr 2026 19:50:48 +0700 Subject: [PATCH 4/4] fix Use item usage --- src/Rector/Convert/HookConvertRector.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Rector/Convert/HookConvertRector.php b/src/Rector/Convert/HookConvertRector.php index 521ee01f..5b4dfe41 100644 --- a/src/Rector/Convert/HookConvertRector.php +++ b/src/Rector/Convert/HookConvertRector.php @@ -13,7 +13,6 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\UseItem; use PhpParser\NodeFinder; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor; @@ -222,7 +221,11 @@ public function __destruct() $hookClassStmts = [ new Node\Stmt\Namespace_(new Node\Name($namespace)), ...$this->useStmts, - new Use_([new UseItem(new Node\Name('Drupal\Core\Hook\Attribute\Hook'))]), + new Use_([ + class_exists('PhpParser\Node\UseItem') + ? new Node\UseItem(new Node\Name('Drupal\Core\Hook\Attribute\Hook')) + : new Node\Stmt\UseUse(new Node\Name('Drupal\Core\Hook\Attribute\Hook')) + ]), $this->hookClass, ]; $this->hookClass->setDocComment(new \PhpParser\Comment\Doc("/**\n * Hook implementations for $this->module.\n */"));