dead code detector
0.7.0
PHPSTAN拡張機能プロジェクトで使用されていないPHPコードを簡単に見つけてください!
composer require --dev shipmonk/dead-code-detector公式拡張機能インストラーを使用するか、ルールをロードするだけです。
# phpstan.neon.dist
includes :
- vendor/shipmonk/dead-code-detector/rules.neon phpstan/phpstan-symfony with containerXmlPathを使用する必要があります#[AsEventListener]属性#[AsController]属性#[AsCommand]属性#[Required]属性#[Route]属性EventSubscriberInterface::getSubscribedEventsonKernelResponse 、 onKernelRequestなど#[AsEntityListener]属性DoctrineORMEvents::*イベントDoctrineCommonEventSubscriberメソッド#[PreFlush] 、 #[PostLoad] 、... testXxxメソッド@test 、 @before 、 @afterClassなどの注釈#[Test] 、 #[Before] 、 #[AfterClass]などの属性handleXxx 、 renderXxx 、 actionXxx 、 injectXxx 、 createComponentXxxSmartObject Magicは、 @property Annotationsを求めていますこれらのライブラリはすべて、作曲家の依存関係内にある場合、自動エンパニーです。それらのいくつかを強制的に有効/無効にしたい場合は、次のことができます。
# phpstan.neon.dist
parameters :
shipmonkDeadCode :
usageProviders :
phpunit :
enabled : true ReflectionClassを介してアクセスされる定数またはメソッドは、使用されたときに検出されます$reflection->getConstructor() 、 $reflection->getConstant('NAME') 、 $reflection->getMethods() 、... vendorに由来するオーバーライドされた方法は、死んだとは報告されていませんPsrLogLoggerInterface::logの実装は、自動的に使用されると見なされますこれらのプロバイダーはデフォルトで有効になっていますが、必要に応じて無効にすることができます。
shipmonk.deadCode.memberUsageProviderでタグを付け、 ShipMonkPHPStanDeadCodeProviderMemberUsageProvider実装してください # phpstan.neon.dist
services :
-
class : AppApiOutputUsageProvider
tags :
- shipmonk.deadCode.memberUsageProvider 重要
インターフェイスとタグは0.7で変更されました。 phpstan 1.xを使用している場合、それらは異なって使用されていました。
ShipMonkPHPStanDeadCodeProviderReflectionBasedMemberUsageProviderを拡張できます。 use ReflectionMethod ;
use ShipMonk PHPStan DeadCode Provider ReflectionBasedMemberUsageProvider ;
class ApiOutputUsageProvider extends ReflectionBasedMemberUsageProvider
{
public function shouldMarkMethodAsUsed ( ReflectionMethod $ method ): bool
{
// all methods from our ApiOutput interface are called automatically (e.g. during serialization)
return $ method -> getDeclaringClass ()-> implementsInterface (ApiOutput::class);
}
}MemberUsageProviderインターフェイスに固執するだけです。 use ReflectionMethod ;
use ShipMonk PHPStan DeadCode Graph ClassMethodRef ;
use ShipMonk PHPStan DeadCode Graph ClassMethodUsage ;
use ShipMonk PHPStan DeadCode Provider MemberUsageProvider ;
use Symfony Component Serializer SerializerInterface ;
class DeserializationUsageProvider implements MemberUsageProvider
{
/**
* @return list<ClassMemberUsage>
*/
public function getUsages ( Node $ node , Scope $ scope ): array
{
if (! $ node instanceof MethodCall) {
return [];
}
if (
// our deserialization calls constructor
$ scope -> getType ( $ node -> var )-> getObjectClassNames () === [SerializerInterface::class] &&
$ node -> name -> toString () === ' deserialize '
) {
$ secondArgument = $ node -> getArgs ()[ 1 ]-> value ;
$ serializedClass = $ scope -> getType ( $ secondArgument )-> getConstantStrings ()[ 0 ];
// record the method it was called from (needed for proper transitive dead code elimination)
$ originRef = $ this -> getOriginMethodRef ( $ scope );
// record the hidden constructor call
$ constructorRef = new ClassMethodRef ( $ serializedClass -> getValue (), ' __construct ' , false );
return [ new ClassMethodUsage ( $ originRef , $ constructorRef )];
}
return [];
}
private function getOriginMethodRef ( Scope $ scope ): ? ClassMethodRef
{
return new ClassMethodRef (
$ scope -> getClassReflection ()-> getName (),
$ scope -> getFunction ()-> getName (),
false ,
);
}
} ------ ------------------------------------------------------------------------
Line src/App/Facade/UserFacade.php
------ ------------------------------------------------------------------------
26 Unused AppFacadeUserFacade::updateUserAddress
? shipmonk.deadMethod
Thus AppEntityUser::updateAddress is transitively also unused
Thus AppEntityAddress::setPostalCode is transitively also unused
Thus AppEntityAddress::setCountry is transitively also unused
Thus AppEntityAddress::setStreet is transitively also unused
Thus AppEntityAddress::MAX_STREET_CHARS is transitively also unused
------ ------------------------------------------------------------------------
phpstan.neon.distで有効にすることができます。 parameters :
shipmonkDeadCode :
reportTransitivelyDeadMethodAsSeparateError : true removeDeadCodeコードエラー形式でphpstanを実行して自動的に削除できます。 vendor/bin/phpstan analyse --error-format removeDeadCodeclass UserFacade
{
- public const TRANSITIVELY_DEAD = 1;
-
- public function deadMethod(): void
- {
- echo self::TRANSITIVELY_DEAD;
- }
}methodという名前のすべてのメソッドをマークすることにより、不明なタイプ( $unknown->method() )を介した呼び出しをサポートしますnew $unknown()使用されているすべてのコンストラクターをマークするため、このような動作は厳密にタイプされたコードベースでは望まれない場合がありますphpstan.neon.distで無効にすることができます。$unknown::CONSTANT ) parameters :
shipmonkDeadCode :
trackMixedAccess : false-vvvでphpstan分析を実行でき、診断が表示されます。 Found 2 usages over unknown type:
• setCountry method, for example in AppEntityUser::updateAddress
• setStreet method, for example in AppEntityUser::updateAddress
__get 、 __set setなど)は死んだとは報告されません__construct 、 __clone parameters :
ignoreErrors :
- ' # ^Unused .*?::__construct$ # ' MemberUsageProviderを介してです。 use ShipMonk PHPStan DeadCode Provider ReflectionBasedMemberUsageProvider ;
class IgnoreDeadInterfaceUsageProvider extends ReflectionBasedMemberUsageProvider
{
public function shouldMarkMethodAsUsed ( ReflectionMethod $ method ): bool
{
return $ method -> getDeclaringClass ()-> isInterface ();
}
}composer checkでコードを確認してくださいcomposer fix:cs