]> source.dussan.org Git - nextcloud-server.git/commitdiff
chore(rector): Add rule to import Nextcloud classes in all files
authorCôme Chilliet <come.chilliet@nextcloud.com>
Thu, 26 Sep 2024 09:11:20 +0000 (11:11 +0200)
committerCôme Chilliet <come.chilliet@nextcloud.com>
Tue, 15 Oct 2024 08:38:05 +0000 (10:38 +0200)
We skip all files outside of OC/OCA/OCP from "use" auto-import because
 it’s not always desirable to import classes when they have generic
 names, so it should be the developer choice.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
build/rector.php

index ed8b748663ed945c2462cb3eed8bbde286f96b52..9df995a00448642f26b75c5039fa98c77f9286e9 100644 (file)
@@ -7,10 +7,32 @@ declare(strict_types=1);
  * SPDX-License-Identifier: AGPL-3.0-only
  */
 
+use PhpParser\Node;
+use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface;
 use Rector\Config\RectorConfig;
+use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType;
+use Rector\ValueObject\Application\File;
 
 $nextcloudDir = dirname(__DIR__);
 
+class NextcloudNamespaceSkipVoter implements ClassNameImportSkipVoterInterface {
+       private array $namespacePrefixes = [
+               'OC',
+               'OCA',
+               'OCP',
+       ];
+       public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedObjectType, Node $node) : bool {
+               foreach ($this->namespacePrefixes as $prefix) {
+                       if (str_starts_with($fullyQualifiedObjectType->getClassName(), $prefix . '\\')) {
+                               // Import Nextcloud namespaces
+                               return false;
+                       }
+               }
+               // Skip everything else
+               return true;
+       }
+}
+
 $config = RectorConfig::configure()
        ->withPaths([
                $nextcloudDir . '/apps',
@@ -30,9 +52,12 @@ $config = RectorConfig::configure()
        ])
        // uncomment to reach your current PHP version
        // ->withPhpSets()
+       ->withImportNames(importShortClasses:false)
        ->withTypeCoverageLevel(0);
 
+$config->registerService(NextcloudNamespaceSkipVoter::class, tag:ClassNameImportSkipVoterInterface::class);
 
+/* Ignore all files ignored by git */
 $ignoredEntries = shell_exec('git status --porcelain --ignored ' . escapeshellarg($nextcloudDir));
 $ignoredEntries = explode("\n", $ignoredEntries);
 $ignoredEntries = array_filter($ignoredEntries, static fn (string $line) => str_starts_with($line, '!! '));