Skip to content

Commit

Permalink
Take calls from plain php files into account (#79)
Browse files Browse the repository at this point in the history
  • Loading branch information
staabm committed Jul 31, 2023
1 parent 4095bcb commit 151b74c
Show file tree
Hide file tree
Showing 11 changed files with 85 additions and 19 deletions.
5 changes: 3 additions & 2 deletions src/Collectors/Callable_/CallUserFuncCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ public function processNode(Node $node, Scope $scope): ?array
return null;
}

$classReflection = $scope->getClassReflection();
// skip calls in tests, as they are not used in production
if ($classReflection instanceof ClassReflection && $this->classTypeDetector->isTestClass($classReflection)) {
$classReflection = $scope->getClassReflection();
if ($classReflection instanceof ClassReflection
&& $this->classTypeDetector->isTestClass($classReflection)) {
return null;
}

Expand Down
9 changes: 3 additions & 6 deletions src/Collectors/MethodCall/MethodCallCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,10 @@ public function processNode(Node $node, Scope $scope): ?array
return null;
}

$classReflection = $scope->getClassReflection();
if (! $classReflection instanceof ClassReflection) {
return null;
}

// skip calls in tests, as they are not used in production
if ($this->classTypeDetector->isTestClass($classReflection)) {
$classReflection = $scope->getClassReflection();
if ($classReflection instanceof ClassReflection
&& $this->classTypeDetector->isTestClass($classReflection)) {
return null;
}

Expand Down
9 changes: 3 additions & 6 deletions src/Collectors/MethodCall/MethodCallableCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,10 @@ public function processNode(Node $node, Scope $scope): ?array
return null;
}

$classReflection = $scope->getClassReflection();
if (! $classReflection instanceof ClassReflection) {
return null;
}

