From e3e80f6c9c246d13e41188d508f0f4afb631b9af Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Mon, 9 Sep 2024 09:44:49 +0200 Subject: [PATCH] Missing typehints should be consistently checked on level 6 --- conf/config.neon | 3 +++ src/PhpDoc/StubValidator.php | 4 ++-- src/Rules/Classes/MethodTagCheck.php | 5 +++++ src/Rules/Classes/MixinCheck.php | 5 +++++ src/Rules/Classes/PropertyTagCheck.php | 5 +++++ tests/PHPStan/Rules/Classes/MethodTagRuleTest.php | 1 + tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php | 1 + tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php | 1 + tests/PHPStan/Rules/Classes/MixinRuleTest.php | 1 + tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php | 1 + tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php | 1 + tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php | 1 + tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php | 1 + tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php | 1 + 14 files changed, 29 insertions(+), 2 deletions(-) diff --git a/conf/config.neon b/conf/config.neon index 6f18952254..05a71dbe97 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -919,17 +919,20 @@ services: class: PHPStan\Rules\Classes\MethodTagCheck arguments: checkClassCaseSensitivity: %checkClassCaseSensitivity% + checkMissingTypehints: %checkMissingTypehints% - class: PHPStan\Rules\Classes\MixinCheck arguments: checkClassCaseSensitivity: %checkClassCaseSensitivity% absentTypeChecks: %featureToggles.absentTypeChecks% + checkMissingTypehints: %checkMissingTypehints% - class: PHPStan\Rules\Classes\PropertyTagCheck arguments: checkClassCaseSensitivity: %checkClassCaseSensitivity% + checkMissingTypehints: %checkMissingTypehints% - class: PHPStan\Rules\Comparison\ConstantConditionRuleHelper diff --git a/src/PhpDoc/StubValidator.php b/src/PhpDoc/StubValidator.php index 43ecfdd0a5..ee4fcaa2a2 100644 --- a/src/PhpDoc/StubValidator.php +++ b/src/PhpDoc/StubValidator.php @@ -251,12 +251,12 @@ private function getRuleRegistry(Container $container): RuleRegistry if ((bool) $container->getParameter('featureToggles')['absentTypeChecks']) { $rules[] = new MissingMethodSelfOutTypeRule($missingTypehintCheck); - $methodTagCheck = new MethodTagCheck($reflectionProvider, $classNameCheck, $genericObjectTypeCheck, $missingTypehintCheck, $unresolvableTypeHelper, true); + $methodTagCheck = new MethodTagCheck($reflectionProvider, $classNameCheck, $genericObjectTypeCheck, $missingTypehintCheck, $unresolvableTypeHelper, true, true); $rules[] = new MethodTagRule($methodTagCheck); $rules[] = new MethodTagTraitRule($methodTagCheck, $reflectionProvider); $rules[] = new MethodTagTraitUseRule($methodTagCheck); - $propertyTagCheck = new PropertyTagCheck($reflectionProvider, $classNameCheck, $genericObjectTypeCheck, $missingTypehintCheck, $unresolvableTypeHelper, true); + $propertyTagCheck = new PropertyTagCheck($reflectionProvider, $classNameCheck, $genericObjectTypeCheck, $missingTypehintCheck, $unresolvableTypeHelper, true, true); $rules[] = new PropertyTagRule($propertyTagCheck); $rules[] = new PropertyTagTraitRule($propertyTagCheck, $reflectionProvider); $rules[] = new PropertyTagTraitUseRule($propertyTagCheck); diff --git a/src/Rules/Classes/MethodTagCheck.php b/src/Rules/Classes/MethodTagCheck.php index e8c44d416e..b37d373772 100644 --- a/src/Rules/Classes/MethodTagCheck.php +++ b/src/Rules/Classes/MethodTagCheck.php @@ -29,6 +29,7 @@ public function __construct( private MissingTypehintCheck $missingTypehintCheck, private UnresolvableTypeHelper $unresolvableTypeHelper, private bool $checkClassCaseSensitivity, + private bool $checkMissingTypehints, ) { } @@ -161,6 +162,10 @@ public function checkInTraitUseContext( */ private function checkMethodTypeInTraitDefinitionContext(ClassReflection $classReflection, string $methodName, string $description, Type $type): array { + if (!$this->checkMissingTypehints) { + return []; + } + $errors = []; foreach ($this->missingTypehintCheck->getNonGenericObjectTypesWithGenericClass($type) as [$innerName, $genericTypeNames]) { $errors[] = RuleErrorBuilder::message(sprintf( diff --git a/src/Rules/Classes/MixinCheck.php b/src/Rules/Classes/MixinCheck.php index ab6f5ccb00..a17ef3d200 100644 --- a/src/Rules/Classes/MixinCheck.php +++ b/src/Rules/Classes/MixinCheck.php @@ -28,6 +28,7 @@ public function __construct( private UnresolvableTypeHelper $unresolvableTypeHelper, private bool $checkClassCaseSensitivity, private bool $absentTypeChecks, + private bool $checkMissingTypehints, ) { } @@ -68,6 +69,10 @@ public function checkInTraitDefinitionContext(ClassReflection $classReflection): continue; } + if (!$this->checkMissingTypehints) { + continue; + } + foreach ($this->missingTypehintCheck->getIterableTypesWithMissingValueTypehint($type) as $iterableType) { $iterableTypeDescription = $iterableType->describe(VerbosityLevel::typeOnly()); $errors[] = RuleErrorBuilder::message(sprintf( diff --git a/src/Rules/Classes/PropertyTagCheck.php b/src/Rules/Classes/PropertyTagCheck.php index 788c252d47..e05c4c676b 100644 --- a/src/Rules/Classes/PropertyTagCheck.php +++ b/src/Rules/Classes/PropertyTagCheck.php @@ -31,6 +31,7 @@ public function __construct( private MissingTypehintCheck $missingTypehintCheck, private UnresolvableTypeHelper $unresolvableTypeHelper, private bool $checkClassCaseSensitivity, + private bool $checkMissingTypehints, ) { } @@ -141,6 +142,10 @@ private function getTypesAndTagName(PropertyTag $propertyTag): array */ private function checkPropertyTypeInTraitDefinitionContext(ClassReflection $classReflection, string $propertyName, string $tagName, Type $type): array { + if (!$this->checkMissingTypehints) { + return []; + } + $errors = []; foreach ($this->missingTypehintCheck->getNonGenericObjectTypesWithGenericClass($type) as [$innerName, $genericTypeNames]) { diff --git a/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php b/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php index 9ff4c1337a..7766e03bd8 100644 --- a/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php @@ -32,6 +32,7 @@ protected function getRule(): TRule new MissingTypehintCheck(true, true, true, true, []), new UnresolvableTypeHelper(), true, + true, ), ); } diff --git a/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php b/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php index a2c07386e2..74f70ca72d 100644 --- a/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php @@ -32,6 +32,7 @@ protected function getRule(): TRule new MissingTypehintCheck(true, true, true, true, []), new UnresolvableTypeHelper(), true, + true, ), $reflectionProvider, ); diff --git a/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php b/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php index 59c1cb6aab..7839c99123 100644 --- a/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php @@ -33,6 +33,7 @@ protected function getRule(): TRule new MissingTypehintCheck(true, true, true, true, []), new UnresolvableTypeHelper(), true, + true, ), ); } diff --git a/tests/PHPStan/Rules/Classes/MixinRuleTest.php b/tests/PHPStan/Rules/Classes/MixinRuleTest.php index acaf1974b0..b1a1bb39ca 100644 --- a/tests/PHPStan/Rules/Classes/MixinRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MixinRuleTest.php @@ -34,6 +34,7 @@ protected function getRule(): Rule new UnresolvableTypeHelper(), true, true, + true, ), ); } diff --git a/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php b/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php index f23e120458..a16f6ac23f 100644 --- a/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php @@ -33,6 +33,7 @@ protected function getRule(): Rule new UnresolvableTypeHelper(), true, true, + true, ), $reflectionProvider, ); diff --git a/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php b/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php index dbc7906da5..08d3bb1c02 100644 --- a/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php @@ -33,6 +33,7 @@ protected function getRule(): Rule new UnresolvableTypeHelper(), true, true, + true, ), ); } diff --git a/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php b/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php index b5718fb844..7b36d89e90 100644 --- a/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php +++ b/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php @@ -32,6 +32,7 @@ protected function getRule(): TRule new MissingTypehintCheck(true, true, true, true, []), new UnresolvableTypeHelper(), true, + true, ), ); } diff --git a/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php b/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php index 887cebd583..3e6ff6c953 100644 --- a/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php +++ b/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php @@ -32,6 +32,7 @@ protected function getRule(): TRule new MissingTypehintCheck(true, true, true, true, []), new UnresolvableTypeHelper(), true, + true, ), $reflectionProvider, ); diff --git a/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php b/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php index c19a36419a..76b4342abe 100644 --- a/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php +++ b/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php @@ -32,6 +32,7 @@ protected function getRule(): TRule new MissingTypehintCheck(true, true, true, true, []), new UnresolvableTypeHelper(), true, + true, ), ); }