Skip to content

Commit e046593

Browse files
authored
Merge branch 'phpstan:2.2.x' into fix-sealed-class-match-exhaustiveness
2 parents 0b2a99f + 7e37026 commit e046593

157 files changed

Lines changed: 1627 additions & 439 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

conf/config.stubValidator.neon

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ parameters:
44
checkMissingTypehints: true
55
checkMissingCallableSignature: false
66
__validate: false
7+
reportMaybes: true
8+
reportStatic: true
9+
10+
extensions:
11+
stubValidatorRules: PHPStan\DependencyInjection\StubValidatorRuleServicesExtension
712

813
services:
914
-
@@ -19,6 +24,10 @@ services:
1924
nodeScopeResolverReflector:
2025
factory: @stubReflector
2126

27+
# overrides service from services.neon so that Reflector autowires to stubReflector
28+
originalBetterReflectionReflector!:
29+
factory: @stubReflector
30+
2231
# overrides service from services.neon
2332
reflectionProvider:
2433
factory: @stubBetterReflectionProvider

src/Analyser/ExprHandler/AssignHandler.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpParser\Node\Expr\Assign;
1111
use PhpParser\Node\Expr\AssignRef;
1212
use PhpParser\Node\Expr\ConstFetch;
13+
use PhpParser\Node\Expr\FuncCall;
1314
use PhpParser\Node\Expr\List_;
1415
use PhpParser\Node\Expr\MethodCall;
1516
use PhpParser\Node\Expr\PropertyFetch;
@@ -863,6 +864,7 @@ private function processSureTypesForConditionalExpressionsAfterAssign(Scope $sco
863864
} elseif (
864865
!$expr instanceof PropertyFetch
865866
&& !$expr instanceof ArrayDimFetch
867+
&& !$expr instanceof FuncCall
866868
) {
867869
continue;
868870
}
@@ -901,6 +903,7 @@ private function processSureNotTypesForConditionalExpressionsAfterAssign(Scope $
901903
} elseif (
902904
!$expr instanceof PropertyFetch
903905
&& !$expr instanceof ArrayDimFetch
906+
&& !$expr instanceof FuncCall
904907
) {
905908
continue;
906909
}

src/DependencyInjection/AutowiredAttributeServicesExtension.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PHPStan\DependencyInjection;
44

55
use Nette\DI\CompilerExtension;
6+
use Nette\DI\ContainerBuilder;
67
use Nette\DI\Definitions\Reference;
78
use Nette\DI\Definitions\ServiceDefinition;
89
use Nette\DI\Definitions\Statement;
@@ -63,7 +64,7 @@ public function loadConfiguration(): void
6364
$definition->setFactory(new Statement([new Reference(substr($ref, 1)), $method]));
6465
}
6566

66-
$this->processConstructorParameters($class->name, $definition, $constructorParameters);
67+
self::processConstructorParameters($builder, $class->name, $definition, $constructorParameters);
6768

6869
foreach (ValidateServiceTagsExtension::INTERFACE_TAG_MAPPING as $interface => $tag) {
6970
if (!$reflection->implementsInterface($interface)) {
@@ -86,7 +87,7 @@ public function loadConfiguration(): void
8687
$definition->setFactory(new Statement([new Reference(substr($ref, 1)), $method]));
8788
}
8889

89-
$this->processConstructorParameters($class->name, $definition, $constructorParameters);
90+
self::processConstructorParameters($builder, $class->name, $definition, $constructorParameters);
9091
}
9192

9293
foreach (Attributes::findTargetClasses(GenerateFactory::class) as $class) {
@@ -99,7 +100,7 @@ public function loadConfiguration(): void
99100
}
100101

101102
$resultDefinition = $definition->getResultDefinition();
102-
$this->processConstructorParameters($class->name, $resultDefinition, $constructorParameters);
103+
self::processConstructorParameters($builder, $class->name, $resultDefinition, $constructorParameters);
103104
}
104105

105106
/** @var stdClass&object{level: int|null} $config */
@@ -119,7 +120,7 @@ public function loadConfiguration(): void
119120
->setAutowired($class->name)
120121
->addTag(LazyRegistry::RULE_TAG);
121122

122-
$this->processConstructorParameters($class->name, $definition, $constructorParameters);
123+
self::processConstructorParameters($builder, $class->name, $definition, $constructorParameters);
123124
}
124125

125126
foreach (Attributes::findTargetClasses(RegisteredCollector::class) as $class) {
@@ -133,17 +134,16 @@ public function loadConfiguration(): void
133134
->setAutowired($class->name)
134135
->addTag(RegistryFactory::COLLECTOR_TAG);
135136

136-
$this->processConstructorParameters($class->name, $definition, $constructorParameters);
137+
self::processConstructorParameters($builder, $class->name, $definition, $constructorParameters);
137138
}
138139
}
139140

140141
/**
141142
* @param class-string $className
142143
* @param array<lowercase-string, non-empty-list<TargetMethodParameter<AutowiredParameter>>> $constructorParameters
143144
*/
144-
private function processConstructorParameters(string $className, ServiceDefinition $definition, array $constructorParameters): void
145+
public static function processConstructorParameters(ContainerBuilder $builder, string $className, ServiceDefinition $definition, array $constructorParameters): void
145146
{
146-
$builder = $this->getContainerBuilder();
147147
foreach ($constructorParameters[strtolower($className)] ?? [] as $autowiredParameter) {
148148
$ref = $autowiredParameter->attribute->ref;
149149
if ($ref === null) {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\DependencyInjection;
4+
5+
use Nette\DI\CompilerExtension;
6+
use olvlvl\ComposerAttributeCollector\Attributes;
7+
use Override;
8+
use PHPStan\PhpDoc\StubValidator;
9+
use function strcasecmp;
10+
use function strtolower;
11+
12+
final class StubValidatorRuleServicesExtension extends CompilerExtension
13+
{
14+
15+
#[Override]
16+
public function loadConfiguration(): void
17+
{
18+
require_once __DIR__ . '/../../vendor/attributes.php';
19+
$builder = $this->getContainerBuilder();
20+
21+
$autowiredParameters = Attributes::findTargetMethodParameters(AutowiredParameter::class);
22+
$constructorParameters = [];
23+
foreach ($autowiredParameters as $parameter) {
24+
if (strcasecmp($parameter->method, '__construct') !== 0) {
25+
continue;
26+
}
27+
$lowerClass = strtolower($parameter->class);
28+
$constructorParameters[$lowerClass] ??= [];
29+
$constructorParameters[$lowerClass][] = $parameter;
30+
}
31+
32+
foreach (Attributes::findTargetClasses(ValidatesStubFiles::class) as $class) {
33+
$definition = $builder->addDefinition(null)
34+
->setFactory($class->name)
35+
->setAutowired(false)
36+
->addTag(StubValidator::SERVICE_RULE_TAG);
37+
38+
AutowiredAttributeServicesExtension::processConstructorParameters($builder, $class->name, $definition, $constructorParameters);
39+
}
40+
}
41+
42+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\DependencyInjection;
4+
5+
use Attribute;
6+
7+
/**
8+
* Registers a rule in the PHPStan\PhpDoc\StubValidator
9+
*
10+
* See https://phpstan.org/user-guide/stub-files
11+
*
12+
* Works thanks to https://github.com/ondrejmirtes/composer-attribute-collector
13+
* and StubValidatorRuleServicesExtension (similar to AutowiredAttributeServicesExtension).
14+
*/
15+
#[Attribute(flags: Attribute::TARGET_CLASS)]
16+
final class ValidatesStubFiles
17+
{
18+
19+
}

0 commit comments

Comments
 (0)