1
0
mirror of https://github.com/danog/psalm.git synced 2025-01-22 05:41:20 +01:00

Fix #1024 - add support for filter_var

This commit is contained in:
Brown 2018-10-23 14:38:36 -04:00
parent d3cd81078f
commit 496018f84a
2 changed files with 110 additions and 0 deletions

View File

@ -518,6 +518,81 @@ class FunctionChecker extends FunctionLikeChecker
} }
break; break;
case 'filter_var':
if (isset($call_args[1]->value->inferredType)
&& $call_args[1]->value->inferredType->isSingleIntLiteral()
) {
$filter_type_type = $call_args[1]->value->inferredType->getSingleIntLiteral();
$filter_type = null;
switch ($filter_type_type->value) {
case \FILTER_VALIDATE_INT:
$filter_type = Type::getInt();
break;
case \FILTER_VALIDATE_FLOAT:
$filter_type = Type::getFloat();
break;
case \FILTER_VALIDATE_BOOLEAN:
$filter_type = Type::getBool();
break;
case \FILTER_VALIDATE_IP:
case \FILTER_VALIDATE_MAC:
case \FILTER_VALIDATE_REGEXP:
case \FILTER_VALIDATE_URL:
case \FILTER_VALIDATE_EMAIL:
case \FILTER_VALIDATE_DOMAIN:
$filter_type = Type::getString();
break;
}
$has_object_like = false;
if (isset($call_args[2]->value->inferredType) && $filter_type) {
foreach ($call_args[2]->value->inferredType->getTypes() as $atomic_type) {
if ($atomic_type instanceof Type\Atomic\ObjectLike) {
$has_object_like = true;
if (isset($atomic_type->properties['default'])) {
$filter_type = Type::combineUnionTypes(
$filter_type,
$atomic_type->properties['default']
);
} else {
$filter_type->addType(new Type\Atomic\TFalse);
}
if (isset($atomic_type->properties['flags'])
&& $atomic_type->properties['flags']->isSingleIntLiteral()
) {
$filter_flag_type =
$atomic_type->properties['flags']->getSingleIntLiteral();
if ($filter_type->hasBool()
&& $filter_flag_type->value === \FILTER_NULL_ON_FAILURE
) {
$filter_type->addType(new Type\Atomic\TNull);
}
}
} elseif ($atomic_type instanceof Type\Atomic\TLiteralInt) {
if ($filter_type->hasBool() && $atomic_type->value === \FILTER_NULL_ON_FAILURE) {
$filter_type->addType(new Type\Atomic\TNull);
}
}
}
}
if (!$has_object_like && $filter_type) {
$filter_type->addType(new Type\Atomic\TFalse);
}
return $filter_type ?: Type::getMixed();
}
} }
} }

View File

@ -982,6 +982,41 @@ class FunctionCallTest extends TestCase
'$d' => 'string', '$d' => 'string',
], ],
], ],
'filterVar' => [
'<?php
function filterInt(string $s) : int {
$filtered = filter_var($s, FILTER_VALIDATE_INT);
if ($filtered === false) {
return 0;
}
return $filtered;
}
function filterNullableInt(string $s) : ?int {
return filter_var($s, FILTER_VALIDATE_INT, ["default" => null]);
}
function filterIntWithDefault(string $s) : int {
return filter_var($s, FILTER_VALIDATE_INT, ["default" => 5]);
}
function filterBool(string $s) : bool {
return filter_var($s, FILTER_VALIDATE_BOOLEAN);
}
function filterNullableBool(string $s) : ?bool {
return filter_var($s, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
}
function filterNullableBoolWithFlagsArray(string $s) : ?bool {
return filter_var($s, FILTER_VALIDATE_BOOLEAN, ["flags" => FILTER_NULL_ON_FAILURE]);
}
function filterFloat(string $s) : float {
$filtered = filter_var($s, FILTER_VALIDATE_FLOAT);
if ($filtered === false) {
return 0.0;
}
return $filtered;
}
function filterFloatWithDefault(string $s) : float {
return filter_var($s, FILTER_VALIDATE_FLOAT, ["default" => 5.0]);
}',
],
]; ];
} }