diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 8dab1c92..a8d27fd5 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -104,12 +104,6 @@ - - $inputFilter - - - InputFilterInterface - @@ -142,10 +136,6 @@ $value $value - - add - add - DeprecatedMethod DocblockTypeContradiction @@ -289,8 +279,14 @@ InputFilterPluginManager - Plu + get + + ? T1 : ($name is class-string ? T2 : InputInterface|InputFilterInterface))]]> + + + parent::get($name, $options) + $factories diff --git a/psalm.xml.dist b/psalm.xml.dist index 62def1af..22355666 100644 --- a/psalm.xml.dist +++ b/psalm.xml.dist @@ -22,6 +22,19 @@ + + + + + + + + + + + + + diff --git a/src/Factory.php b/src/Factory.php index 9769c531..41074718 100644 --- a/src/Factory.php +++ b/src/Factory.php @@ -12,6 +12,7 @@ use Laminas\Validator\ValidatorInterface; use Traversable; +use function assert; use function class_exists; use function get_debug_type; use function gettype; @@ -317,6 +318,7 @@ public function createInputFilter($inputFilterSpecification) } $inputFilter = $this->getInputFilterManager()->get($type); + assert($inputFilter instanceof InputFilterInterface); // As opposed to InputInterface if ($inputFilter instanceof CollectionInputFilter) { $inputFilter->setFactory($this); diff --git a/src/InputFilterPluginManager.php b/src/InputFilterPluginManager.php index 8f73026c..d7b38d20 100644 --- a/src/InputFilterPluginManager.php +++ b/src/InputFilterPluginManager.php @@ -26,7 +26,6 @@ * @psalm-import-type ServiceManagerConfiguration from ServiceManager * @template InstanceType of InputFilterInterface|InputInterface * @extends AbstractPluginManager - * @method InputFilterInterface|InputInterface get(string $name, ?array $options = null) */ class InputFilterPluginManager extends AbstractPluginManager { @@ -188,4 +187,18 @@ public function validatePlugin($plugin) throw new Exception\RuntimeException($e->getMessage(), $e->getCode(), $e); } } + + /** + * @inheritDoc + * phpcs:disable Generic.Files.LineLength.TooLong + * // Template constraint required or we get mixed added to output. Two templates because union does not work + * @template T1 of InputInterface + * @template T2 of InputFilterInterface + * @param class-string|class-string|string $name + * @return ($name is class-string ? T1 : ($name is class-string ? T2 : InputInterface|InputFilterInterface)) + */ + public function get($name, ?array $options = null) + { + return parent::get($name, $options); + } } diff --git a/test/StaticAnalysis/AddingInputsWithArraySpecs.php b/test/StaticAnalysis/AddingInputsWithArraySpecs.php index 53e701c8..bd03b298 100644 --- a/test/StaticAnalysis/AddingInputsWithArraySpecs.php +++ b/test/StaticAnalysis/AddingInputsWithArraySpecs.php @@ -10,7 +10,6 @@ /** * @extends InputFilter> - * @psalm-suppress UnusedClass */ final class AddingInputsWithArraySpecs extends InputFilter { diff --git a/test/StaticAnalysis/InputFilterPluginManagerType.php b/test/StaticAnalysis/InputFilterPluginManagerType.php new file mode 100644 index 00000000..30c9476b --- /dev/null +++ b/test/StaticAnalysis/InputFilterPluginManagerType.php @@ -0,0 +1,32 @@ +manager->get($anyString); + } + + public function getWithFQCNWillReturnTheObjectOfType(): InputFilterWithTemplatedValues + { + return $this->manager->get(InputFilterWithTemplatedValues::class); + } + + public function getInvalidFQCNReturnsFallbackType(): InputInterface|InputFilterInterface + { + return $this->manager->get(self::class); + } +} diff --git a/test/StaticAnalysis/InputFilterTemplateInfersFilterValueTypes.php b/test/StaticAnalysis/InputFilterTemplateInfersFilterValueTypes.php index bd33fc08..a3564710 100644 --- a/test/StaticAnalysis/InputFilterTemplateInfersFilterValueTypes.php +++ b/test/StaticAnalysis/InputFilterTemplateInfersFilterValueTypes.php @@ -8,7 +8,6 @@ use function count; use function reset; -/** @psalm-suppress UnusedClass */ final class InputFilterTemplateInfersFilterValueTypes { public function __construct(