Skip to content

Commit

Permalink
Improve typing of filters that do not accept non-falsy strings
Browse files Browse the repository at this point in the history
  • Loading branch information
zonuexe committed Sep 18, 2023
1 parent af2dd51 commit b8d819c
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 11 deletions.
9 changes: 5 additions & 4 deletions src/Type/Php/FilterFunctionReturnTypeHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ private function getFilterTypeMap(): array
$floatType = new FloatType();
$intType = new IntegerType();
$stringType = new StringType();
$nonFalsyStringType = TypeCombinator::intersect($stringType, new AccessoryNonFalsyStringType());

$this->filterTypeMap = [
$this->getConstant('FILTER_UNSAFE_RAW') => $stringType,
Expand All @@ -196,13 +197,13 @@ private function getFilterTypeMap(): array
$this->getConstant('FILTER_SANITIZE_URL') => $stringType,
$this->getConstant('FILTER_VALIDATE_BOOLEAN') => $booleanType,
$this->getConstant('FILTER_VALIDATE_DOMAIN') => $stringType,
$this->getConstant('FILTER_VALIDATE_EMAIL') => $stringType,
$this->getConstant('FILTER_VALIDATE_EMAIL') => $nonFalsyStringType,
$this->getConstant('FILTER_VALIDATE_FLOAT') => $floatType,
$this->getConstant('FILTER_VALIDATE_INT') => $intType,
$this->getConstant('FILTER_VALIDATE_IP') => $stringType,
$this->getConstant('FILTER_VALIDATE_MAC') => $stringType,
$this->getConstant('FILTER_VALIDATE_IP') => $nonFalsyStringType,
$this->getConstant('FILTER_VALIDATE_MAC') => $nonFalsyStringType,
$this->getConstant('FILTER_VALIDATE_REGEXP') => $stringType,
$this->getConstant('FILTER_VALIDATE_URL') => $stringType,
$this->getConstant('FILTER_VALIDATE_URL') => $nonFalsyStringType,
];

if ($this->reflectionProvider->hasConstant(new Node\Name('FILTER_SANITIZE_MAGIC_QUOTES'), null)) {
Expand Down
4 changes: 3 additions & 1 deletion tests/PHPStan/Analyser/LegacyNodeScopeResolverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7462,11 +7462,13 @@ public function dataFilterVar(): Generator
'FILTER_SANITIZE_SPECIAL_CHARS',
'FILTER_SANITIZE_STRING',
'FILTER_SANITIZE_URL',
'FILTER_VALIDATE_REGEXP',
],
'non-falsy-string' => [
'FILTER_VALIDATE_EMAIL',
'FILTER_VALIDATE_IP',
'$filterIp',
'FILTER_VALIDATE_MAC',
'FILTER_VALIDATE_REGEXP',
'FILTER_VALIDATE_URL',
],
'int' => ['FILTER_VALIDATE_INT'],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,22 @@ public function run(string $str, int $int, int $positive_int, int $negative_int)
assertType('string|false', $return);

$return = filter_var($str, FILTER_VALIDATE_EMAIL);
assertType('non-empty-string|false', $return);
assertType('non-falsy-string|false', $return);

$return = filter_var($str, FILTER_VALIDATE_REGEXP);
assertType('non-empty-string|false', $return);

$return = filter_var($str, FILTER_VALIDATE_URL);
assertType('non-empty-string|false', $return);
assertType('non-falsy-string|false', $return);

$return = filter_var($str, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE);
assertType('non-empty-string|null', $return);
assertType('non-falsy-string|null', $return);

$return = filter_var($str, FILTER_VALIDATE_IP);
assertType('non-empty-string|false', $return);
assertType('non-falsy-string|false', $return);

$return = filter_var($str, FILTER_VALIDATE_MAC);
assertType('non-empty-string|false', $return);
assertType('non-falsy-string|false', $return);

$return = filter_var($str, FILTER_VALIDATE_DOMAIN);
assertType('non-empty-string|false', $return);
Expand Down Expand Up @@ -101,7 +101,7 @@ public function run(string $str, int $int, int $positive_int, int $negative_int)
assertType("''", $return);

$return = filter_var($str2, FILTER_VALIDATE_URL);
assertType('string|false', $return);
assertType('non-falsy-string|false', $return);

$return = filter_var('foo', FILTER_VALIDATE_INT);
assertType('false', $return);
Expand Down

0 comments on commit b8d819c

Please sign in to comment.