Skip to content

Commit 59e8b6e

Browse files
committed
Move MockObjectTypeNodeResolverExtension to phpstan-phpunit extension
1 parent 02750c3 commit 59e8b6e

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

extension.neon

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ parameters:
66
- markTestSkipped
77

88
services:
9+
-
10+
class: PHPStan\PhpDoc\PHPUnit\MockObjectTypeNodeResolverExtension
11+
tags:
12+
- phpstan.phpDoc.typeNodeResolverExtension
913
-
1014
class: PHPStan\Type\PHPUnit\Assert\AssertFunctionTypeSpecifyingExtension
1115
tags:
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\PhpDoc\PHPUnit;
4+
5+
use PHPStan\PhpDoc\TypeNodeResolver;
6+
use PHPStan\PhpDoc\TypeNodeResolverAwareExtension;
7+
use PHPStan\PhpDoc\TypeNodeResolverExtension;
8+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
9+
use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
10+
use PHPStan\Type\Type;
11+
use PHPStan\Type\TypeWithClassName;
12+
13+
class MockObjectTypeNodeResolverExtension implements TypeNodeResolverExtension, TypeNodeResolverAwareExtension
14+
{
15+
16+
/** @var TypeNodeResolver */
17+
private $typeNodeResolver;
18+
19+
public function setTypeNodeResolver(TypeNodeResolver $typeNodeResolver): void
20+
{
21+
$this->typeNodeResolver = $typeNodeResolver;
22+
}
23+
24+
public function getCacheKey(): string
25+
{
26+
return 'phpunit-v1';
27+
}
28+
29+
public function resolve(TypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope): ?Type
30+
{
31+
if (!$typeNode instanceof UnionTypeNode) {
32+
return null;
33+
}
34+
35+
static $mockClassNames = [
36+
'PHPUnit_Framework_MockObject_MockObject' => true,
37+
'PHPUnit\Framework\MockObject\MockObject' => true,
38+
];
39+
40+
$types = $this->typeNodeResolver->resolveMultiple($typeNode->types, $nameScope);
41+
foreach ($types as $type) {
42+
if (!$type instanceof TypeWithClassName) {
43+
continue;
44+
}
45+
46+
if (array_key_exists($type->getClassName(), $mockClassNames)) {
47+
return \PHPStan\Type\TypeCombinator::intersect(...$types);
48+
}
49+
}
50+
51+
return null;
52+
}
53+
54+
}

0 commit comments

Comments
 (0)