Skip to content

Commit

Permalink
annotations @var 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 e7d98a2 commit a3818a1
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 181 deletions.
14 changes: 5 additions & 9 deletions src/DI/Extensions/InjectExtension.php
Expand Up @@ -112,19 +112,15 @@ public static function getInjectProperties(string $class): array
{
$res = [];
foreach ((new \ReflectionClass($class))->getProperties() as $rp) {
$hasAttr = $rp->getAttributes(DI\Attributes\Inject::class);
if ($hasAttr || DI\Helpers::parseAnnotation($rp, 'inject') !== null) {
if (
$rp->getAttributes(DI\Attributes\Inject::class)
|| DI\Helpers::parseAnnotation($rp, 'inject') !== null
) {
if (!$rp->isPublic() || $rp->isStatic() || $rp->isReadOnly()) {
throw new Nette\InvalidStateException(sprintf('Property %s for injection must not be static, readonly and must be public.', Reflection::toString($rp)));
}

$type = Nette\Utils\Type::fromReflection($rp);
if (!$type && !$hasAttr && ($annotation = DI\Helpers::parseAnnotation($rp, 'var'))) {
$annotation = Reflection::expandClassName($annotation, Reflection::getPropertyDeclaringClass($rp));
$type = Nette\Utils\Type::fromString($annotation);
}

$res[$rp->getName()] = DI\Helpers::ensureClassType($type, 'type of property ' . Reflection::toString($rp));
$res[$rp->getName()] = DI\Helpers::ensureClassType(Nette\Utils\Type::fromReflection($rp), 'type of property ' . Reflection::toString($rp));
}
}

Expand Down
16 changes: 6 additions & 10 deletions tests/DI/Container.inject.properties.phpt
Expand Up @@ -23,20 +23,17 @@ class Foo implements IFoo

class Test1
{
/** @inject @var stdClass */
public $varA;

/** @var stdClass @inject */
public $varB;
/** @inject */
public stdClass $varA;
}

class Test2 extends Test1
{
/** @var stdClass @inject */
public $varC;
/** @inject */
public stdClass $varC;

/** @var IFoo @inject */
public $varD;
/** @inject */
public IFoo $varD;
}


Expand All @@ -52,6 +49,5 @@ $container = createContainer($builder);
$test = new Test2;
$container->callInjects($test);
Assert::type(stdClass::class, $test->varA);
Assert::type(stdClass::class, $test->varB);
Assert::type(stdClass::class, $test->varC);
Assert::type(Foo::class, $test->varD);
12 changes: 6 additions & 6 deletions tests/DI/InjectExtension.basic.phpt
Expand Up @@ -31,8 +31,8 @@ class ConcreteDependencyB extends AbstractDependency

class ParentClass
{
/** @var stdClass @inject */
public $a;
/** @inject */
public stdClass $a;


public function injectA()
Expand All @@ -47,11 +47,11 @@ class ParentClass

class Service extends ParentClass
{
/** @var stdClass @inject */
public $c;
/** @inject */
public stdClass $c;

/** @var AbstractDependency @inject */
public $e;
/** @inject */
public AbstractDependency $e;


public function injectC()
Expand Down
8 changes: 4 additions & 4 deletions tests/DI/InjectExtension.errors.phpt
Expand Up @@ -16,15 +16,15 @@ require __DIR__ . '/../bootstrap.php';

class ServiceA
{
/** @var DateTimeImmutable @inject */
public $a;
/** @inject */
public DateTimeImmutable $a;
}


class ServiceB
{
/** @var Unknown @inject */
public $a;
/** @inject */
public Unknown $a;
}


Expand Down
39 changes: 0 additions & 39 deletions tests/DI/InjectExtension.getInjectProperties().php74.phpt

This file was deleted.

38 changes: 0 additions & 38 deletions tests/DI/InjectExtension.getInjectProperties().php80.phpt

This file was deleted.

104 changes: 31 additions & 73 deletions tests/DI/InjectExtension.getInjectProperties().phpt
Expand Up @@ -6,93 +6,51 @@

declare(strict_types=1);

namespace A
{
class AClass
{
/** @var AInjected @inject */
public $varA;
use Nette\DI\Attributes\Inject;
use Nette\DI\Extensions\InjectExtension;
use Tester\Assert;


/** @var B\BInjected @inject */
public $varB;
class AClass
{
/** @inject */
public AInjected $varA;

/** @var AInjected @inject */
public $varC;
/** @inject */
public BInjected $varB;

/** @var AInjected */
public $varD;
}
public $varD;

class AInjected
{
}
#[Inject]
public stdClass $varF;
}

namespace A\B
class BadClass
{
use A;

class BClass extends A\AClass
{
/** @var BInjected @inject */
public $varF;
}

class BInjected
{
}
/** @inject */
public AClass|stdClass $var;
}

namespace C
class AInjected
{
use A\AInjected;
use A\B;
use C\CInjected as CAlias;

class CClass
{
/** @var AInjected @inject */
public $var1;

/** @var B\BInjected @inject */
public $var2;

/** @var CAlias @inject */
public $var3;

/** @var CInjected @inject */
public $var4;
}

class CInjected
{
}
}

namespace {
use Nette\DI\Extensions\InjectExtension;
use Tester\Assert;
class BInjected
{
}

require __DIR__ . '/../bootstrap.php';

require __DIR__ . '/../bootstrap.php';

Assert::same([
'varA' => A\AInjected::class,
'varB' => A\B\BInjected::class,
'varC' => A\AInjected::class,
], InjectExtension::getInjectProperties(A\AClass::class));

Assert::same([
'varA' => A\AInjected::class,
'varB' => A\B\BInjected::class,
'varC' => A\AInjected::class,
'varF' => A\B\BInjected::class,
], InjectExtension::getInjectProperties(A\B\BClass::class));
Assert::same([
'varA' => AInjected::class,
'varB' => BInjected::class,
'varF' => stdClass::class,
], InjectExtension::getInjectProperties(AClass::class));

Assert::same([
'var1' => A\AInjected::class,
'var2' => A\B\BInjected::class,
'var3' => C\CInjected::class,
'var4' => C\CInjected::class,
], InjectExtension::getInjectProperties(C\CClass::class));
}
Assert::exception(
fn() => InjectExtension::getInjectProperties(BadClass::class),
Nette\InvalidStateException::class,
"Type of property BadClass::\$var is expected to not be nullable/built-in/complex, 'AClass|stdClass' given.",
);
4 changes: 2 additions & 2 deletions tests/DI/InjectExtension.getInjectProperties().traits.phpt
Expand Up @@ -19,8 +19,8 @@ namespace B

trait BTrait
{
/** @var AInjected @inject */
public $varA;
/** @inject */
public AInjected $varA;
}
}

Expand Down

0 comments on commit a3818a1

Please sign in to comment.