dead code detector
0.7.0
PHPSTAN EXTENSION 프로젝트에서 사용하지 않은 PHP 코드를 쉽게 찾으십시오!
composer require --dev shipmonk/dead-code-detector공식 확장자 설치자를 사용하거나 규칙을로드하십시오.
# phpstan.neon.dist
includes :
- vendor/shipmonk/dead-code-detector/rules.neon containerXmlPath 사용한 phpstan/phpstan-symfony 사용해야합니다#[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 주석을 요구합니다이 모든 라이브러리는 작곡가 종속성 내에서 발견되면 자동으로 설정됩니다. 강제 활성화/비활성화하려면 다음을 수행 할 수 있습니다.
# 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 등)은 결코 죽은 것으로보고되지 않습니다.__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