unused-imports

Import, který kód nikde nepoužije, se odstraní.

Opravuje · v presetech dresscode/nette · pokrývá no_unused_importsSlevomatCodingStandard.Namespaces.UnusedUses

Co pravidlo hlídá

Každý use na začátku souboru je slib, že se jméno v kódu objeví. Když slib neplatí, import jen mate: čtenář hledá, kde se třída používá, a IDE ho vede na cestu, která nikam nevede. Pravidlo projde všechny importy tříd, funkcí i konstant a ty, které nic nepoužívá, smaže.

Použití je jakýkoli výskyt importovaného jména nebo jeho aliasu v kódu: v typu parametru či vlastnosti, za new, extends, implements, instanceof, v catch, v atributu, v ::class, i jako první část částečně kvalifikovaného jména (Prefix\Deep použije import Prefix). Jméno zapsané v řetězci se nepočítá, protože pro PHP to je jen text. Jména tříd a funkcí se srovnávají bez ohledu na velikost písmen, jména konstant přesně, tak jak to dělá PHP.

Import zmíněný jen v dokumentačním komentáři (@var Order, @param User[]) se počítá jako použitý, protože ho čte PHPStan i IDE; volba searchAnnotations to umí vypnout. Z importu s několika jmény (use A, B;) a ze skupinového importu (use App\{A, B};) pravidlo odstraní jen nepoužitou položku.

Příklad

namespace App;

use App\Model\User;
use App\Model\Order;  // The import of 'Order' is unused
use App\Model\Address;
use function App\format;
use function App\slugify;  // The import of 'slugify' is unused

class Profile
{
	/** @var Address[] */
	private array $addresses = [];

	public function __construct(
		private User $user,
	) {
	}

	public function render(): string
	{
		return format($this->user);
	}
}
namespace App;

use App\Model\User;
use App\Model\Address;
use function App\format;

class Profile
{
	/** @var Address[] */
	private array $addresses = [];

	public function __construct(
		private User $user,
	) {
	}

	public function render(): string
	{
		return format($this->user);
	}
}

Address zůstal, protože se vyskytuje v anotaci @var; kdyby pravidlo import smazalo, PHPStan by přestal typu rozumět.

Volby

searchAnnotations

bool, výchozí true. Jméno třídy zmíněné v dokumentačním komentáři se počítá jako použití importu.

Vypnout to dává smysl jen v kódu, kde dokumentační komentáře nečte žádný nástroj. Jinak import, který drží jen anotace, po smazání chybí PHPStanu i našeptávání v editoru.

rules:
	dresscode/unused-imports:
		searchAnnotations: false
namespace App;

use App\Model\Address;  // The import of 'Address' is unused
use App\Model\User;

/**
 * @param Address[] $addresses
 */
function first(array $addresses, User $owner): mixed
{
	return $addresses[0] ?? null;
}
namespace App;

use App\Model\User;

/**
 * @param Address[] $addresses
 */
function first(array $addresses, User $owner): mixed
{
	return $addresses[0] ?? null;
}

Související pravidla

  • ordered-imports řadí importy abecedně
  • useless-alias odstraní alias, který jméno nemění
  • use-from-same-namespace odstraní import z vlastního jmenného prostoru
  • reference-used-names-only nahradí plně kvalifikované jméno v kódu importem

Zdroj

Třída UnusedImportsRule, fixtury unused-imports.

verze: 1.0