Skip to content

Commit bbe8522

Browse files
committed
Only for bleeding edge
1 parent 8b926b1 commit bbe8522

File tree

4 files changed

+21
-6
lines changed

4 files changed

+21
-6
lines changed

src/Analyser/MutatingScope.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5083,14 +5083,11 @@ private function exactInstantiation(New_ $node, string $className): ?Type
50835083
$typeMap = $parametersAcceptor->getResolvedTemplateTypeMap();
50845084
foreach ($resolvedPhpDoc->getTemplateTags() as $tag) {
50855085
$templateType = $typeMap->getType($tag->getName());
5086-
$bound = $tag->getBound();
50875086
if ($templateType !== null) {
5088-
if ($templateType->isConstantValue()->yes() && (!$bound->isScalar()->yes() || $bound->describe(VerbosityLevel::precise()) === '(int|string)')) {
5089-
$templateType = $templateType->generalize(GeneralizePrecision::templateArgument());
5090-
}
50915087
$list[] = $templateType;
50925088
continue;
50935089
}
5090+
$bound = $tag->getBound();
50945091
if ($bound instanceof MixedType && $bound->isExplicitMixed()) {
50955092
$bound = new MixedType(false);
50965093
}

src/Reflection/ResolvedFunctionVariant.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Reflection;
44

5+
use PHPStan\DependencyInjection\BleedingEdgeToggle;
56
use PHPStan\Reflection\Php\DummyParameterWithPhpDocs;
67
use PHPStan\Type\ConditionalTypeForParameter;
78
use PHPStan\Type\ErrorType;
@@ -217,7 +218,7 @@ private function resolveResolvableTemplateTypes(Type $type, TemplateTypeVariance
217218
};
218219

219220
return TypeTraverser::map($type, function (Type $type, callable $traverse) use ($references, $objectCb): Type {
220-
if ($type instanceof GenericObjectType) {
221+
if (BleedingEdgeToggle::isBleedingEdge() && $type instanceof GenericObjectType) {
221222
return TypeTraverser::map($type, $objectCb);
222223
}
223224

src/Type/Generic/TemplateTypeTrait.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
namespace PHPStan\Type\Generic;
44

5+
use PHPStan\DependencyInjection\BleedingEdgeToggle;
56
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
67
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
78
use PHPStan\TrinaryLogic;
89
use PHPStan\Type\AcceptsResult;
10+
use PHPStan\Type\GeneralizePrecision;
911
use PHPStan\Type\IntersectionType;
1012
use PHPStan\Type\MixedType;
1113
use PHPStan\Type\NeverType;
@@ -264,6 +266,13 @@ public function inferTemplateTypes(Type $receivedType): TemplateTypeMap
264266
TemplateTypeVariance::createStatic(),
265267
));
266268
if ($resolvedBound->isSuperTypeOf($receivedType)->yes()) {
269+
if (!BleedingEdgeToggle::isBleedingEdge() && $this->shouldGeneralizeInferredType()) {
270+
$generalizedType = $receivedType->generalize(GeneralizePrecision::templateArgument());
271+
if ($resolvedBound->isSuperTypeOf($generalizedType)->yes()) {
272+
$receivedType = $generalizedType;
273+
}
274+
}
275+
267276
return (new TemplateTypeMap([
268277
$this->name => $receivedType,
269278
]))->union($map);

tests/PHPStan/Reflection/GenericParametersAcceptorResolverTest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
use function get_class;
2222
use function sprintf;
2323

24-
class GenericParametersAcceptorResolverTest extends PHPStanTestCase
24+
class GenericParametersAcceptorResolverTest extends PHPStanTestCase
2525
{
2626

2727
/**
@@ -427,6 +427,7 @@ public function dataResolve(): array
427427
*/
428428
public function testResolve(array $argTypes, ParametersAcceptor $parametersAcceptor, ParametersAcceptor $expectedResult): void
429429
{
430+
self::getContainer(); // to initialize bleeding edge
430431
$result = GenericParametersAcceptorResolver::resolve(
431432
$argTypes,
432433
$parametersAcceptor,
@@ -462,4 +463,11 @@ public function testResolve(array $argTypes, ParametersAcceptor $parametersAccep
462463
}
463464
}
464465

466+
public static function getAdditionalConfigFiles(): array
467+
{
468+
return [
469+
__DIR__ . '/../../../conf/bleedingEdge.neon',
470+
];
471+
}
472+
465473
}

0 commit comments

Comments
 (0)