Skip to content
Snippets Groups Projects
Commit a648b6b2 authored by Jan Kuchař's avatar Jan Kuchař
Browse files

AssertionUtil: better internal split

parent 39199799
Branches
Tags
No related merge requests found
...@@ -11,21 +11,29 @@ final class SignatureAssertionUtil ...@@ -11,21 +11,29 @@ final class SignatureAssertionUtil
{ {
} }
public static function checkSignature(callable $function, array $parameters, ?string $expectedReturnType): void public static function checkSignature(callable $function, array $parameters, ?string $expectedReturnType): void
{ {
$reflection = new \ReflectionFunction($function); $reflection = new \ReflectionFunction($function);
// NUMBER OF PARAMETERS CHECK: // NUMBER OF PARAMETERS CHECK:
self::checkParameters($parameters, $reflection);
// RETURN TYPE:
self::checkReturnType($expectedReturnType, $reflection);
}
// parameters:
private static function checkParameters(array $parameters, \ReflectionFunction $reflection): void
{
$numberOfParameters = $reflection->getNumberOfParameters(); $numberOfParameters = $reflection->getNumberOfParameters();
if($numberOfParameters !== count($parameters)) { if ($numberOfParameters !== count($parameters)) {
throw FunctionSignatureAssertionError::wrongNumberOrArguments($reflection, count($parameters), $numberOfParameters); throw FunctionSignatureAssertionError::wrongNumberOrArguments($reflection, count($parameters), $numberOfParameters);
} }
// PARAMETER TYPES CHECK: // PARAMETER TYPES CHECK:
$i = 0; $i = 0;
/** @var string[] $parameters */ /** @var string[] $parameters */
foreach($parameters AS $parameter) { foreach ($parameters AS $parameter) {
assert(is_string($parameter)); assert(is_string($parameter));
$parameterReflection = $reflection->getParameters()[$i++]; $parameterReflection = $reflection->getParameters()[$i++];
...@@ -37,46 +45,6 @@ final class SignatureAssertionUtil ...@@ -37,46 +45,6 @@ final class SignatureAssertionUtil
...self::parseType($parameter) ...self::parseType($parameter)
); );
} }
// RETURN TYPE:
if($expectedReturnType !== NULL) {
if(!$reflection->hasReturnType()) {
throw FunctionSignatureAssertionError::missingReturnType($reflection, $expectedReturnType);
}
if ($reflection->hasReturnType()) {
list($expectedReturnType, $expectingNullable) = self::parseType($expectedReturnType);
$returnTypeReflection = $reflection->getReturnType();
$actuallyNullable = $returnTypeReflection->allowsNull();
if ($expectingNullable !== $actuallyNullable) {
throw FunctionSignatureAssertionError::wrongReturnTypeNullability(
$reflection,
$expectingNullable,
$actuallyNullable
);
}
if ($expectedReturnType !== (string) $reflection->getReturnType()) {
throw FunctionSignatureAssertionError::wrongReturnType(
$reflection,
$expectedReturnType,
(string) $reflection->getReturnType()
);
}
}
}
}
private static function parseType(string $type): array
{
$cleanType = $type; // e.g. ?Namespace\Class
$nullable = FALSE;
if ($type[0] === '?') {
$nullable = TRUE;
$cleanType = substr($type, 1); // without leading '?'
}
return [$cleanType, $nullable];
} }
private static function checkFunctionParameter( private static function checkFunctionParameter(
...@@ -109,4 +77,48 @@ final class SignatureAssertionUtil ...@@ -109,4 +77,48 @@ final class SignatureAssertionUtil
} }
} }
// Return-type:
private static function checkReturnType(?string $expectedReturnType, \ReflectionFunction $reflection): void
{
if ($expectedReturnType === NULL) {
return;
}
if (!$reflection->hasReturnType()) {
throw FunctionSignatureAssertionError::missingReturnType($reflection, $expectedReturnType);
}
[$expectedReturnType, $expectingNullable] = self::parseType($expectedReturnType);
$returnTypeReflection = $reflection->getReturnType();
$actuallyNullable = $returnTypeReflection->allowsNull();
if ($expectingNullable !== $actuallyNullable) {
throw FunctionSignatureAssertionError::wrongReturnTypeNullability(
$reflection,
$expectingNullable,
$actuallyNullable
);
}
if ($expectedReturnType !== (string) $reflection->getReturnType()) {
throw FunctionSignatureAssertionError::wrongReturnType(
$reflection,
$expectedReturnType,
(string) $reflection->getReturnType()
);
}
}
// helpers:
private static function parseType(string $type): array
{
$cleanType = $type; // e.g. ?Namespace\Class
$nullable = FALSE;
if ($type[0] === '?') {
$nullable = TRUE;
$cleanType = substr($type, 1); // without leading '?'
}
return [$cleanType, $nullable];
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment