Skip to content

Commit b019256

Browse files
committed
CallableTypeHelper - fixed purity check
1 parent 520d057 commit b019256

File tree

4 files changed

+29
-7
lines changed

4 files changed

+29
-7
lines changed

Diff for: src/Type/CallableTypeHelper.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,11 @@ public static function isParametersAcceptorSuperTypeOf(
103103
$isReturnTypeSuperType = new AcceptsResult($ours->getReturnType()->isSuperTypeOf($theirReturnType), []);
104104
}
105105

106-
if ($ours->isPure()->yes()) {
106+
$pure = $ours->isPure();
107+
if ($pure->yes()) {
107108
$result = $result->and(new AcceptsResult($theirs->isPure(), []));
109+
} elseif ($pure->no()) {
110+
$result = $result->and(new AcceptsResult($theirs->isPure()->negate(), []));
108111
}
109112

110113
return $result->and($isReturnTypeSuperType);

Diff for: src/Type/UnionTypeHelper.php

+4
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ public static function sortTypes(array $types): array
109109
return self::compareStrings($a->describe(VerbosityLevel::value()), $b->describe(VerbosityLevel::value()));
110110
}
111111

112+
if ($a->isCallable()->yes() && $b->isCallable()->yes()) {
113+
return self::compareStrings($a->describe(VerbosityLevel::value()), $b->describe(VerbosityLevel::value()));
114+
}
115+
112116
return self::compareStrings($a->describe(VerbosityLevel::typeOnly()), $b->describe(VerbosityLevel::typeOnly()));
113117
});
114118
return $types;

Diff for: tests/PHPStan/Type/CallableTypeTest.php

+15
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,21 @@ public function dataAccepts(): array
382382
[
383383
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createNo()),
384384
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createYes()),
385+
TrinaryLogic::createNo(),
386+
],
387+
[
388+
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createMaybe()),
389+
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createYes()),
390+
TrinaryLogic::createYes(),
391+
],
392+
[
393+
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createMaybe()),
394+
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createNo()),
395+
TrinaryLogic::createYes(),
396+
],
397+
[
398+
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createMaybe()),
399+
new CallableType([], new VoidType(), false, null, null, [], TrinaryLogic::createMaybe()),
385400
TrinaryLogic::createYes(),
386401
],
387402
[

Diff for: tests/PHPStan/Type/TypeCombinatorTest.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -2555,8 +2555,8 @@ public function dataUnion(): iterable
25552555
]),
25562556
new ClosureType(),
25572557
],
2558-
ClosureType::class,
2559-
'Closure(): mixed', // different result might be okay too
2558+
UnionType::class,
2559+
'(Closure(): mixed)|(pure-Closure)',
25602560
];
25612561
yield [
25622562
[
@@ -2566,7 +2566,7 @@ public function dataUnion(): iterable
25662566
new ClosureType(),
25672567
],
25682568
ClosureType::class,
2569-
'Closure(): mixed', // different result might be okay too
2569+
'Closure(): mixed',
25702570
];
25712571
}
25722572

@@ -4239,8 +4239,8 @@ public function dataIntersect(): iterable
42394239
]),
42404240
new ClosureType(),
42414241
],
4242-
ClosureType::class,
4243-
'pure-Closure', // different result might be okay too
4242+
NeverType::class,
4243+
'*NEVER*=implicit',
42444244
];
42454245
yield [
42464246
[
@@ -4250,7 +4250,7 @@ public function dataIntersect(): iterable
42504250
new ClosureType(),
42514251
],
42524252
ClosureType::class,
4253-
'pure-Closure', // different result might be okay too
4253+
'pure-Closure',
42544254
];
42554255
}
42564256

0 commit comments

Comments
 (0)