diff --git a/config/nextcloud-26/nextcloud-26-deprecations.php b/config/nextcloud-26/nextcloud-26-deprecations.php index 189253d..927debc 100644 --- a/config/nextcloud-26/nextcloud-26-deprecations.php +++ b/config/nextcloud-26/nextcloud-26-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use ChristophWurst\Nextcloud\Rector\Rector\RenameUserIdRector; +use OCP\AppFramework\Http\Attribute\UseSession; use Rector\Config\RectorConfig; use Rector\Php80\Rector\Class_\AnnotationToAttributeRector; use Rector\Php80\ValueObject\AnnotationToAttribute; @@ -11,7 +12,7 @@ $rectorConfig->ruleWithConfiguration( AnnotationToAttributeRector::class, [ - new AnnotationToAttribute('UseSession', 'OCP\AppFramework\Http\Attribute\UseSession'), + new AnnotationToAttribute('UseSession', UseSession::class), ], ); $rectorConfig->rule(RenameUserIdRector::class); diff --git a/src/Rector/OcServerToOcpServerRector.php b/src/Rector/OcServerToOcpServerRector.php index 32557cc..bfb4f79 100644 --- a/src/Rector/OcServerToOcpServerRector.php +++ b/src/Rector/OcServerToOcpServerRector.php @@ -14,12 +14,27 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Name\FullyQualified; +use Rector\Application\Provider\CurrentFileProvider; +use Rector\CodingStyle\Application\UseImportsAdder; +use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipper; +use Rector\PostRector\Collector\UseNodesToAddCollector; use Rector\Rector\AbstractRector; +use Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper; +use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; class OcServerToOcpServerRector extends AbstractRector { + public function __construct( + private UseImportsAdder $useImportsAdder, + private UseNodesToAddCollector $useNodesToAddCollector, + private FullyQualifiedNodeMapper $fullyQualifiedNodeMapper, + private ClassNameImportSkipper $classNameImportSkipper, + private CurrentFileProvider $currentFileProvider, + ) { + } + /** * @return array> */ @@ -52,8 +67,34 @@ public function refactor(Node $node): ?Node return null; } + $class = $node->args[0]->value->class; + $serverClass = new FullyQualifiedObjectType('OCP\Server'); + $serverClassNode = new FullyQualified('OCP\Server'); + $file = $this->currentFileProvider->getFile(); + if ($class !== null) { + $staticType = $this->fullyQualifiedNodeMapper->mapToPHPStan($class); + if (!$staticType instanceof FullyQualifiedObjectType) { + return null; + } + if (!$this->classNameImportSkipper->shouldSkipNameForFullyQualifiedObjectType($file, $class, $staticType)) { + $this->useNodesToAddCollector->addUseImport($staticType); + $node->args[0]->value->class = $staticType->getShortNameNode(); + } + } + if ( + !$this->classNameImportSkipper->shouldSkipNameForFullyQualifiedObjectType( + $file, + $serverClassNode, + $serverClass, + ) + ) { + $this->useNodesToAddCollector->addUseImport($serverClass); + $serverClassNode = $serverClass->getShortNameNode(); + } + $this->useNodesToAddCollector->addUseImport($serverClass); + return new StaticCall( - new FullyQualified('OCP\Server'), + $serverClassNode, 'get', $node->args, ); diff --git a/tests/Rector/OcServerToOcpServerRector/Fixture/test_fixture.php.inc b/tests/Rector/OcServerToOcpServerRector/Fixture/test_fixture.php.inc index d0776a2..c52baf0 100644 --- a/tests/Rector/OcServerToOcpServerRector/Fixture/test_fixture.php.inc +++ b/tests/Rector/OcServerToOcpServerRector/Fixture/test_fixture.php.inc @@ -11,7 +11,7 @@ class SomeClass { $request1 = \OC::$server->get(IRequest::class); $request2 = \OC::$server->get('\OCP\IRequest'); - $request3 = OC::$server->get(IRequest::class); + $request3 = OC::$server->get(\OCP\IRequest::class); } } @@ -21,6 +21,7 @@ class SomeClass namespace ChristophWurst\Nextcloud\Rector\Test\Rector\OcServerToOcpServerRector\Fixture; +use OCP\Server; use OC; use OCP\IRequest; @@ -28,9 +29,9 @@ class SomeClass { public function foo() { - $request1 = \OCP\Server::get(IRequest::class); - $request2 = \OCP\Server::get('\OCP\IRequest'); - $request3 = \OCP\Server::get(IRequest::class); + $request1 = Server::get(IRequest::class); + $request2 = Server::get('\OCP\IRequest'); + $request3 = Server::get(IRequest::class); } } diff --git a/tests/Set/Fixture/test_fixture.php.inc b/tests/Set/Fixture/test_fixture.php.inc index 6ebff0b..de6f481 100644 --- a/tests/Set/Fixture/test_fixture.php.inc +++ b/tests/Set/Fixture/test_fixture.php.inc @@ -4,6 +4,7 @@ namespace ChristophWurst\Nextcloud\Rector\Test\Set\Fixture; use OC; use OCP\IRequest; +use OCA\Some\Plugin; class SomeClass { @@ -12,6 +13,8 @@ class SomeClass $request1 = \OC::$server->get(IRequest::class); $request2 = \OC::$server->get('\OCP\IRequest'); $request3 = OC::$server->get(IRequest::class); + $request4 = OC::$server->get(\OCP\IRequest::class); + $plugin = OC::$server->get(\OCP\Other\Plugin::class); script('mail', 'mail'); } } @@ -22,16 +25,20 @@ class SomeClass namespace ChristophWurst\Nextcloud\Rector\Test\Set\Fixture; +use OCP\Server; use OC; use OCP\IRequest; +use OCA\Some\Plugin; class SomeClass { public function foo() { - $request1 = \OCP\Server::get(IRequest::class); - $request2 = \OCP\Server::get('\OCP\IRequest'); - $request3 = \OCP\Server::get(IRequest::class); + $request1 = Server::get(IRequest::class); + $request2 = Server::get('\OCP\IRequest'); + $request3 = Server::get(IRequest::class); + $request4 = Server::get(IRequest::class); + $plugin = Server::get(\OCP\Other\Plugin::class); \OCP\Util::addScript('mail', 'mail', 'core'); } }