// skip calls in tests, as they are not used in production
if ($this->classTypeDetector->isTestClass($classReflection)) {
$classReflection = $scope->getClassReflection();
if ($classReflection instanceof ClassReflection
&& $this->classTypeDetector->isTestClass($classReflection)) {
return null;
}

Expand Down
10 changes: 10 additions & 0 deletions src/Collectors/StaticCall/StaticMethodCallCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
use PhpParser\Node\Name;
use PHPStan\Analyser\Scope;
use PHPStan\Collectors\Collector;
use PHPStan\Reflection\ClassReflection;
use TomasVotruba\UnusedPublic\ClassTypeDetector;
use TomasVotruba\UnusedPublic\Configuration;

/**
Expand All @@ -19,6 +21,7 @@ final class StaticMethodCallCollector implements Collector
{
public function __construct(
private readonly Configuration $configuration,
private readonly ClassTypeDetector $classTypeDetector,
) {
}

Expand All @@ -45,6 +48,13 @@ public function processNode(Node $node, Scope $scope): ?array
return null;
}

// skip calls in tests, as they are not used in production
$classReflection = $scope->getClassReflection();
if ($classReflection instanceof ClassReflection
&& $this->classTypeDetector->isTestClass($classReflection)) {
return null;
}

return [$node->class->toString() . '::' . $node->name->toString()];
}
}
10 changes: 10 additions & 0 deletions src/Collectors/StaticCall/StaticMethodCallableCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
use PHPStan\Analyser\Scope;
use PHPStan\Collectors\Collector;
use PHPStan\Node\StaticMethodCallableNode;
use PHPStan\Reflection\ClassReflection;
use TomasVotruba\UnusedPublic\ClassTypeDetector;
use TomasVotruba\UnusedPublic\Configuration;

/**
Expand All @@ -19,6 +21,7 @@ final class StaticMethodCallableCollector implements Collector
{
public function __construct(
private readonly Configuration $configuration,
private readonly ClassTypeDetector $classTypeDetector,
) {
}

Expand All @@ -45,6 +48,13 @@ public function processNode(Node $node, Scope $scope): ?array
return null;
}

// skip calls in tests, as they are not used in production
$classReflection = $scope->getClassReflection();
if ($classReflection instanceof ClassReflection
&& $this->classTypeDetector->isTestClass($classReflection)) {
return null;
}

return [$node->getClass()->toString() . '::' . $node->getName()->toString()];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,8 @@ final class UsedInTestCaseOnly
public function useMe()
{
}

static public function useMeStatic()
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Fixture;

/**
* @var \TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Source\Caller1 $caller1
*/

call_user_func([$caller1, 'callIt']);
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

declare(strict_types=1);

namespace TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Fixture;

StaticPublicMethod::runHere();
StaticPublicMethod::anotherMethod();
11 changes: 11 additions & 0 deletions tests/Rules/UnusedPublicClassMethodRule/Fixture/plain.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Fixture;

/**
* @var \TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Source\Caller1 $caller1
*/

$caller1->callIt();
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,7 @@ final class TestCaseUser extends TestCase
private function go(UsedInTestCaseOnly $usedInTestCaseOnly)
{
$usedInTestCaseOnly->useMe();

UsedInTestCaseOnly::useMeStatic();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Fixture\StaticPublicMethod;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Fixture\Tests\MethodForTests;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Fixture\UsedInTestCaseOnly;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Source\Caller1;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Source\Caller2;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicClassMethodRule\Source\SomeEnum;

Expand All @@ -47,16 +48,23 @@ public static function provideDataTests(): Iterator
yield [[__DIR__ . '/Fixture/Tests/SkipTestPublicMethod.php'], []];
yield [[__DIR__ . '/Fixture/Tests/SkipTestCasePublicMethod.php'], []];

// report only the non-called static call
$errorMessage = sprintf(
$errorMessage1 = sprintf(
UnusedPublicClassMethodRule::ERROR_MESSAGE,
MethodForTests::class,
'notCalledStaticCall'
);
$errorMessage2 = sprintf(
UnusedPublicClassMethodRule::ERROR_MESSAGE,
MethodForTests::class,
'calledStaticCall'
);
yield [[
__DIR__ . '/Fixture/Tests/MethodForTests.php',
__DIR__ . '/Fixture/Tests/SkipCalledInTests.php',
], [[$errorMessage, 13, RuleTips::SOLUTION_MESSAGE]]];
], [
[$errorMessage2, 9, RuleTips::SOLUTION_MESSAGE],
[$errorMessage1, 13, RuleTips::SOLUTION_MESSAGE]
]];
}

public static function provideDataSymfony(): Iterator
Expand Down Expand Up @@ -118,11 +126,15 @@ public static function provideData(): Iterator

yield [[__DIR__ . '/Fixture/SkipPublicMethodInTwigExtension.php'], []];

$errorMessage = sprintf(UnusedPublicClassMethodRule::ERROR_MESSAGE, UsedInTestCaseOnly::class, 'useMe');
$errorMessage1 = sprintf(UnusedPublicClassMethodRule::ERROR_MESSAGE, UsedInTestCaseOnly::class, 'useMe');
$errorMessage2 = sprintf(UnusedPublicClassMethodRule::ERROR_MESSAGE, UsedInTestCaseOnly::class, 'useMeStatic');
yield [[
__DIR__ . '/Fixture/UsedInTestCaseOnly.php',
__DIR__ . '/Source/TestCaseUser.php',
], [[$errorMessage, 9, RuleTips::SOLUTION_MESSAGE]]];
], [
[$errorMessage1, 9, RuleTips::SOLUTION_MESSAGE],
[$errorMessage2, 13, RuleTips::SOLUTION_MESSAGE],
]];

// parent abstract method used by child call
yield [[
Expand Down Expand Up @@ -168,6 +180,9 @@ public static function provideData(): Iterator

// first class callables
yield [[__DIR__ . '/Fixture/FirstClassCallable/SkipFirstClassCallableMethodCall.php'], []];

yield [[__DIR__ . '/Fixture/plain.php', __DIR__ . '/Source/Caller1.php'], []];
yield [[__DIR__ . '/Fixture/plain-call-user-func.php', __DIR__ . '/Source/Caller1.php'], []];
}

/**
Expand Down

0 comments on commit 151b74c

Please sign in to comment.