Skip to content

Commit 811e419

Browse files
committed
ServiceDefinition: setup: prepends @self in depth
1 parent 1565d4f commit 811e419

File tree

3 files changed

+17
-8
lines changed

3 files changed

+17
-8
lines changed

src/DI/Definitions/ServiceDefinition.php

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,20 @@ public function complete(Nette\DI\Resolver $resolver): void
177177

178178
$this->creator = $resolver->completeStatement($this->creator);
179179

180-
foreach ($this->setup as &$setup) {
181-
if (
182-
is_string($setup->getEntity())
183-
&& strpbrk($setup->getEntity(), ':@?\\') === false
184-
) { // auto-prepend @self
185-
$setup = new Statement([new Reference(Reference::Self), $setup->getEntity()], $setup->arguments);
186-
}
180+
foreach ($this->setup as $i => $setup) {
181+
$this->setup[$i] = $resolver->completeStatement($this->prependSelf($setup), true);
182+
}
183+
}
187184

188-
$setup = $resolver->completeStatement($setup, true);
185+
186+
private function prependSelf(Statement $setup): Statement
187+
{
188+
if (is_string($member = $setup->getEntity()) && preg_match('~^\$?[a-z][a-zA-Z0-9[\]]*$~', $member)) {
189+
return new Statement([new Reference(Reference::Self), $member], $setup->arguments);
190+
} elseif (is_array($setup->getEntity()) && $setup->getEntity()[0] instanceof Statement) {
191+
return new Statement([$this->prependSelf($setup->getEntity()[0]), $setup->getEntity()[1]], $setup->arguments);
192+
} else {
193+
return $setup;
189194
}
190195
}
191196

tests/DI/Compiler.services.setup.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Lorem
2222
public function test(...$args)
2323
{
2424
Notes::add(__METHOD__ . ' ' . implode(' ', $args));
25+
return new self;
2526
}
2627
}
2728

@@ -79,6 +80,8 @@ Assert::same([
7980
'globtest 7',
8081
'Ipsum::test a',
8182
'Ipsum::test 10 b',
83+
'Lorem::test outer',
84+
'Lorem::test inner',
8285
], Notes::fetch());
8386

8487
Assert::same(8, $container->getService('lorem')->test);

tests/DI/files/compiler.services.setup.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ services:
3636
# rich
3737
- Ipsum(a)::test
3838
- Ipsum(b)::test(10)
39+
- test(outer)::test(inner)
3940

4041
# object
4142
- \Ipsum(@self)

0 commit comments

Comments
 (0)