|
17 | 17 | use PHPStan\Php\PhpVersion;
|
18 | 18 | use PHPStan\PhpDoc\PhpDocInheritanceResolver;
|
19 | 19 | use PHPStan\PhpDoc\StubPhpDocProvider;
|
| 20 | +use PHPStan\PhpDoc\TypeStringResolver; |
20 | 21 | use PHPStan\Reflection\AttributeReflectionFactory;
|
21 | 22 | use PHPStan\Reflection\Deprecation\DeprecationProvider;
|
22 | 23 | use PHPStan\Reflection\InitializerExprTypeResolver;
|
|
28 | 29 | use PHPStan\Type\ConstantScalarType;
|
29 | 30 | use PHPStan\Type\FileTypeMapper;
|
30 | 31 | use PHPStan\Type\Type;
|
| 32 | +use PHPStan\Type\TypeCombinator; |
31 | 33 | use PHPStan\Type\VerbosityLevel;
|
32 | 34 | use Symfony\Component\Finder\Finder;
|
33 | 35 | use function array_map;
|
@@ -203,12 +205,13 @@ public static function gatherAssertTypes(string $file): array
|
203 | 205 |
|
204 | 206 | $relativePathHelper = new SystemAgnosticSimpleRelativePathHelper($fileHelper);
|
205 | 207 | $reflectionProvider = self::getContainer()->getByType(ReflectionProvider::class);
|
| 208 | + $typeStringResolver = self::getContainer()->getByType(TypeStringResolver::class); |
206 | 209 |
|
207 | 210 | $file = $fileHelper->normalizePath($file);
|
208 | 211 |
|
209 | 212 | $asserts = [];
|
210 | 213 | $delayedErrors = [];
|
211 |
| - self::processFile($file, static function (Node $node, Scope $scope) use (&$asserts, &$delayedErrors, $file, $relativePathHelper, $reflectionProvider): void { |
| 214 | + self::processFile($file, static function (Node $node, Scope $scope) use (&$asserts, &$delayedErrors, $file, $relativePathHelper, $reflectionProvider, $typeStringResolver): void { |
212 | 215 | if ($node instanceof InClassNode) {
|
213 | 216 | if (!$reflectionProvider->hasClass($node->getClassReflection()->getName())) {
|
214 | 217 | $delayedErrors[] = sprintf(
|
@@ -278,8 +281,16 @@ public static function gatherAssertTypes(string $file): array
|
278 | 281 | $node->getStartLine(),
|
279 | 282 | ));
|
280 | 283 | }
|
| 284 | + |
281 | 285 | $actualType = $scope->getType($node->getArgs()[1]->value);
|
282 |
| - $assert = ['superType', $file, $expectedType->getValue(), $actualType->describe(VerbosityLevel::precise()), $expectedType->isSuperTypeOf($actualType)->yes(), $node->getStartLine()]; |
| 286 | + $isCorrect = TypeCombinator::union( |
| 287 | + ...array_map( |
| 288 | + fn ($expectedTypeString) => $typeStringResolver->resolve($expectedTypeString->getValue()), |
| 289 | + $expectedType->getConstantStrings(), |
| 290 | + ), |
| 291 | + )->isSuperTypeOf($actualType)->yes(); |
| 292 | + |
| 293 | + $assert = ['superType', $file, $expectedType->getValue(), $actualType->describe(VerbosityLevel::precise()), $isCorrect, $node->getStartLine()]; |
283 | 294 | } elseif ($functionName === 'PHPStan\\Testing\\assertVariableCertainty') {
|
284 | 295 | $certainty = $node->getArgs()[0]->value;
|
285 | 296 | if (!$certainty instanceof StaticCall) {
|
|
0 commit comments