Skip to content

Commit b4a517c

Browse files
committed
Scope - getFunctionCallStack methods return extended reflection objects
1 parent f2937f8 commit b4a517c

19 files changed

+261
-157
lines changed

src/Analyser/ArgumentsNormalizer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use PhpParser\Node\Expr\New_;
99
use PhpParser\Node\Expr\StaticCall;
1010
use PHPStan\Node\Expr\TypeExpr;
11+
use PHPStan\Reflection\ExtendedParametersAcceptor;
1112
use PHPStan\Reflection\ParametersAcceptor;
1213
use PHPStan\Reflection\ParametersAcceptorSelector;
1314
use PHPStan\ShouldNotHappenException;
@@ -31,7 +32,7 @@ final class ArgumentsNormalizer
3132
public const ORIGINAL_ARG_ATTRIBUTE = 'originalArg';
3233

3334
/**
34-
* @return array{ParametersAcceptor, FuncCall, TrinaryLogic}|null
35+
* @return array{ExtendedParametersAcceptor, FuncCall, TrinaryLogic}|null
3536
*/
3637
public static function reorderCallUserFuncArguments(
3738
FuncCall $callUserFuncCall,

src/Analyser/InternalScopeFactory.php

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

33
namespace PHPStan\Analyser;
44

5+
use PHPStan\Reflection\ExtendedMethodReflection;
6+
use PHPStan\Reflection\ExtendedParameterReflection;
57
use PHPStan\Reflection\FunctionReflection;
6-
use PHPStan\Reflection\MethodReflection;
7-
use PHPStan\Reflection\ParameterReflection;
88
use PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection;
99
use PHPStan\Type\ClosureType;
1010

@@ -18,7 +18,7 @@ interface InternalScopeFactory
1818
* @param list<string> $inClosureBindScopeClasses
1919
* @param array<string, true> $currentlyAssignedExpressions
2020
* @param array<string, true> $currentlyAllowedUndefinedExpressions
21-
* @param list<array{FunctionReflection|MethodReflection|null, ParameterReflection|null}> $inFunctionCallsStack
21+
* @param list<array{FunctionReflection|ExtendedMethodReflection|null, ExtendedParameterReflection|null}> $inFunctionCallsStack
2222
*/
2323
public function create(
2424
ScopeContext $context,

src/Analyser/MutatingScope.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,13 @@
6666
use PHPStan\Reflection\ClassReflection;
6767
use PHPStan\Reflection\Dummy\DummyConstructorReflection;
6868
use PHPStan\Reflection\ExtendedMethodReflection;
69+
use PHPStan\Reflection\ExtendedParameterReflection;
6970
use PHPStan\Reflection\ExtendedPropertyReflection;
7071
use PHPStan\Reflection\FunctionReflection;
7172
use PHPStan\Reflection\InitializerExprContext;
7273
use PHPStan\Reflection\InitializerExprTypeResolver;
7374
use PHPStan\Reflection\MethodReflection;
74-
use PHPStan\Reflection\Native\NativeParameterReflection;
75+
use PHPStan\Reflection\Native\ExtendedNativeParameterReflection;
7576
use PHPStan\Reflection\ParameterReflection;
7677
use PHPStan\Reflection\ParametersAcceptorSelector;
7778
use PHPStan\Reflection\PassedByReference;
@@ -206,7 +207,7 @@ class MutatingScope implements Scope, NodeCallbackInvoker
206207
* @param array<string, true> $currentlyAssignedExpressions
207208
* @param array<string, true> $currentlyAllowedUndefinedExpressions
208209
* @param array<string, ExpressionTypeHolder> $nativeExpressionTypes
209-
* @param list<array{MethodReflection|FunctionReflection|null, ParameterReflection|null}> $inFunctionCallsStack
210+
* @param list<array{ExtendedMethodReflection|FunctionReflection|null, ExtendedParameterReflection|null}> $inFunctionCallsStack
210211
*/
211212
public function __construct(
212213
protected InternalScopeFactory $scopeFactory,
@@ -1379,15 +1380,22 @@ private function resolveType(string $exprString, Expr $node): Type
13791380
if (!$param->var instanceof Variable || !is_string($param->var->name)) {
13801381
throw new ShouldNotHappenException();
13811382
}
1382-
$parameters[] = new NativeParameterReflection(
1383+
$paramType = $this->getFunctionType($param->type, $this->isParameterValueNullable($param), false);
1384+
$parameters[] = new ExtendedNativeParameterReflection(
13831385
$param->var->name,
13841386
$firstOptionalParameterIndex !== null && $i >= $firstOptionalParameterIndex,
1385-
$this->getFunctionType($param->type, $this->isParameterValueNullable($param), false),
1387+
$paramType,
1388+
new MixedType(),
1389+
$paramType,
13861390
$param->byRef
13871391
? PassedByReference::createCreatesNewVariable()
13881392
: PassedByReference::createNo(),
13891393
$param->variadic,
13901394
$param->default !== null ? $this->getType($param->default) : null,
1395+
null,
1396+
TrinaryLogic::createMaybe(),
1397+
null,
1398+
[],
13911399
);
13921400
}
13931401

@@ -2924,9 +2932,9 @@ public function hasExpressionType(Expr $node): TrinaryLogic
29242932
}
29252933

29262934
/**
2927-
* @param MethodReflection|FunctionReflection|null $reflection
2935+
* @param ExtendedMethodReflection|FunctionReflection|null $reflection
29282936
*/
2929-
public function pushInFunctionCall($reflection, ?ParameterReflection $parameter, bool $rememberTypes): self
2937+
public function pushInFunctionCall($reflection, ?ExtendedParameterReflection $parameter, bool $rememberTypes): self
29302938
{
29312939
$stack = $this->inFunctionCallsStack;
29322940
$stack[] = [$reflection, $parameter];

src/Analyser/NodeScopeResolver.php

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@
150150
use PHPStan\Reflection\InitializerExprContext;
151151
use PHPStan\Reflection\InitializerExprTypeResolver;
152152
use PHPStan\Reflection\MethodReflection;
153+
use PHPStan\Reflection\Native\ExtendedNativeParameterReflection;
153154
use PHPStan\Reflection\Native\NativeMethodReflection;
154-
use PHPStan\Reflection\Native\NativeParameterReflection;
155155
use PHPStan\Reflection\ParameterReflection;
156156
use PHPStan\Reflection\ParametersAcceptor;
157157
use PHPStan\Reflection\ParametersAcceptorSelector;
@@ -177,7 +177,6 @@
177177
use PHPStan\Type\Generic\TemplateTypeHelper;
178178
use PHPStan\Type\Generic\TemplateTypeMap;
179179
use PHPStan\Type\Generic\TemplateTypeVariance;
180-
use PHPStan\Type\Generic\TemplateTypeVarianceMap;
181180
use PHPStan\Type\IntegerRangeType;
182181
use PHPStan\Type\IntegerType;
183182
use PHPStan\Type\IntersectionType;
@@ -3177,7 +3176,7 @@ function (MutatingScope $scope) use ($stmt, $expr, $nodeCallback, $context, $sto
31773176
TemplateTypeHelper::resolveTemplateTypes(
31783177
$selfOutType,
31793178
$parametersAcceptor->getResolvedTemplateTypeMap(),
3180-
$parametersAcceptor instanceof ExtendedParametersAcceptor ? $parametersAcceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(),
3179+
$parametersAcceptor->getCallSiteVarianceMap(),
31813180
TemplateTypeVariance::createCovariant(),
31823181
),
31833182
$scope->getNativeType($normalizedExpr->var),
@@ -5245,13 +5244,19 @@ public function createCallableParameters(Scope $scope, Expr $closureExpr, ?array
52455244
}
52465245

52475246
$type = $scope->getType($args[$index]->value);
5248-
$callableParameters[$index] = new NativeParameterReflection(
5247+
$callableParameters[$index] = new ExtendedNativeParameterReflection(
52495248
$callableParameter->getName(),
52505249
$callableParameter->isOptional(),
52515250
$type,
5251+
$type,
5252+
$scope->getNativeType($args[$index]->value),
52525253
$callableParameter->passedByReference(),
52535254
$callableParameter->isVariadic(),
52545255
$callableParameter->getDefaultValue(),
5256+
$callableParameter->getOutType(),
5257+
$callableParameter->isImmediatelyInvokedCallable(),
5258+
$callableParameter->getClosureThisType(),
5259+
$callableParameter->getAttributes(),
52555260
);
52565261
}
52575262
}
@@ -5268,14 +5273,7 @@ public function createCallableParameters(Scope $scope, Expr $closureExpr, ?array
52685273
if (count($acceptors) > 0) {
52695274
foreach ($acceptors as $acceptor) {
52705275
if ($callableParameters === null) {
5271-
$callableParameters = array_map(static fn (ParameterReflection $callableParameter) => new NativeParameterReflection(
5272-
$callableParameter->getName(),
5273-
$callableParameter->isOptional(),
5274-
$callableParameter->getType(),
5275-
$callableParameter->passedByReference(),
5276-
$callableParameter->isVariadic(),
5277-
$callableParameter->getDefaultValue(),
5278-
), $acceptor->getParameters());
5276+
$callableParameters = $acceptor->getParameters();
52795277
continue;
52805278
}
52815279

@@ -5286,14 +5284,7 @@ public function createCallableParameters(Scope $scope, Expr $closureExpr, ?array
52865284
continue;
52875285
}
52885286

5289-
$newParameters[] = $callableParameters[$i]->union(new NativeParameterReflection(
5290-
$callableParameter->getName(),
5291-
$callableParameter->isOptional(),
5292-
$callableParameter->getType(),
5293-
$callableParameter->passedByReference(),
5294-
$callableParameter->isVariadic(),
5295-
$callableParameter->getDefaultValue(),
5296-
));
5287+
$newParameters[] = $callableParameters[$i]->union($callableParameter);
52975288
}
52985289

52995290
$callableParameters = $newParameters;
@@ -5540,7 +5531,7 @@ private function resolveClosureThisType(
55405531
}
55415532

55425533
/**
5543-
* @param MethodReflection|FunctionReflection|null $calleeReflection
5534+
* @param ExtendedMethodReflection|FunctionReflection|null $calleeReflection
55445535
* @param callable(Node $node, Scope $scope): void $nodeCallback
55455536
*/
55465537
private function processArgs(
@@ -5556,6 +5547,10 @@ private function processArgs(
55565547
?MutatingScope $closureBindScope = null,
55575548
): ExpressionResult
55585549
{
5550+
if ($parametersAcceptor !== null && !$parametersAcceptor instanceof ExtendedParametersAcceptor) {
5551+
throw new ShouldNotHappenException();
5552+
}
5553+
55595554
$args = $callLike->getArgs();
55605555

55615556
$parameters = null;
@@ -5577,18 +5572,14 @@ private function processArgs(
55775572
$assignByReference = $parameters[$i]->passedByReference()->createsNewVariable();
55785573
$parameterType = $parameters[$i]->getType();
55795574

5580-
if ($parameters[$i] instanceof ExtendedParameterReflection) {
5581-
$parameterNativeType = $parameters[$i]->getNativeType();
5582-
}
5575+
$parameterNativeType = $parameters[$i]->getNativeType();
55835576
$parameter = $parameters[$i];
55845577
} elseif (count($parameters) > 0 && $parametersAcceptor->isVariadic()) {
55855578
$lastParameter = array_last($parameters);
55865579
$assignByReference = $lastParameter->passedByReference()->createsNewVariable();
55875580
$parameterType = $lastParameter->getType();
55885581

5589-
if ($lastParameter instanceof ExtendedParameterReflection) {
5590-
$parameterNativeType = $lastParameter->getNativeType();
5591-
}
5582+
$parameterNativeType = $lastParameter->getNativeType();
55925583
$parameter = $lastParameter;
55935584
}
55945585
}
@@ -5777,10 +5768,7 @@ private function processArgs(
57775768
$paramOutType = $this->getParameterOutExtensionsType($callLike, $calleeReflection, $currentParameter, $scope);
57785769
if ($paramOutType !== null) {
57795770
$byRefType = $paramOutType;
5780-
} elseif (
5781-
$currentParameter instanceof ExtendedParameterReflection
5782-
&& $currentParameter->getOutType() !== null
5783-
) {
5771+
} elseif ($currentParameter->getOutType() !== null) {
57845772
$byRefType = $currentParameter->getOutType();
57855773
} elseif (
57865774
$calleeReflection instanceof MethodReflection

src/Analyser/Scope.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@
1111
use PHPStan\Reflection\ClassMemberAccessAnswerer;
1212
use PHPStan\Reflection\ClassReflection;
1313
use PHPStan\Reflection\ExtendedMethodReflection;
14+
use PHPStan\Reflection\ExtendedParameterReflection;
1415
use PHPStan\Reflection\ExtendedPropertyReflection;
1516
use PHPStan\Reflection\FunctionReflection;
16-
use PHPStan\Reflection\MethodReflection;
1717
use PHPStan\Reflection\NamespaceAnswerer;
18-
use PHPStan\Reflection\ParameterReflection;
1918
use PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection;
2019
use PHPStan\TrinaryLogic;
2120
use PHPStan\Type\ClosureType;
@@ -142,10 +141,10 @@ public function isInFunctionExists(string $functionName): bool;
142141

143142
public function isInClosureBind(): bool;
144143

145-
/** @return list<FunctionReflection|MethodReflection> */
144+
/** @return list<FunctionReflection|ExtendedMethodReflection> */
146145
public function getFunctionCallStack(): array;
147146

148-
/** @return list<array{FunctionReflection|MethodReflection, ParameterReflection|null}> */
147+
/** @return list<array{FunctionReflection|ExtendedMethodReflection, ExtendedParameterReflection|null}> */
149148
public function getFunctionCallStackWithParameters(): array;
150149

151150
public function isParameterValueNullable(Param $parameter): bool;

src/Analyser/TypeSpecifier.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
use PHPStan\Node\Printer\ExprPrinter;
2727
use PHPStan\Php\PhpVersion;
2828
use PHPStan\Reflection\Assertions;
29-
use PHPStan\Reflection\ExtendedParametersAcceptor;
3029
use PHPStan\Reflection\ParametersAcceptor;
3130
use PHPStan\Reflection\ParametersAcceptorSelector;
3231
use PHPStan\Reflection\ReflectionProvider;
@@ -56,7 +55,6 @@
5655
use PHPStan\Type\Generic\TemplateType;
5756
use PHPStan\Type\Generic\TemplateTypeHelper;
5857
use PHPStan\Type\Generic\TemplateTypeVariance;
59-
use PHPStan\Type\Generic\TemplateTypeVarianceMap;
6058
use PHPStan\Type\IntegerRangeType;
6159
use PHPStan\Type\IntegerType;
6260
use PHPStan\Type\IntersectionType;
@@ -508,7 +506,7 @@ public function specifyTypesInCondition(
508506
$asserts = $assertions->mapTypes(static fn (Type $type) => TemplateTypeHelper::resolveTemplateTypes(
509507
$type,
510508
$parametersAcceptor->getResolvedTemplateTypeMap(),
511-
$parametersAcceptor instanceof ExtendedParametersAcceptor ? $parametersAcceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(),
509+
$parametersAcceptor->getCallSiteVarianceMap(),
512510
TemplateTypeVariance::createInvariant(),
513511
));
514512
$specifiedTypes = $this->specifyTypesFromAsserts($context, $expr, $asserts, $parametersAcceptor, $scope);
@@ -561,7 +559,7 @@ public function specifyTypesInCondition(
561559
$asserts = $assertions->mapTypes(static fn (Type $type) => TemplateTypeHelper::resolveTemplateTypes(
562560
$type,
563561
$parametersAcceptor->getResolvedTemplateTypeMap(),
564-
$parametersAcceptor instanceof ExtendedParametersAcceptor ? $parametersAcceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(),
562+
$parametersAcceptor->getCallSiteVarianceMap(),
565563
TemplateTypeVariance::createInvariant(),
566564
));
567565
$specifiedTypes = $this->specifyTypesFromAsserts($context, $expr, $asserts, $parametersAcceptor, $scope);
@@ -619,7 +617,7 @@ public function specifyTypesInCondition(
619617
$asserts = $assertions->mapTypes(static fn (Type $type) => TemplateTypeHelper::resolveTemplateTypes(
620618
$type,
621619
$parametersAcceptor->getResolvedTemplateTypeMap(),
622-
$parametersAcceptor instanceof ExtendedParametersAcceptor ? $parametersAcceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(),
620+
$parametersAcceptor->getCallSiteVarianceMap(),
623621
TemplateTypeVariance::createInvariant(),
624622
));
625623
$specifiedTypes = $this->specifyTypesFromAsserts($context, $expr, $asserts, $parametersAcceptor, $scope);
@@ -1087,7 +1085,7 @@ public function specifyTypesInCondition(
10871085
$asserts = $asserts->mapTypes(static fn (Type $type) => TemplateTypeHelper::resolveTemplateTypes(
10881086
$type,
10891087
$parametersAcceptor->getResolvedTemplateTypeMap(),
1090-
$parametersAcceptor instanceof ExtendedParametersAcceptor ? $parametersAcceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(),
1088+
$parametersAcceptor->getCallSiteVarianceMap(),
10911089
TemplateTypeVariance::createInvariant(),
10921090
));
10931091

src/Dependency/DependencyResolver.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
use PHPStan\Node\MethodCallableNode;
2424
use PHPStan\Node\StaticMethodCallableNode;
2525
use PHPStan\Reflection\ClassReflection;
26-
use PHPStan\Reflection\ExtendedParameterReflection;
2726
use PHPStan\Reflection\ExtendedParametersAcceptor;
2827
use PHPStan\Reflection\FunctionReflection;
2928
use PHPStan\Reflection\ReflectionProvider;
@@ -181,9 +180,6 @@ public function resolveDependencies(Node $node, Scope $scope): NodeDependencies
181180
}
182181

183182
foreach ($variant->getParameters() as $parameter) {
184-
if (!$parameter instanceof ExtendedParameterReflection) {
185-
continue;
186-
}
187183
if ($parameter->getOutType() !== null) {
188184
foreach ($parameter->getOutType()->getReferencedClasses() as $referencedClass) {
189185
$this->addClassToDependencies($referencedClass, $dependenciesReflections);

src/Reflection/Callables/CallableParametersAcceptor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
namespace PHPStan\Reflection\Callables;
44

55
use PHPStan\Node\InvalidateExprNode;
6-
use PHPStan\Reflection\ParametersAcceptor;
6+
use PHPStan\Reflection\ExtendedParametersAcceptor;
77
use PHPStan\TrinaryLogic;
88

99
/**
1010
* @api
1111
*/
12-
interface CallableParametersAcceptor extends ParametersAcceptor
12+
interface CallableParametersAcceptor extends ExtendedParametersAcceptor
1313
{
1414

1515
/**

src/Reflection/InaccessibleMethod.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ public function getReturnType(): Type
5252
return new MixedType();
5353
}
5454

55+
public function getPhpDocReturnType(): Type
56+
{
57+
return new MixedType();
58+
}
59+
60+
public function getNativeReturnType(): Type
61+
{
62+
return new MixedType();
63+
}
64+
5565
public function getThrowPoints(): array
5666
{
5767
return [];

src/Reflection/Native/ExtendedNativeParameterReflection.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use PHPStan\TrinaryLogic;
99
use PHPStan\Type\MixedType;
1010
use PHPStan\Type\Type;
11+
use PHPStan\Type\TypeCombinator;
12+
use function array_merge;
1113

1214
final class ExtendedNativeParameterReflection implements ExtendedParameterReflection
1315
{
@@ -97,4 +99,22 @@ public function getAttributes(): array
9799
return $this->attributes;
98100
}
99101

102+
public function union(self $other): self
103+
{
104+
return new self(
105+
$this->name,
106+
$this->optional && $other->optional,
107+
TypeCombinator::union($this->type, $other->type),
108+
TypeCombinator::union($this->phpDocType, $other->phpDocType),
109+
TypeCombinator::union($this->nativeType, $other->nativeType),
110+
$this->passedByReference->combine($other->passedByReference),
111+
$this->variadic && $other->variadic,
112+
$this->optional && $other->optional ? $this->defaultValue : null,
113+
$this->outType !== null && $other->outType !== null ? TypeCombinator::union($this->outType, $other->outType) : null,
114+
$this->immediatelyInvokedCallable->and($other->immediatelyInvokedCallable),
115+
$this->closureThisType !== null && $other->closureThisType !== null ? TypeCombinator::union($this->closureThisType, $other->closureThisType) : null,
116+
array_merge($this->attributes, $other->attributes),
117+
);
118+
}
119+
100120
}

0 commit comments

Comments
 (0)