Nette Documentation Preview

syntax
unused-imports
**************

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

Opravuje · v presetech `dresscode/nette` · pokrývá `no_unused_imports`, `SlevomatCodingStandard.Namespaces.UnusedUses` .[rule-info]


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
=======

```php .[before]
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);
	}
}
```

```php .[after]
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 .[option]
---------------------------

`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.

```neon
rules:
	dresscode/unused-imports:
		searchAnnotations: false
```

```php .[before]
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;
}
```

```php .[after]
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":https://github.com/dg/dresscode/blob/master/src/DressCode/Rules/Namespaces/UnusedImportsRule.php, fixtury "unused-imports":https://github.com/dg/dresscode/tree/master/tests/DressCode/Rules/fixtures/unused-imports.

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.