Skip to content

Commit 648a2f5

Browse files
Fix BleedingEdgeIncludePurifier to use random value on temporary file to avoid crash (rectorphp#3396)
* Fix BleedingEdgeIncludePurifier to use random value on temporary file to avoid crash * [ci-review] Rector Rectify * [ci-review] Rector Rectify * [ci-review] Rector Rectify * [ci-review] Rector Rectify * ignore phpstan notice on phpstan 1.10.0 * fixed by check recursive call * [ci-review] Rector Rectify * fixed by check recursive call --------- Co-authored-by: GitHub Action <[email protected]>
1 parent f9f4217 commit 648a2f5

File tree

7 files changed

+53
-13
lines changed

7 files changed

+53
-13
lines changed

packages/NodeCollector/NodeAnalyzer/ArrayCallableMethodMatcher.php

+5-3
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,12 @@ private function resolveClassConstFetchType(ClassConstFetch $classConstFetch): M
180180
}
181181

182182
$extendedMethodReflection = $classReflection->getMethod(MethodName::CONSTRUCT, $scope);
183-
$parametersAcceptor = ParametersAcceptorSelector::selectSingle($extendedMethodReflection->getVariants());
183+
$parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::selectSingle(
184+
$extendedMethodReflection->getVariants()
185+
);
184186

185-
foreach ($parametersAcceptor->getParameters() as $parameterReflection) {
186-
if ($parameterReflection->getDefaultValue() === null) {
187+
foreach ($parametersAcceptorWithPhpDocs->getParameters() as $parameterReflectionWithPhpDoc) {
188+
if ($parameterReflectionWithPhpDoc->getDefaultValue() === null) {
187189
return new MixedType();
188190
}
189191
}

packages/NodeTypeResolver/DependencyInjection/BleedingEdgeIncludePurifier.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ private function createTemporaryFilePath(string $filePath): string
5353
$fileDirectory = dirname($filePath);
5454
$baseFileName = pathinfo($filePath, PATHINFO_BASENAME);
5555

56-
return $fileDirectory . '/temp_' . $baseFileName;
56+
$randomBytes = random_bytes(10);
57+
$randomString = bin2hex($randomBytes);
58+
return $fileDirectory . '/temp_' . $randomString . '_' . $baseFileName;
5759
}
5860
}

packages/PhpAttribute/NodeAnalyzer/ExprParameterReflectionTypeCorrector.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@ public function correctItemsByAttributeClass(array|Array_ $items, string $attrib
4949

5050
$extendedMethodReflection = $attributeClassReflection->getConstructor();
5151

52-
$parametersAcceptor = ParametersAcceptorSelector::selectSingle($extendedMethodReflection->getVariants());
52+
$parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::selectSingle(
53+
$extendedMethodReflection->getVariants()
54+
);
5355

5456
foreach ($items as $name => $item) {
55-
foreach ($parametersAcceptor->getParameters() as $parameterReflection) {
57+
foreach ($parametersAcceptorWithPhpDocs->getParameters() as $parameterReflection) {
5658
$correctedItem = $this->correctItemByParameterReflection($name, $item, $parameterReflection);
5759
if (! $correctedItem instanceof Expr) {
5860
continue;

phpstan.neon

+7
Original file line numberDiff line numberDiff line change
@@ -805,3 +805,10 @@ parameters:
805805

806806
- '#Call to static method Webmozart\\Assert\\Assert\:\:(allIsAOf|isAOf|assertInstanceOf|allIsInstanceOf)(.*?) will always evaluate to true#'
807807
- '#Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with (.*?) will always evaluate to true#'
808+
809+
- '#Doing instanceof PHPStan\\Type\\.* is error\-prone and deprecated(\. Use Type\:\:.*\(\) (or .* )?instead)?#'
810+
811+
# phpstan 1.10.0
812+
- '#Call to deprecated method getDirectClassNames\(\) of class PHPStan\\Type\\TypeUtils.*#'
813+
- '#Parameter 3 should use "PHPStan\\Reflection\\ParameterReflectionWithPhpDocs" type as the only type passed to this method#'
814+
- '#Parameters should use "PHPStan\\Reflection\\ParameterReflectionWithPhpDocs\|PhpParser\\Node\\Param" types as the only types passed to this method#'

rules/CodeQuality/Rector/Catch_/ThrowWithPreviousExceptionRector.php

+5-3
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,12 @@ private function resolveExceptionArgumentPosition(Name $exceptionName): ?int
183183
}
184184

185185
$extendedMethodReflection = $classReflection->getConstructor();
186-
$parametersAcceptor = ParametersAcceptorSelector::selectSingle($extendedMethodReflection->getVariants());
186+
$parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::selectSingle(
187+
$extendedMethodReflection->getVariants()
188+
);
187189

188-
foreach ($parametersAcceptor->getParameters() as $position => $parameterReflection) {
189-
$parameterType = $parameterReflection->getType();
190+
foreach ($parametersAcceptorWithPhpDocs->getParameters() as $position => $parameterReflectionWithPhpDoc) {
191+
$parameterType = $parameterReflectionWithPhpDoc->getType();
190192
if (! $parameterType instanceof TypeWithClassName) {
191193
continue;
192194
}

rules/DeadCode/Comparator/CurrentAndParentClassMethodComparator.php

+6-4
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,13 @@ private function areParameterDefaultsDifferent(
157157
ClassMethod $classMethod,
158158
ExtendedMethodReflection $extendedMethodReflection
159159
): bool {
160-
$parametersAcceptor = ParametersAcceptorSelector::selectSingle($extendedMethodReflection->getVariants());
160+
$parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::selectSingle(
161+
$extendedMethodReflection->getVariants()
162+
);
161163

162-
foreach ($parametersAcceptor->getParameters() as $key => $parameterReflection) {
164+
foreach ($parametersAcceptorWithPhpDocs->getParameters() as $key => $parameterReflectionWithPhpDoc) {
163165
if (! isset($classMethod->params[$key])) {
164-
if ($parameterReflection->getDefaultValue() !== null) {
166+
if ($parameterReflectionWithPhpDoc->getDefaultValue() !== null) {
165167
continue;
166168
}
167169

@@ -171,7 +173,7 @@ private function areParameterDefaultsDifferent(
171173
$methodParam = $classMethod->params[$key];
172174

173175
if ($this->parameterDefaultsComparator->areDefaultValuesDifferent(
174-
$parameterReflection,
176+
$parameterReflectionWithPhpDoc,
175177
$methodParam
176178
)) {
177179
return true;

rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php

+23
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PhpParser\Node\Arg;
88
use PhpParser\Node\Expr\MethodCall;
99
use PhpParser\Node\Expr\StaticCall;
10+
use PhpParser\Node\Stmt\ClassMethod;
1011
use PHPStan\Reflection\ReflectionProvider;
1112
use PHPStan\Type\MixedType;
1213
use PHPStan\Type\NullType;
@@ -15,6 +16,9 @@
1516
use PHPStan\Type\Type;
1617
use PHPStan\Type\TypeWithClassName;
1718
use PHPStan\Type\UnionType;
19+
use Rector\Core\PhpParser\AstResolver;
20+
use Rector\Core\PhpParser\Comparing\NodeComparator;
21+
use Rector\Core\PhpParser\Node\BetterNodeFinder;
1822
use Rector\NodeCollector\ValueObject\ArrayCallable;
1923
use Rector\NodeTypeResolver\NodeTypeResolver;
2024
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
@@ -25,6 +29,9 @@ public function __construct(
2529
private readonly NodeTypeResolver $nodeTypeResolver,
2630
private readonly TypeFactory $typeFactory,
2731
private readonly ReflectionProvider $reflectionProvider,
32+
private readonly BetterNodeFinder $betterNodeFinder,
33+
private readonly AstResolver $astResolver,
34+
private readonly NodeComparator $nodeComparator
2835
) {
2936
}
3037

@@ -41,6 +48,10 @@ public function resolveStrictTypesFromCalls(array $calls): array
4148
continue;
4249
}
4350

51+
if ($this->isRecursiveCall($call)) {
52+
return [];
53+
}
54+
4455
foreach ($call->args as $position => $arg) {
4556
if (! $arg instanceof Arg) {
4657
continue;
@@ -54,6 +65,18 @@ public function resolveStrictTypesFromCalls(array $calls): array
5465
return $this->unionToSingleType($staticTypesByArgumentPosition);
5566
}
5667

68+
private function isRecursiveCall(MethodCall|StaticCall $call): bool
69+
{
70+
$parentClassMethod = $this->betterNodeFinder->findParentType($call, ClassMethod::class);
71+
72+
if (! $parentClassMethod instanceof ClassMethod) {
73+
return false;
74+
}
75+
76+
$classMethod = $this->astResolver->resolveClassMethodFromCall($call);
77+
return $this->nodeComparator->areNodesEqual($parentClassMethod, $classMethod);
78+
}
79+
5780
private function resolveStrictArgValueType(Arg $arg): Type
5881
{
5982
$argValueType = $this->nodeTypeResolver->getNativeType($arg->value);

0 commit comments

Comments
 (0)