|
4 | 4 |
|
5 | 5 | use Symfony\Component\EventDispatcher\EventDispatcher; |
6 | 6 | use Complete\Resolver\NodeTypeResolver; |
7 | | -use Complete\Resolver\TypeResolveEvent; |
8 | | -use Entity\FQCN; |
9 | | -use PhpParser\Node\Arg; |
10 | | -use PhpParser\Node\Scalar\String_; |
| 7 | +use Complete\Completer\CompleterFactory; |
11 | 8 | use Parser\UseParser; |
12 | 9 |
|
13 | 10 | class Plugin |
14 | 11 | { |
15 | 12 | public function __construct( |
16 | 13 | EventDispatcher $dispatcher, |
17 | | - UseParser $useParser |
| 14 | + TypeResolver $resolver, |
| 15 | + Completer $completer |
18 | 16 | ) { |
19 | 17 | $this->dispatcher = $dispatcher; |
20 | | - $this->useParser = $useParser; |
| 18 | + $this->resolver = $resolver; |
| 19 | + $this->completer = $completer; |
21 | 20 | } |
22 | 21 |
|
23 | | - public function load() |
| 22 | + public function init() |
24 | 23 | { |
25 | | - if ($this->isLoaded) { |
26 | | - return; |
27 | | - } |
28 | | - $this->isLoaded = true; |
29 | | - $plugin = $this; |
30 | 24 | $this->dispatcher->addListener( |
31 | 25 | NodeTypeResolver::BLOCK_START, |
32 | | - function (TypeResolveEvent $e) use ($plugin) { |
33 | | - $plugin->parentType = $e->getType(); |
34 | | - } |
| 26 | + [$this->resolver, 'handleParentTypeEvent'] |
35 | 27 | ); |
36 | 28 | $this->dispatcher->addListener( |
37 | 29 | NodeTypeResolver::BLOCK_END, |
38 | | - function (TypeResolveEvent $e) use ($plugin) { |
39 | | - $parentType = $plugin->parentType; |
40 | | - if ($parentType instanceof FQCN |
41 | | - && $parentType->toString() === 'DI\\Container' |
42 | | - ) { |
43 | | - /** @var \Entity\Chain\MethodCall */ |
44 | | - $chain = $e->getChain(); |
45 | | - if ($chain->getType() === 'method' && count($chain->getArgs()) > 0) { |
46 | | - $firstArg = array_pop($chain->getArgs())->value; |
47 | | - if ($firstArg instanceof String_) { |
48 | | - $className = $firstArg->value; |
49 | | - $fqcn = $plugin->useParser->parseFQCN($className); |
50 | | - $e->setType($fqcn); |
51 | | - } |
52 | | - } |
53 | | - } |
54 | | - } |
| 30 | + [$this->resolver, 'handleTypeResolveEvent'] |
| 31 | + ); |
| 32 | + $this->dispatcher->addListener( |
| 33 | + CompleterFactory::CUSTOM_COMPLETER, |
| 34 | + [$this, 'handleCompleteEvent'] |
55 | 35 | ); |
56 | 36 | } |
57 | 37 |
|
58 | | - private $parentType; |
| 38 | + public function handleCompleteEvent($e) |
| 39 | + { |
| 40 | + $context = $e->context; |
| 41 | + if ($context->isMethodCall()) { |
| 42 | + $e->completer = $this->completer; |
| 43 | + } |
| 44 | + } |
| 45 | + |
| 46 | + /** @var Completer */ |
| 47 | + private $completer; |
| 48 | + /** @var TypeResolver */ |
| 49 | + private $resolver; |
59 | 50 | /** @var EventDispatcher */ |
60 | 51 | private $dispatcher; |
61 | | - private $useParser; |
62 | | - private $isLoaded = false; |
63 | 52 | } |
0 commit comments