diff --git a/README.md b/README.md index e20665ff..625831ca 100644 --- a/README.md +++ b/README.md @@ -175,10 +175,11 @@ parameters: - %currentWorkingDirectory%/tests ``` -With such setup, members used only in tests will be reported with corresponding message, e.g: +With such setup, members used only in tests will be reported with a corresponding tip, e.g: ``` -Unused AddressValidator::isValidPostalCode (all usages excluded by tests excluder) +Unused AddressValidator::isValidPostalCode +💡 All usages excluded by tests excluder ``` > [!TIP] diff --git a/src/Error/BlackMember.php b/src/Error/BlackMember.php index d73d7f26..30089601 100644 --- a/src/Error/BlackMember.php +++ b/src/Error/BlackMember.php @@ -102,16 +102,16 @@ public function getErrorIdentifier(): string } } - public function getExclusionMessage(): string + public function getExclusionTip(): ?string { if (count($this->excludedUsages) === 0) { - return ''; + return null; } $excluderNames = implode(', ', array_keys($this->excludedUsages)); $plural = count($this->excludedUsages) > 1 ? 's' : ''; - return " (all usages excluded by {$excluderNames} excluder{$plural})"; + return "All usages excluded by {$excluderNames} excluder{$plural}"; } /** diff --git a/src/Rule/DeadCodeRule.php b/src/Rule/DeadCodeRule.php index 7841a3be..e67fcf78 100644 --- a/src/Rule/DeadCodeRule.php +++ b/src/Rule/DeadCodeRule.php @@ -839,12 +839,11 @@ private function buildError(array $blackMembersGroup): IdentifierRuleError { $representative = $blackMembersGroup[0]; - $exclusionMessage = $representative->getExclusionMessage(); $excludedUsages = $representative->getExcludedUsages(); $mainErrorMessage = $this->buildMainErrorMessages($representative); - $builder = RuleErrorBuilder::message("{$mainErrorMessage}{$exclusionMessage}") + $builder = RuleErrorBuilder::message($mainErrorMessage) ->file($representative->getFile()) ->line($representative->getLine()) ->identifier($representative->getErrorIdentifier()); @@ -856,13 +855,22 @@ private function buildError(array $blackMembersGroup): IdentifierRuleError 'excludedUsages' => $excludedUsages, ]; + $representativeExclusionTip = $representative->getExclusionTip(); + + if ($representativeExclusionTip !== null) { + $builder->addTip($representativeExclusionTip); + } + $tips = []; foreach (array_slice($blackMembersGroup, 1) as $transitivelyDeadMember) { - $exclusionMessage = $transitivelyDeadMember->getExclusionMessage(); + $exclusionTip = $transitivelyDeadMember->getExclusionTip(); $excludedUsages = $transitivelyDeadMember->getExcludedUsages(); - $tips[] = $this->buildTransitiveErrorMessages($transitivelyDeadMember) . $exclusionMessage; + $transitiveMessage = $this->buildTransitiveErrorMessages($transitivelyDeadMember); + $tips[] = $exclusionTip !== null + ? "{$transitiveMessage}. {$exclusionTip}" + : $transitiveMessage; $metadata[] = [ 'blackMember' => $transitivelyDeadMember, 'transitive' => true, diff --git a/tests/Rule/DeadCodeRuleTest.php b/tests/Rule/DeadCodeRuleTest.php index 38c59bd2..ef6cefe5 100644 --- a/tests/Rule/DeadCodeRuleTest.php +++ b/tests/Rule/DeadCodeRuleTest.php @@ -401,8 +401,9 @@ public function testDebugUsageWithExcludedMixed(): void $this->debugMembers = ['DebugMixed\Foo::any']; $this->analyse([__DIR__ . '/data/debug/mixed.php'], [ [ - 'Unused DebugMixed\Foo::any (all usages excluded by usageOverMixed excluder)', + 'Unused DebugMixed\Foo::any', 7, + 'All usages excluded by usageOverMixed excluder', ], ]); $rule = $this->getRule(); diff --git a/tests/Rule/data/constants/mixed/untracked.php b/tests/Rule/data/constants/mixed/untracked.php index 82fedaf3..1a0c234c 100644 --- a/tests/Rule/data/constants/mixed/untracked.php +++ b/tests/Rule/data/constants/mixed/untracked.php @@ -5,9 +5,9 @@ class Clazz { - const CONST1 = 1; // error: Unused DeadConstMixed2\Clazz::CONST1 (all usages excluded by usageOverMixed excluder) - const CONST2 = 1; // error: Unused DeadConstMixed2\Clazz::CONST2 (all usages excluded by usageOverMixed excluder) - const CONST3 = 1; // error: Unused DeadConstMixed2\Clazz::CONST3 (all usages excluded by usageOverMixed excluder) + const CONST1 = 1; // error: Unused DeadConstMixed2\Clazz::CONST1 + const CONST2 = 1; // error: Unused DeadConstMixed2\Clazz::CONST2 + const CONST3 = 1; // error: Unused DeadConstMixed2\Clazz::CONST3 const CONST4 = 1; // error: Unused DeadConstMixed2\Clazz::CONST4 const CONST5 = 1; const CONST6 = 1; // error: Unused DeadConstMixed2\Clazz::CONST6 @@ -18,9 +18,9 @@ class Clazz { interface IFace { - const CONST1 = 1; // error: Unused DeadConstMixed2\IFace::CONST1 (all usages excluded by usageOverMixed excluder) - const CONST2 = 1; // error: Unused DeadConstMixed2\IFace::CONST2 (all usages excluded by usageOverMixed excluder) - const CONST3 = 1; // error: Unused DeadConstMixed2\IFace::CONST3 (all usages excluded by usageOverMixed excluder) + const CONST1 = 1; // error: Unused DeadConstMixed2\IFace::CONST1 + const CONST2 = 1; // error: Unused DeadConstMixed2\IFace::CONST2 + const CONST3 = 1; // error: Unused DeadConstMixed2\IFace::CONST3 const CONST4 = 1; const CONST5 = 1; // error: Unused DeadConstMixed2\IFace::CONST5 @@ -28,9 +28,9 @@ interface IFace { class Implementor implements IFace { - const CONST1 = 1; // error: Unused DeadConstMixed2\Implementor::CONST1 (all usages excluded by usageOverMixed excluder) - const CONST2 = 1; // error: Unused DeadConstMixed2\Implementor::CONST2 (all usages excluded by usageOverMixed excluder) - const CONST3 = 1; // error: Unused DeadConstMixed2\Implementor::CONST3 (all usages excluded by usageOverMixed excluder) + const CONST1 = 1; // error: Unused DeadConstMixed2\Implementor::CONST1 + const CONST2 = 1; // error: Unused DeadConstMixed2\Implementor::CONST2 + const CONST3 = 1; // error: Unused DeadConstMixed2\Implementor::CONST3 const CONST4 = 1; const CONST5 = 1; // error: Unused DeadConstMixed2\Implementor::CONST5 const CONST6 = 1; diff --git a/tests/Rule/data/debug/exclude.php b/tests/Rule/data/debug/exclude.php index 4256b632..19edc2bf 100644 --- a/tests/Rule/data/debug/exclude.php +++ b/tests/Rule/data/debug/exclude.php @@ -4,8 +4,8 @@ class Foo { - public static function mixedExcluder1() {} // error: Unused DebugExclude\Foo::mixedExcluder1 (all usages excluded by mixedPrefix excluder) - public static function mixedExcluder2() {} // error: Unused DebugExclude\Foo::mixedExcluder2 (all usages excluded by mixedPrefix excluder) + public static function mixedExcluder1() {} // error: Unused DebugExclude\Foo::mixedExcluder1 + public static function mixedExcluder2() {} // error: Unused DebugExclude\Foo::mixedExcluder2 } class Chld extends Foo { diff --git a/tests/Rule/data/excluders/mixed/code.php b/tests/Rule/data/excluders/mixed/code.php index 388687bf..41b9d601 100644 --- a/tests/Rule/data/excluders/mixed/code.php +++ b/tests/Rule/data/excluders/mixed/code.php @@ -3,11 +3,11 @@ namespace MixedExcluder; class SomeParent { - public function mixed1() {} // error: Unused MixedExcluder\SomeParent::mixed1 (all usages excluded by mixedPrefix excluder) + public function mixed1() {} // error: Unused MixedExcluder\SomeParent::mixed1 } class Some extends SomeParent { - public function mixed2() {} // error: Unused MixedExcluder\Some::mixed2 (all usages excluded by mixedPrefix excluder) + public function mixed2() {} // error: Unused MixedExcluder\Some::mixed2 } function test(Some $some) { diff --git a/tests/Rule/data/excluders/tests/src/code.php b/tests/Rule/data/excluders/tests/src/code.php index b43f1fbb..76be1b29 100644 --- a/tests/Rule/data/excluders/tests/src/code.php +++ b/tests/Rule/data/excluders/tests/src/code.php @@ -1,7 +1,7 @@