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 Mar 23, 2023
1 parent 7ea5e20 commit e4325f5
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 182 deletions.
19 changes: 7 additions & 12 deletions src/DI/Extensions/InjectExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,24 +116,19 @@ public static function getInjectProperties(string $class): array
$res = [];
foreach ((new \ReflectionClass($class))->getProperties() as $rp) {
$name = $rp->getName();
$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()) {
trigger_error(sprintf('Property %s for injection must be public and non-static.', Reflection::toString($rp)), E_USER_WARNING);
continue;
}

if (PHP_VERSION_ID >= 80100 && $rp->isReadOnly()) {
} elseif (PHP_VERSION_ID >= 80100 && $rp->isReadOnly()) {
throw new Nette\InvalidStateException(sprintf('Property %s for injection must not be readonly.', 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);
} else {
$res[$name] = DI\Helpers::ensureClassType(Nette\Utils\Type::fromReflection($rp), 'type of property ' . Reflection::toString($rp));
}

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

Expand Down
16 changes: 6 additions & 10 deletions tests/DI/Container.inject.properties.phpt
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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.

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

This file was deleted.

102 changes: 29 additions & 73 deletions tests/DI/InjectExtension.getInjectProperties().phpt
Original file line number Diff line number Diff line change
Expand Up @@ -6,93 +6,49 @@

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(function () {
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
Original file line number Diff line number Diff line change
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 e4325f5

Please sign in to comment.