Skip to content

Commit

Permalink
annotations @return are no longer supported (BC break)
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Apr 28, 2024
1 parent aed23d5 commit e7d98a2
Show file tree
Hide file tree
Showing 6 changed files with 4 additions and 271 deletions.
14 changes: 0 additions & 14 deletions src/DI/Helpers.php
Expand Up @@ -226,20 +226,6 @@ public static function parseAnnotation(\Reflector $ref, string $name): ?string
}


public static function getReturnTypeAnnotation(\ReflectionFunctionAbstract $func): ?Type
{
$type = preg_replace('#[|\s].*#', '', (string) self::parseAnnotation($func, 'return'));
if (!$type || $type === 'object' || $type === 'mixed') {
return null;
} elseif ($func instanceof \ReflectionMethod) {
$type = $type === '$this' ? 'static' : $type;
$type = Reflection::expandClassName($type, $func->getDeclaringClass());
}

return Type::fromString($type);
}


public static function ensureClassType(
?Type $type,
string $hint,
Expand Down
18 changes: 4 additions & 14 deletions src/DI/Resolver.php
Expand Up @@ -122,20 +122,10 @@ public function resolveEntityType(Statement $statement): ?string

$this->addDependency($reflection);

$type = Nette\Utils\Type::fromReflection($reflection) ?? ($annotation = Helpers::getReturnTypeAnnotation($reflection));
if ($type && !in_array($type->getSingleName(), ['object', 'mixed'], strict: true)) {
if (isset($annotation)) {
trigger_error('Annotation @return should be replaced with native return type at ' . Callback::toString($entity), E_USER_DEPRECATED);
}

return Helpers::ensureClassType(
$type,
sprintf('return type of %s()', Callback::toString($entity)),
allowNullable: true,
);
}

return null;
$type = Nette\Utils\Type::fromReflection($reflection);
return $type && !in_array($type->getSingleName(), ['object', 'mixed'], strict: true)
? Helpers::ensureClassType($type, sprintf('return type of %s()', Callback::toString($entity)), allowNullable: true)
: null;

} elseif ($entity instanceof Reference) { // alias or factory
return $this->resolveReferenceType($entity);
Expand Down
82 changes: 0 additions & 82 deletions tests/DI/ContainerBuilder.resolveTypes.next.phpt
Expand Up @@ -24,52 +24,24 @@ class Lorem

class Factory
{
/** @return Lorem */
public function createClassPhpDoc()
{
return [];
}


public function createClass(): Lorem
{
return [];
}


/** @return Lorem|null */
public function createNullableClassPhpDoc()
{
return [];
}


public function createNullableClass(): ?Lorem
{
return [];
}


/** @return array */
public function createScalarPhpDoc()
{
return [];
}


public function createScalar(): array
{
return [];
}


/** @return object */
public function createObjectPhpDoc()
{
return (object) null;
}


public function createObject(): object
{
return (object) null;
Expand All @@ -82,13 +54,6 @@ class Factory
}


/** @return mixed */
public function createMixedPhpDoc()
{
return (object) null;
}


public function createMixed(): mixed
{
return (object) null;
Expand All @@ -115,42 +80,20 @@ class Factory
require __DIR__ . '/../bootstrap.php';


Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createClassPhpDoc']), 'next']);
$container = @createContainer($builder); // @return is deprecated
});

Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createClass']), 'next']);
$container = createContainer($builder);
});

Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createNullableClassPhpDoc']), 'next']);
$container = @createContainer($builder); // @return is deprecated
});

Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createNullableClass']), 'next']);
$container = createContainer($builder);
});

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createScalarPhpDoc']), 'next']);
$container = @createContainer($builder); // @return is deprecated
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Return type of Factory::createScalarPhpDoc() is expected to not be built-in/complex, 'array' given.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand All @@ -159,14 +102,6 @@ Assert::exception(function () {
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Return type of Factory::createScalar() is expected to not be built-in/complex, 'array' given.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createObjectPhpDoc']), 'next']);
$container = createContainer($builder);
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand All @@ -183,14 +118,6 @@ Assert::exception(function () {
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createMixedPhpDoc']), 'next']);
$container = createContainer($builder);
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand All @@ -199,15 +126,6 @@ Assert::exception(function () {
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([new Statement([Factory::class, 'createGeneric']), 'next']);
$container = @createContainer($builder); // @return is deprecated
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Class 'T' not found.
Check the return type of Factory::createGeneric().");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand Down
82 changes: 0 additions & 82 deletions tests/DI/ContainerBuilder.resolveTypes.phpt
Expand Up @@ -15,52 +15,24 @@ use Tester\Assert;

class Factory
{
/** @return stdClass */
public function createClassPhpDoc()
{
return [];
}


public function createClass(): stdClass
{
return [];
}


/** @return stdClass|null */
public function createNullableClassPhpDoc()
{
return [];
}


public function createNullableClass(): ?stdClass
{
return [];
}


/** @return array */
public function createScalarPhpDoc()
{
return [];
}


public function createScalar(): array
{
return [];
}


/** @return object */
public function createObjectPhpDoc()
{
return (object) null;
}


public function createObject(): object
{
return (object) null;
Expand All @@ -73,13 +45,6 @@ class Factory
}


/** @return mixed */
public function createMixedPhpDoc()
{
return (object) null;
}


public function createMixed(): mixed
{
return (object) null;
Expand All @@ -106,42 +71,20 @@ class Factory
require __DIR__ . '/../bootstrap.php';


Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createClassPhpDoc']);
$container = @createContainer($builder); // @return is deprecated
});

Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createClass']);
$container = createContainer($builder);
});

Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createNullableClassPhpDoc']);
$container = @createContainer($builder); // @return is deprecated
});

Assert::noError(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createNullableClass']);
$container = createContainer($builder);
});

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createScalarPhpDoc']);
$container = @createContainer($builder); // @return is deprecated
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Return type of Factory::createScalarPhpDoc() is expected to not be built-in/complex, 'array' given.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand All @@ -150,14 +93,6 @@ Assert::exception(function () {
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Return type of Factory::createScalar() is expected to not be built-in/complex, 'array' given.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createObjectPhpDoc']);
$container = @createContainer($builder); // @return is deprecated
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand All @@ -174,14 +109,6 @@ Assert::exception(function () {
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createMixedPhpDoc']);
$container = @createContainer($builder); // @return is deprecated
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand All @@ -190,15 +117,6 @@ Assert::exception(function () {
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Unknown service type, specify it or declare return type of factory method.");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
->setCreator([Factory::class, 'createGeneric']);
$container = @createContainer($builder); // @return is deprecated
}, Nette\DI\ServiceCreationException::class, "[Service 'a']
Class 'T' not found.
Check the return type of Factory::createGeneric().");

Assert::exception(function () {
$builder = new DI\ContainerBuilder;
$builder->addDefinition('a')
Expand Down
30 changes: 0 additions & 30 deletions tests/DI/Helpers.getReturnType.phpt

This file was deleted.

0 comments on commit e7d98a2

Please sign in to comment.