Skip to content

Commit b2bcda2

Browse files
zonuexeclaude
andcommitted
Merge the two conditional purity parameter mergers into one class
MergedPureUnlessCallableIsImpureParameters and MergedPureUnlessParameterPassedParameters were identical apart from which getter they read off each method reflection. MergedConditionalPurityParameters keeps that merge once and exposes one entry point per tag. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
1 parent e515004 commit b2bcda2

5 files changed

Lines changed: 81 additions & 116 deletions

src/Reflection/Type/IntersectionTypeMethodReflection.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,12 @@ public function isPure(): TrinaryLogic
216216

217217
public function getPureUnlessCallableIsImpureParameters(): array
218218
{
219-
return MergedPureUnlessCallableIsImpureParameters::merge($this->methods);
219+
return MergedConditionalPurityParameters::mergePureUnlessCallableIsImpure($this->methods);
220220
}
221221

222222
public function getPureUnlessParameterPassedParameters(): array
223223
{
224-
return MergedPureUnlessParameterPassedParameters::merge($this->methods);
224+
return MergedConditionalPurityParameters::mergePureUnlessParameterPassed($this->methods);
225225
}
226226

227227
public function getDocComment(): ?string
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Reflection\Type;
4+
5+
use PHPStan\Reflection\ExtendedMethodReflection;
6+
use PHPStan\TrinaryLogic;
7+
use function array_keys;
8+
use function array_map;
9+
10+
/**
11+
* Merges the per-parameter conditional purity flags of several method reflections
12+
* (union/intersection members). A parameter that is flagged differently across the
13+
* members - or present in some and absent in others - resolves to Maybe.
14+
*/
15+
final class MergedConditionalPurityParameters
16+
{
17+
18+
/**
19+
* @param ExtendedMethodReflection[] $methods
20+
* @return array<string, TrinaryLogic>
21+
*/
22+
public static function mergePureUnlessCallableIsImpure(array $methods): array
23+
{
24+
return self::merge(array_map(
25+
static fn (ExtendedMethodReflection $method) => $method->getPureUnlessCallableIsImpureParameters(),
26+
$methods,
27+
));
28+
}
29+
30+
/**
31+
* @param ExtendedMethodReflection[] $methods
32+
* @return array<string, TrinaryLogic>
33+
*/
34+
public static function mergePureUnlessParameterPassed(array $methods): array
35+
{
36+
return self::merge(array_map(
37+
static fn (ExtendedMethodReflection $method) => $method->getPureUnlessParameterPassedParameters(),
38+
$methods,
39+
));
40+
}
41+
42+
/**
43+
* @param array<array<string, TrinaryLogic>> $maps
44+
* @return array<string, TrinaryLogic>
45+
*/
46+
private static function merge(array $maps): array
47+
{
48+
$parameterNames = [];
49+
foreach ($maps as $map) {
50+
foreach (array_keys($map) as $name) {
51+
$parameterNames[$name] = true;
52+
}
53+
}
54+
55+
$merged = [];
56+
foreach (array_keys($parameterNames) as $name) {
57+
$value = null;
58+
foreach ($maps as $map) {
59+
$current = $map[$name] ?? TrinaryLogic::createNo();
60+
if ($value === null) {
61+
$value = $current;
62+
continue;
63+
}
64+
$value = $value->equals($current) ? $value : TrinaryLogic::createMaybe();
65+
}
66+
67+
if ($value === null) {
68+
continue;
69+
}
70+
71+
$merged[$name] = $value;
72+
}
73+
74+
return $merged;
75+
}
76+
77+
}

src/Reflection/Type/MergedPureUnlessCallableIsImpureParameters.php

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/Reflection/Type/MergedPureUnlessParameterPassedParameters.php

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/Reflection/Type/UnionTypeMethodReflection.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,12 @@ public function isPure(): TrinaryLogic
173173

174174
public function getPureUnlessCallableIsImpureParameters(): array
175175
{
176-
return MergedPureUnlessCallableIsImpureParameters::merge($this->methods);
176+
return MergedConditionalPurityParameters::mergePureUnlessCallableIsImpure($this->methods);
177177
}
178178

179179
public function getPureUnlessParameterPassedParameters(): array
180180
{
181-
return MergedPureUnlessParameterPassedParameters::merge($this->methods);
181+
return MergedConditionalPurityParameters::mergePureUnlessParameterPassed($this->methods);
182182
}
183183

184184
public function getDocComment(): ?string

0 commit comments

Comments
 (0)