Skip to content

Commit b6fcf5e

Browse files
committed
extract common code to helper
1 parent 3d0107c commit b6fcf5e

25 files changed

+261
-190
lines changed

conf/config.neon

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,8 @@ services:
672672
-
673673
class: PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider
674674
factory: PHPStan\DependencyInjection\Type\LazyParameterClosureTypeExtensionProvider
675+
-
676+
class: PHPStan\Type\ParameterClosureTypeHelper
675677

676678
-
677679
class: PHPStan\File\FileHelper

src/Analyser/NodeScopeResolver.php

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
use PHPStan\BetterReflection\SourceLocator\Located\LocatedSource;
6464
use PHPStan\DependencyInjection\Reflection\ClassReflectionExtensionRegistryProvider;
6565
use PHPStan\DependencyInjection\Type\DynamicThrowTypeExtensionProvider;
66-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
6766
use PHPStan\DependencyInjection\Type\ParameterOutTypeExtensionProvider;
6867
use PHPStan\File\FileHelper;
6968
use PHPStan\File\FileReader;
@@ -171,6 +170,7 @@
171170
use PHPStan\Type\NullType;
172171
use PHPStan\Type\ObjectType;
173172
use PHPStan\Type\ObjectWithoutClassType;
173+
use PHPStan\Type\ParameterClosureTypeHelper;
174174
use PHPStan\Type\ResourceType;
175175
use PHPStan\Type\StaticType;
176176
use PHPStan\Type\StaticTypeFactory;
@@ -250,7 +250,7 @@ public function __construct(
250250
private readonly TypeSpecifier $typeSpecifier,
251251
private readonly DynamicThrowTypeExtensionProvider $dynamicThrowTypeExtensionProvider,
252252
private readonly ReadWritePropertiesExtensionProvider $readWritePropertiesExtensionProvider,
253-
private readonly ParameterClosureTypeExtensionProvider $parameterClosureTypeExtensionProvider,
253+
private readonly ParameterClosureTypeHelper $parameterClosureTypeHelper,
254254
private readonly ScopeFactory $scopeFactory,
255255
private readonly bool $polluteScopeWithLoopInitialAssignments,
256256
private readonly bool $polluteScopeWithAlwaysIterableForeach,
@@ -4621,7 +4621,7 @@ private function processArgs(
46214621
}
46224622

46234623
if ($parameter !== null) {
4624-
$overwritingParameterType = $this->getParameterTypeFromParameterClosureTypeExtension($callLike, $calleeReflection, $parameter, $scopeToPass);
4624+
$overwritingParameterType = $this->parameterClosureTypeHelper->getParameterTypeFromParameterClosureTypeExtension($callLike, $calleeReflection, $parameter, $scopeToPass);
46254625

46264626
if ($overwritingParameterType !== null) {
46274627
$parameterType = $overwritingParameterType;
@@ -4673,7 +4673,7 @@ private function processArgs(
46734673
}
46744674

46754675
if ($parameter !== null) {
4676-
$overwritingParameterType = $this->getParameterTypeFromParameterClosureTypeExtension($callLike, $calleeReflection, $parameter, $scopeToPass);
4676+
$overwritingParameterType = $this->parameterClosureTypeHelper->getParameterTypeFromParameterClosureTypeExtension($callLike, $calleeReflection, $parameter, $scopeToPass);
46774677

46784678
if ($overwritingParameterType !== null) {
46794679
$parameterType = $overwritingParameterType;
@@ -4820,36 +4820,6 @@ static function (Node $node, Scope $scope) use ($nodeCallback): void {
48204820
return new ExpressionResult($scope, $hasYield, $throwPoints, $impurePoints);
48214821
}
48224822

4823-
/**
4824-
* @param MethodReflection|FunctionReflection|null $calleeReflection
4825-
*/
4826-
private function getParameterTypeFromParameterClosureTypeExtension(CallLike $callLike, $calleeReflection, ParameterReflection $parameter, MutatingScope $scope): ?Type
4827-
{
4828-
if ($callLike instanceof FuncCall && $calleeReflection instanceof FunctionReflection) {
4829-
foreach ($this->parameterClosureTypeExtensionProvider->getFunctionParameterClosureTypeExtensions() as $functionParameterClosureTypeExtension) {
4830-
if ($functionParameterClosureTypeExtension->isFunctionSupported($calleeReflection, $parameter)) {
4831-
return $functionParameterClosureTypeExtension->getTypeFromFunctionCall($calleeReflection, $callLike, $parameter, $scope);
4832-
}
4833-
}
4834-
} elseif ($calleeReflection instanceof MethodReflection) {
4835-
if ($callLike instanceof StaticCall) {
4836-
foreach ($this->parameterClosureTypeExtensionProvider->getStaticMethodParameterClosureTypeExtensions() as $staticMethodParameterClosureTypeExtension) {
4837-
if ($staticMethodParameterClosureTypeExtension->isStaticMethodSupported($calleeReflection, $parameter)) {
4838-
return $staticMethodParameterClosureTypeExtension->getTypeFromStaticMethodCall($calleeReflection, $callLike, $parameter, $scope);
4839-
}
4840-
}
4841-
} elseif ($callLike instanceof MethodCall) {
4842-
foreach ($this->parameterClosureTypeExtensionProvider->getMethodParameterClosureTypeExtensions() as $methodParameterClosureTypeExtension) {
4843-
if ($methodParameterClosureTypeExtension->isMethodSupported($calleeReflection, $parameter)) {
4844-
return $methodParameterClosureTypeExtension->getTypeFromMethodCall($calleeReflection, $callLike, $parameter, $scope);
4845-
}
4846-
}
4847-
}
4848-
}
4849-
4850-
return null;
4851-
}
4852-
48534823
/**
48544824
* @param MethodReflection|FunctionReflection|null $calleeReflection
48554825
*/

src/Rules/FunctionCallParametersCheck.php

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,8 @@
44

55
use PhpParser\Node;
66
use PhpParser\Node\Expr;
7-
use PhpParser\Node\Expr\CallLike;
8-
use PhpParser\Node\Expr\FuncCall;
9-
use PhpParser\Node\Expr\MethodCall;
10-
use PhpParser\Node\Expr\StaticCall;
117
use PHPStan\Analyser\MutatingScope;
128
use PHPStan\Analyser\Scope;
13-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
149
use PHPStan\Php\PhpVersion;
1510
use PHPStan\Reflection\FunctionReflection;
1611
use PHPStan\Reflection\MethodReflection;
@@ -27,6 +22,7 @@
2722
use PHPStan\Type\Generic\TemplateType;
2823
use PHPStan\Type\IntegerRangeType;
2924
use PHPStan\Type\NeverType;
25+
use PHPStan\Type\ParameterClosureTypeHelper;
3026
use PHPStan\Type\Type;
3127
use PHPStan\Type\TypeCombinator;
3228
use PHPStan\Type\TypeTraverser;
@@ -49,7 +45,7 @@ public function __construct(
4945
private PhpVersion $phpVersion,
5046
private UnresolvableTypeHelper $unresolvableTypeHelper,
5147
private PropertyReflectionFinder $propertyReflectionFinder,
52-
private ParameterClosureTypeExtensionProvider $parameterClosureTypeExtensionProvider,
48+
private ParameterClosureTypeHelper $parameterClosureTypeHelper,
5349
private bool $checkArgumentTypes,
5450
private bool $checkArgumentsPassedByReference,
5551
private bool $checkExtraArguments,
@@ -322,7 +318,7 @@ public function check(
322318

323319
if ($this->checkArgumentTypes) {
324320
$parameterType = TypeUtils::resolveLateResolvableTypes($parameter->getType());
325-
$parameterType = $this->getParameterTypeFromParameterClosureTypeExtension(
321+
$parameterType = $this->parameterClosureTypeHelper->getParameterTypeFromParameterClosureTypeExtension(
326322
$funcCall,
327323
$callReflection,
328324
$parameter,
@@ -649,34 +645,4 @@ private function describeParameter(ParameterReflection $parameter, ?int $positio
649645
return implode(' ', $parts);
650646
}
651647

652-
/**
653-
* @param MethodReflection|FunctionReflection|null $calleeReflection
654-
*/
655-
private function getParameterTypeFromParameterClosureTypeExtension(CallLike $callLike, $calleeReflection, ParameterReflection $parameter, Scope $scope): ?Type
656-
{
657-
if ($callLike instanceof FuncCall && $calleeReflection instanceof FunctionReflection) {
658-
foreach ($this->parameterClosureTypeExtensionProvider->getFunctionParameterClosureTypeExtensions() as $functionParameterClosureTypeExtension) {
659-
if ($functionParameterClosureTypeExtension->isFunctionSupported($calleeReflection, $parameter)) {
660-
return $functionParameterClosureTypeExtension->getTypeFromFunctionCall($calleeReflection, $callLike, $parameter, $scope);
661-
}
662-
}
663-
} elseif ($calleeReflection instanceof MethodReflection) {
664-
if ($callLike instanceof StaticCall) {
665-
foreach ($this->parameterClosureTypeExtensionProvider->getStaticMethodParameterClosureTypeExtensions() as $staticMethodParameterClosureTypeExtension) {
666-
if ($staticMethodParameterClosureTypeExtension->isStaticMethodSupported($calleeReflection, $parameter)) {
667-
return $staticMethodParameterClosureTypeExtension->getTypeFromStaticMethodCall($calleeReflection, $callLike, $parameter, $scope);
668-
}
669-
}
670-
} elseif ($callLike instanceof MethodCall) {
671-
foreach ($this->parameterClosureTypeExtensionProvider->getMethodParameterClosureTypeExtensions() as $methodParameterClosureTypeExtension) {
672-
if ($methodParameterClosureTypeExtension->isMethodSupported($calleeReflection, $parameter)) {
673-
return $methodParameterClosureTypeExtension->getTypeFromMethodCall($calleeReflection, $callLike, $parameter, $scope);
674-
}
675-
}
676-
}
677-
}
678-
679-
return null;
680-
}
681-
682648
}

src/Testing/RuleTestCase.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use PHPStan\Collectors\Registry as CollectorRegistry;
1717
use PHPStan\Dependency\DependencyResolver;
1818
use PHPStan\DependencyInjection\Type\DynamicThrowTypeExtensionProvider;
19-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
2019
use PHPStan\DependencyInjection\Type\ParameterOutTypeExtensionProvider;
2120
use PHPStan\File\FileHelper;
2221
use PHPStan\Php\PhpVersion;
@@ -30,6 +29,7 @@
3029
use PHPStan\Rules\Properties\ReadWritePropertiesExtensionProvider;
3130
use PHPStan\Rules\Rule;
3231
use PHPStan\Type\FileTypeMapper;
32+
use PHPStan\Type\ParameterClosureTypeHelper;
3333
use function array_map;
3434
use function count;
3535
use function implode;
@@ -95,7 +95,7 @@ private function getAnalyser(DirectRuleRegistry $ruleRegistry): Analyser
9595
$typeSpecifier,
9696
self::getContainer()->getByType(DynamicThrowTypeExtensionProvider::class),
9797
$readWritePropertiesExtensions !== [] ? new DirectReadWritePropertiesExtensionProvider($readWritePropertiesExtensions) : self::getContainer()->getByType(ReadWritePropertiesExtensionProvider::class),
98-
self::getContainer()->getByType(ParameterClosureTypeExtensionProvider::class),
98+
self::getContainer()->getByType(ParameterClosureTypeHelper::class),
9999
self::createScopeFactory($reflectionProvider, $typeSpecifier),
100100
$this->shouldPolluteScopeWithLoopInitialAssignments(),
101101
$this->shouldPolluteScopeWithAlwaysIterableForeach(),

src/Testing/TypeInferenceTestCase.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use PHPStan\Analyser\Scope;
1010
use PHPStan\Analyser\ScopeContext;
1111
use PHPStan\DependencyInjection\Type\DynamicThrowTypeExtensionProvider;
12-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
1312
use PHPStan\DependencyInjection\Type\ParameterOutTypeExtensionProvider;
1413
use PHPStan\File\FileHelper;
1514
use PHPStan\File\SystemAgnosticSimpleRelativePathHelper;
@@ -22,6 +21,7 @@
2221
use PHPStan\TrinaryLogic;
2322
use PHPStan\Type\ConstantScalarType;
2423
use PHPStan\Type\FileTypeMapper;
24+
use PHPStan\Type\ParameterClosureTypeHelper;
2525
use PHPStan\Type\Type;
2626
use PHPStan\Type\VerbosityLevel;
2727
use Symfony\Component\Finder\Finder;
@@ -75,7 +75,7 @@ public static function processFile(
7575
$typeSpecifier,
7676
self::getContainer()->getByType(DynamicThrowTypeExtensionProvider::class),
7777
self::getContainer()->getByType(ReadWritePropertiesExtensionProvider::class),
78-
self::getContainer()->getByType(ParameterClosureTypeExtensionProvider::class),
78+
self::getContainer()->getByType(ParameterClosureTypeHelper::class),
7979
self::createScopeFactory($reflectionProvider, $typeSpecifier),
8080
self::getContainer()->getParameter('polluteScopeWithLoopInitialAssignments'),
8181
self::getContainer()->getParameter('polluteScopeWithAlwaysIterableForeach'),
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Type;
4+
5+
use PhpParser\Node\Expr\CallLike;
6+
use PhpParser\Node\Expr\FuncCall;
7+
use PhpParser\Node\Expr\MethodCall;
8+
use PhpParser\Node\Expr\StaticCall;
9+
use PHPStan\Analyser\Scope;
10+
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
11+
use PHPStan\Reflection\FunctionReflection;
12+
use PHPStan\Reflection\MethodReflection;
13+
use PHPStan\Reflection\ParameterReflection;
14+
15+
class ParameterClosureTypeHelper
16+
{
17+
18+
public function __construct(private readonly ParameterClosureTypeExtensionProvider $parameterClosureTypeExtensionProvider)
19+
{
20+
}
21+
22+
/**
23+
* @param MethodReflection|FunctionReflection|null $calleeReflection
24+
*/
25+
public function getParameterTypeFromParameterClosureTypeExtension(CallLike $callLike, $calleeReflection, ParameterReflection $parameter, Scope $scope): ?Type
26+
{
27+
if ($callLike instanceof FuncCall && $calleeReflection instanceof FunctionReflection) {
28+
foreach ($this->parameterClosureTypeExtensionProvider->getFunctionParameterClosureTypeExtensions() as $functionParameterClosureTypeExtension) {
29+
if ($functionParameterClosureTypeExtension->isFunctionSupported($calleeReflection, $parameter)) {
30+
return $functionParameterClosureTypeExtension->getTypeFromFunctionCall($calleeReflection, $callLike, $parameter, $scope);
31+
}
32+
}
33+
} elseif ($calleeReflection instanceof MethodReflection) {
34+
if ($callLike instanceof StaticCall) {
35+
foreach ($this->parameterClosureTypeExtensionProvider->getStaticMethodParameterClosureTypeExtensions() as $staticMethodParameterClosureTypeExtension) {
36+
if ($staticMethodParameterClosureTypeExtension->isStaticMethodSupported($calleeReflection, $parameter)) {
37+
return $staticMethodParameterClosureTypeExtension->getTypeFromStaticMethodCall($calleeReflection, $callLike, $parameter, $scope);
38+
}
39+
}
40+
} elseif ($callLike instanceof MethodCall) {
41+
foreach ($this->parameterClosureTypeExtensionProvider->getMethodParameterClosureTypeExtensions() as $methodParameterClosureTypeExtension) {
42+
if ($methodParameterClosureTypeExtension->isMethodSupported($calleeReflection, $parameter)) {
43+
return $methodParameterClosureTypeExtension->getTypeFromMethodCall($calleeReflection, $callLike, $parameter, $scope);
44+
}
45+
}
46+
}
47+
}
48+
49+
return null;
50+
}
51+
52+
}

tests/PHPStan/Analyser/AnalyserTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use PHPStan\Dependency\DependencyResolver;
1212
use PHPStan\Dependency\ExportedNodeResolver;
1313
use PHPStan\DependencyInjection\Type\DynamicThrowTypeExtensionProvider;
14-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
1514
use PHPStan\DependencyInjection\Type\ParameterOutTypeExtensionProvider;
1615
use PHPStan\Node\Printer\ExprPrinter;
1716
use PHPStan\Node\Printer\Printer;
@@ -26,6 +25,7 @@
2625
use PHPStan\Rules\Properties\ReadWritePropertiesExtensionProvider;
2726
use PHPStan\Testing\PHPStanTestCase;
2827
use PHPStan\Type\FileTypeMapper;
28+
use PHPStan\Type\ParameterClosureTypeHelper;
2929
use stdClass;
3030
use function array_map;
3131
use function array_merge;
@@ -731,7 +731,7 @@ private function createAnalyser(bool $enableIgnoreErrorsWithinPhpDocs): Analyser
731731
$typeSpecifier,
732732
self::getContainer()->getByType(DynamicThrowTypeExtensionProvider::class),
733733
self::getContainer()->getByType(ReadWritePropertiesExtensionProvider::class),
734-
self::getContainer()->getByType(ParameterClosureTypeExtensionProvider::class),
734+
self::getContainer()->getByType(ParameterClosureTypeHelper::class),
735735
self::createScopeFactory($reflectionProvider, $typeSpecifier),
736736
false,
737737
true,

tests/PHPStan/Analyser/Bug9307CallMethodsRuleTest.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PHPStan\Analyser;
44

5-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
65
use PHPStan\Php\PhpVersion;
76
use PHPStan\Rules\FunctionCallParametersCheck;
87
use PHPStan\Rules\Methods\CallMethodsRule;
@@ -13,6 +12,7 @@
1312
use PHPStan\Rules\Rule;
1413
use PHPStan\Rules\RuleLevelHelper;
1514
use PHPStan\Testing\RuleTestCase;
15+
use PHPStan\Type\ParameterClosureTypeHelper;
1616
use const PHP_VERSION_ID;
1717

1818
/**
@@ -27,7 +27,19 @@ protected function getRule(): Rule
2727
$ruleLevelHelper = new RuleLevelHelper($reflectionProvider, true, false, true, true, false, true, false);
2828
return new CallMethodsRule(
2929
new MethodCallCheck($reflectionProvider, $ruleLevelHelper, true, true),
30-
new FunctionCallParametersCheck($ruleLevelHelper, new NullsafeCheck(), new PhpVersion(PHP_VERSION_ID), new UnresolvableTypeHelper(), new PropertyReflectionFinder(), self::getContainer()->getByType(ParameterClosureTypeExtensionProvider::class), true, true, true, true, true),
30+
new FunctionCallParametersCheck(
31+
$ruleLevelHelper,
32+
new NullsafeCheck(),
33+
new PhpVersion(PHP_VERSION_ID),
34+
new UnresolvableTypeHelper(),
35+
new PropertyReflectionFinder(),
36+
self::getContainer()->getByType(ParameterClosureTypeHelper::class),
37+
true,
38+
true,
39+
true,
40+
true,
41+
true,
42+
),
3143
);
3244
}
3345

tests/PHPStan/Rules/Classes/ClassAttributesRuleTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PHPStan\Rules\Classes;
44

5-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
65
use PHPStan\Php\PhpVersion;
76
use PHPStan\Rules\AttributesCheck;
87
use PHPStan\Rules\ClassCaseSensitivityCheck;
@@ -15,6 +14,7 @@
1514
use PHPStan\Rules\Rule;
1615
use PHPStan\Rules\RuleLevelHelper;
1716
use PHPStan\Testing\RuleTestCase;
17+
use PHPStan\Type\ParameterClosureTypeHelper;
1818
use const PHP_VERSION_ID;
1919

2020
/**
@@ -35,7 +35,7 @@ protected function getRule(): Rule
3535
new PhpVersion(80000),
3636
new UnresolvableTypeHelper(),
3737
new PropertyReflectionFinder(),
38-
self::getContainer()->getByType(ParameterClosureTypeExtensionProvider::class),
38+
self::getContainer()->getByType(ParameterClosureTypeHelper::class),
3939
true,
4040
true,
4141
true,

tests/PHPStan/Rules/Classes/ClassConstantAttributesRuleTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PHPStan\Rules\Classes;
44

5-
use PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider;
65
use PHPStan\Php\PhpVersion;
76
use PHPStan\Rules\AttributesCheck;
87
use PHPStan\Rules\ClassCaseSensitivityCheck;
@@ -15,6 +14,7 @@
1514
use PHPStan\Rules\Rule;
1615
use PHPStan\Rules\RuleLevelHelper;
1716
use PHPStan\Testing\RuleTestCase;
17+
use PHPStan\Type\ParameterClosureTypeHelper;
1818

1919
/**
2020
* @extends RuleTestCase<ClassConstantAttributesRule>
@@ -34,7 +34,7 @@ protected function getRule(): Rule
3434
new PhpVersion(80000),
3535
new UnresolvableTypeHelper(),
3636
new PropertyReflectionFinder(),
37-
self::getContainer()->getByType(ParameterClosureTypeExtensionProvider::class),
37+
self::getContainer()->getByType(ParameterClosureTypeHelper::class),
3838
true,
3939
true,
4040
true,

0 commit comments

Comments
 (0)