Skip to content

Commit 41916ba

Browse files
committed
Use methods directly on PhpFunctionFromParserNodeReflection instead of selectSingle() when analysing function body in rules
1 parent 1bea5c7 commit 41916ba

32 files changed

+41
-91
lines changed

src/Reflection/Php/PhpFunctionFromParserNodeReflection.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public function getVariants(): array
108108
$this->isVariadic(),
109109
$this->getReturnType(),
110110
$this->getPhpDocReturnType(),
111-
$this->realReturnType,
111+
$this->getNativeReturnType(),
112112
),
113113
];
114114
}

src/Rules/DeadCode/ConstructorWithoutImpurePointsCollector.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Collectors\Collector;
88
use PHPStan\Node\MethodReturnStatementsNode;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use function count;
1110
use function strtolower;
1211

@@ -40,8 +39,7 @@ public function processNode(Node $node, Scope $scope)
4039
return null;
4140
}
4241

43-
$variant = ParametersAcceptorSelector::selectSingle($method->getVariants());
44-
foreach ($variant->getParameters() as $parameter) {
42+
foreach ($method->getParameters() as $parameter) {
4543
if (!$parameter->passedByReference()->createsNewVariable()) {
4644
continue;
4745
}

src/Rules/DeadCode/FunctionWithoutImpurePointsCollector.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Collectors\Collector;
88
use PHPStan\Node\FunctionReturnStatementsNode;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use function count;
1110

1211
/**
@@ -38,8 +37,7 @@ public function processNode(Node $node, Scope $scope)
3837
return null;
3938
}
4039

41-
$variant = ParametersAcceptorSelector::selectSingle($function->getVariants());
42-
foreach ($variant->getParameters() as $parameter) {
40+
foreach ($function->getParameters() as $parameter) {
4341
if (!$parameter->passedByReference()->createsNewVariable()) {
4442
continue;
4543
}

src/Rules/DeadCode/MethodWithoutImpurePointsCollector.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Collectors\Collector;
88
use PHPStan\Node\MethodReturnStatementsNode;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use function count;
1110

1211
/**
@@ -38,8 +37,7 @@ public function processNode(Node $node, Scope $scope)
3837
return null;
3938
}
4039

41-
$variant = ParametersAcceptorSelector::selectSingle($method->getVariants());
42-
foreach ($variant->getParameters() as $parameter) {
40+
foreach ($method->getParameters() as $parameter) {
4341
if (!$parameter->passedByReference()->createsNewVariable()) {
4442
continue;
4543
}

src/Rules/FunctionDefinitionCheck.php

+4-10
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@
1818
use PHPStan\Analyser\Scope;
1919
use PHPStan\Node\Printer\NodeTypePrinter;
2020
use PHPStan\Php\PhpVersion;
21-
use PHPStan\Reflection\FunctionReflection;
2221
use PHPStan\Reflection\ParameterReflection;
2322
use PHPStan\Reflection\ParameterReflectionWithPhpDocs;
2423
use PHPStan\Reflection\ParametersAcceptor;
25-
use PHPStan\Reflection\ParametersAcceptorSelector;
2624
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
25+
use PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection;
2726
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
2827
use PHPStan\Reflection\ReflectionProvider;
2928
use PHPStan\Rules\PhpDoc\UnresolvableTypeHelper;
@@ -65,7 +64,7 @@ public function __construct(
6564
*/
6665
public function checkFunction(
6766
Function_ $function,
68-
FunctionReflection $functionReflection,
67+
PhpFunctionFromParserNodeReflection $functionReflection,
6968
string $parameterMessage,
7069
string $returnMessage,
7170
string $unionTypesMessage,
@@ -74,10 +73,8 @@ public function checkFunction(
7473
string $unresolvableReturnTypeMessage,
7574
): array
7675
{
77-
$parametersAcceptor = ParametersAcceptorSelector::selectSingle($functionReflection->getVariants());
78-
7976
return $this->checkParametersAcceptor(
80-
$parametersAcceptor,
77+
$functionReflection,
8178
$function,
8279
$parameterMessage,
8380
$returnMessage,
@@ -259,11 +256,8 @@ public function checkClassMethod(
259256
string $selfOutMessage,
260257
): array
261258
{
262-
/** @var ParametersAcceptorWithPhpDocs $parametersAcceptor */
263-
$parametersAcceptor = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants());
264-
265259
$errors = $this->checkParametersAcceptor(
266-
$parametersAcceptor,
260+
$methodReflection,
267261
$methodNode,
268262
$parameterMessage,
269263
$returnMessage,

src/Rules/Functions/IncompatibleDefaultParameterTypeRule.php

+1-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Node\InFunctionNode;
8-
use PHPStan\Reflection\ParametersAcceptorSelector;
98
use PHPStan\Rules\Rule;
109
use PHPStan\Rules\RuleErrorBuilder;
1110
use PHPStan\ShouldNotHappenException;
@@ -28,8 +27,6 @@ public function getNodeType(): string
2827
public function processNode(Node $node, Scope $scope): array
2928
{
3029
$function = $node->getFunctionReflection();
31-
$parameters = ParametersAcceptorSelector::selectSingle($function->getVariants());
32-
3330
$errors = [];
3431
foreach ($node->getOriginalNode()->getParams() as $paramI => $param) {
3532
if ($param->default === null) {
@@ -43,7 +40,7 @@ public function processNode(Node $node, Scope $scope): array
4340
}
4441

4542
$defaultValueType = $scope->getType($param->default);
46-
$parameterType = $parameters->getParameters()[$paramI]->getType();
43+
$parameterType = $function->getParameters()[$paramI]->getType();
4744
$parameterType = TemplateTypeHelper::resolveToBounds($parameterType);
4845

4946
$accepts = $parameterType->acceptsWithReason($defaultValueType, true);

src/Rules/Functions/MissingFunctionParameterTypehintRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Node\InFunctionNode;
88
use PHPStan\Reflection\FunctionReflection;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use PHPStan\Rules\IdentifierRuleError;
1110
use PHPStan\Rules\MissingTypehintCheck;
1211
use PHPStan\Rules\Rule;
@@ -40,7 +39,7 @@ public function processNode(Node $node, Scope $scope): array
4039
$functionReflection = $node->getFunctionReflection();
4140
$messages = [];
4241

43-
foreach (ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getParameters() as $parameterReflection) {
42+
foreach ($functionReflection->getParameters() as $parameterReflection) {
4443
foreach ($this->checkFunctionParameter($functionReflection, sprintf('parameter $%s', $parameterReflection->getName()), $parameterReflection->getType()) as $parameterMessage) {
4544
$messages[] = $parameterMessage;
4645
}

src/Rules/Functions/MissingFunctionReturnTypehintRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Node\InFunctionNode;
8-
use PHPStan\Reflection\ParametersAcceptorSelector;
98
use PHPStan\Rules\MissingTypehintCheck;
109
use PHPStan\Rules\Rule;
1110
use PHPStan\Rules\RuleErrorBuilder;
@@ -34,7 +33,7 @@ public function getNodeType(): string
3433
public function processNode(Node $node, Scope $scope): array
3534
{
3635
$functionReflection = $node->getFunctionReflection();
37-
$returnType = ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
36+
$returnType = $functionReflection->getReturnType();
3837

3938
if ($returnType instanceof MixedType && !$returnType->isExplicitMixed()) {
4039
return [

src/Rules/Functions/ReturnTypeRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PhpParser\Node\Stmt\Return_;
77
use PHPStan\Analyser\Scope;
88
use PHPStan\Reflection\MethodReflection;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use PHPStan\Rules\FunctionReturnTypeCheck;
1110
use PHPStan\Rules\Rule;
1211
use function sprintf;
@@ -45,7 +44,7 @@ public function processNode(Node $node, Scope $scope): array
4544

4645
return $this->returnTypeCheck->checkReturnType(
4746
$scope,
48-
ParametersAcceptorSelector::selectSingle($function->getVariants())->getReturnType(),
47+
$function->getReturnType(),
4948
$node->expr,
5049
$node,
5150
sprintf(

src/Rules/Generators/YieldFromTypeRule.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PhpParser\Node;
77
use PhpParser\Node\Expr\YieldFrom;
88
use PHPStan\Analyser\Scope;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use PHPStan\Rules\Rule;
1110
use PHPStan\Rules\RuleErrorBuilder;
1211
use PHPStan\Rules\RuleLevelHelper;
@@ -69,7 +68,7 @@ public function processNode(Node $node, Scope $scope): array
6968
if ($anonymousFunctionReturnType !== null) {
7069
$returnType = $anonymousFunctionReturnType;
7170
} elseif ($scopeFunction !== null) {
72-
$returnType = ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
71+
$returnType = $scopeFunction->getReturnType();
7372
} else {
7473
return []; // already reported by YieldInGeneratorRule
7574
}
@@ -112,7 +111,7 @@ public function processNode(Node $node, Scope $scope): array
112111
return $messages;
113112
}
114113

115-
$currentReturnType = ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
114+
$currentReturnType = $scopeFunction->getReturnType();
116115
$exprSendType = $exprType->getTemplateType(Generator::class, 'TSend');
117116
$thisSendType = $currentReturnType->getTemplateType(Generator::class, 'TSend');
118117
if ($exprSendType instanceof ErrorType || $thisSendType instanceof ErrorType) {

src/Rules/Generators/YieldInGeneratorRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
7-
use PHPStan\Reflection\ParametersAcceptorSelector;
87
use PHPStan\Rules\Rule;
98
use PHPStan\Rules\RuleErrorBuilder;
109
use PHPStan\TrinaryLogic;
@@ -38,7 +37,7 @@ public function processNode(Node $node, Scope $scope): array
3837
if ($anonymousFunctionReturnType !== null) {
3938
$returnType = $anonymousFunctionReturnType;
4039
} elseif ($scopeFunction !== null) {
41-
$returnType = ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
40+
$returnType = $scopeFunction->getReturnType();
4241
} else {
4342
return [
4443
RuleErrorBuilder::message('Yield can be used only inside a function.')

src/Rules/Generators/YieldTypeRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
7-
use PHPStan\Reflection\ParametersAcceptorSelector;
87
use PHPStan\Rules\Rule;
98
use PHPStan\Rules\RuleErrorBuilder;
109
use PHPStan\Rules\RuleLevelHelper;
@@ -38,7 +37,7 @@ public function processNode(Node $node, Scope $scope): array
3837
if ($anonymousFunctionReturnType !== null) {
3938
$returnType = $anonymousFunctionReturnType;
4039
} elseif ($scopeFunction !== null) {
41-
$returnType = ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
40+
$returnType = $scopeFunction->getReturnType();
4241
} else {
4342
return []; // already reported by YieldInGeneratorRule
4443
}

src/Rules/Generics/FunctionSignatureVarianceRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Internal\SprintfHelper;
88
use PHPStan\Node\InFunctionNode;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use PHPStan\Rules\Rule;
1110
use function sprintf;
1211

@@ -31,7 +30,7 @@ public function processNode(Node $node, Scope $scope): array
3130
$functionName = $functionReflection->getName();
3231

3332
return $this->varianceCheck->checkParametersAcceptor(
34-
ParametersAcceptorSelector::selectSingle($functionReflection->getVariants()),
33+
$functionReflection,
3534
sprintf('in parameter %%s of function %s()', SprintfHelper::escapeFormatString($functionName)),
3635
sprintf('in param-out type of parameter %%s of function %s()', SprintfHelper::escapeFormatString($functionName)),
3736
sprintf('in return type of function %s()', $functionName),

src/Rules/Generics/MethodSignatureVarianceRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Internal\SprintfHelper;
88
use PHPStan\Node\InClassMethodNode;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use PHPStan\Rules\Rule;
1110
use function sprintf;
1211

@@ -30,7 +29,7 @@ public function processNode(Node $node, Scope $scope): array
3029
$method = $node->getMethodReflection();
3130

3231
return $this->varianceCheck->checkParametersAcceptor(
33-
ParametersAcceptorSelector::selectSingle($method->getVariants()),
32+
$method,
3433
sprintf('in parameter %%s of method %s::%s()', SprintfHelper::escapeFormatString($method->getDeclaringClass()->getDisplayName()), SprintfHelper::escapeFormatString($method->getName())),
3534
sprintf('in param-out type of parameter %%s of method %s::%s()', SprintfHelper::escapeFormatString($method->getDeclaringClass()->getDisplayName()), SprintfHelper::escapeFormatString($method->getName())),
3635
sprintf('in return type of method %s::%s()', $method->getDeclaringClass()->getDisplayName(), $method->getName()),

src/Rules/Methods/IncompatibleDefaultParameterTypeRule.php

+1-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Node\InClassMethodNode;
8-
use PHPStan\Reflection\ParametersAcceptorSelector;
98
use PHPStan\Rules\Rule;
109
use PHPStan\Rules\RuleErrorBuilder;
1110
use PHPStan\ShouldNotHappenException;
@@ -28,8 +27,6 @@ public function getNodeType(): string
2827
public function processNode(Node $node, Scope $scope): array
2928
{
3029
$method = $node->getMethodReflection();
31-
$parameters = ParametersAcceptorSelector::selectSingle($method->getVariants());
32-
3330
$errors = [];
3431
foreach ($node->getOriginalNode()->getParams() as $paramI => $param) {
3532
if ($param->default === null) {
@@ -43,7 +40,7 @@ public function processNode(Node $node, Scope $scope): array
4340
}
4441

4542
$defaultValueType = $scope->getType($param->default);
46-
$parameter = $parameters->getParameters()[$paramI];
43+
$parameter = $method->getParameters()[$paramI];
4744
$parameterType = $parameter->getType();
4845
$parameterType = TemplateTypeHelper::resolveToBounds($parameterType);
4946

src/Rules/Methods/MethodParameterComparisonHelper.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use PHPStan\Php\PhpVersion;
66
use PHPStan\Reflection\ClassReflection;
77
use PHPStan\Reflection\ExtendedMethodReflection;
8-
use PHPStan\Reflection\ParametersAcceptorSelector;
98
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
109
use PHPStan\Rules\IdentifierRuleError;
1110
use PHPStan\Rules\RuleErrorBuilder;
@@ -37,8 +36,7 @@ public function compare(ExtendedMethodReflection $prototype, ClassReflection $pr
3736
$messages = [];
3837
$prototypeVariant = $prototype->getVariants()[0];
3938

40-
$methodVariant = ParametersAcceptorSelector::selectSingle($method->getVariants());
41-
$methodParameters = $methodVariant->getParameters();
39+
$methodParameters = $method->getParameters();
4240

4341
$prototypeAfterVariadic = false;
4442
foreach ($prototypeVariant->getParameters() as $i => $prototypeParameter) {

src/Rules/Methods/MethodSignatureRule.php

+3-5
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ public function processNode(Node $node, Scope $scope): array
6767
if ($method->isPrivate()) {
6868
return [];
6969
}
70-
$parameters = ParametersAcceptorSelector::selectSingle($method->getVariants());
71-
7270
$errors = [];
7371
$declaringClass = $method->getDeclaringClass();
7472
foreach ($this->collectParentMethods($methodName, $method->getDeclaringClass()) as [$parentMethod, $parentMethodDeclaringClass]) {
@@ -77,7 +75,7 @@ public function processNode(Node $node, Scope $scope): array
7775
continue;
7876
}
7977
$parentParameters = ParametersAcceptorSelector::selectSingle($parentVariants);
80-
[$returnTypeCompatibility, $returnType, $parentReturnType] = $this->checkReturnTypeCompatibility($declaringClass, $parameters, $parentParameters);
78+
[$returnTypeCompatibility, $returnType, $parentReturnType] = $this->checkReturnTypeCompatibility($declaringClass, $method, $parentParameters);
8179
if ($returnTypeCompatibility->no() || (!$returnTypeCompatibility->yes() && $this->reportMaybes)) {
8280
$builder = RuleErrorBuilder::message(sprintf(
8381
'Return type (%s) of method %s::%s() should be %s with return type (%s) of method %s::%s()',
@@ -116,15 +114,15 @@ public function processNode(Node $node, Scope $scope): array
116114
$errors[] = $builder->build();
117115
}
118116

119-
$parameterResults = $this->checkParameterTypeCompatibility($declaringClass, $parameters->getParameters(), $parentParameters->getParameters());
117+
$parameterResults = $this->checkParameterTypeCompatibility($declaringClass, $method->getParameters(), $parentParameters->getParameters());
120118
foreach ($parameterResults as $parameterIndex => [$parameterResult, $parameterType, $parentParameterType]) {
121119
if ($parameterResult->yes()) {
122120
continue;
123121
}
124122
if (!$parameterResult->no() && !$this->reportMaybes) {
125123
continue;
126124
}
127-
$parameter = $parameters->getParameters()[$parameterIndex];
125+
$parameter = $method->getParameters()[$parameterIndex];
128126
$parentParameter = $parentParameters->getParameters()[$parameterIndex];
129127
$errors[] = RuleErrorBuilder::message(sprintf(
130128
'Parameter #%d $%s (%s) of method %s::%s() should be %s with parameter $%s (%s) of method %s::%s()',

src/Rules/Methods/MissingMethodParameterTypehintRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Node\InClassMethodNode;
88
use PHPStan\Reflection\MethodReflection;
9-
use PHPStan\Reflection\ParametersAcceptorSelector;
109
use PHPStan\Rules\IdentifierRuleError;
1110
use PHPStan\Rules\MissingTypehintCheck;
1211
use PHPStan\Rules\Rule;
@@ -40,7 +39,7 @@ public function processNode(Node $node, Scope $scope): array
4039
$methodReflection = $node->getMethodReflection();
4140
$messages = [];
4241

43-
foreach (ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getParameters() as $parameterReflection) {
42+
foreach ($methodReflection->getParameters() as $parameterReflection) {
4443
foreach ($this->checkMethodParameter($methodReflection, sprintf('parameter $%s', $parameterReflection->getName()), $parameterReflection->getType()) as $parameterMessage) {
4544
$messages[] = $parameterMessage;
4645
}

src/Rules/Methods/MissingMethodReturnTypehintRule.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Node\InClassMethodNode;
8-
use PHPStan\Reflection\ParametersAcceptorSelector;
98
use PHPStan\Rules\MissingTypehintCheck;
109
use PHPStan\Rules\Rule;
1110
use PHPStan\Rules\RuleErrorBuilder;
@@ -39,7 +38,7 @@ public function processNode(Node $node, Scope $scope): array
3938
return [];
4039
}
4140
}
42-
$returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
41+
$returnType = $methodReflection->getReturnType();
4342

4443
if ($returnType instanceof MixedType && !$returnType->isExplicitMixed()) {
4544
return [

0 commit comments

Comments
 (0)