Skip to content

Commit 7d0041d

Browse files
committed
refactored plugin
Added Completer Splitted Plugin to Plugin adn TypeResolver
1 parent 92747db commit 7d0041d

3 files changed

Lines changed: 116 additions & 35 deletions

File tree

Completer.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace Mkusher\PadawanDi;
4+
5+
use Complete\Completer\CompleterInterface;
6+
use Complete\Completer\ClassNameCompleter;
7+
use Entity\Completion\Entry;
8+
use Entity\Project;
9+
use Entity\Completion\Context;
10+
use Entity\FQCN;
11+
12+
class Completer implements CompleterInterface
13+
{
14+
public function __construct(ClassNameCompleter $completer)
15+
{
16+
$this->classNameCompleter = $completer;
17+
}
18+
public function getEntries(Project $project, Context $context)
19+
{
20+
list($type, $isThis, $types) = $context->getData();
21+
if (is_array($types)) {
22+
$fqcn = array_pop($types);
23+
if ($fqcn instanceof FQCN
24+
&& $fqcn->toString() === 'DI\\Container'
25+
) {
26+
return array_map(
27+
[$this, 'wrapEntry'],
28+
$this->classNameCompleter->getEntries($project, $context)
29+
);
30+
}
31+
}
32+
return [];
33+
}
34+
35+
public function wrapEntry($entry)
36+
{
37+
return new Entry(
38+
sprintf('"%s"', $entry->getName()),
39+
$entry->getSignature(),
40+
$entry->getDesc(),
41+
$entry->getMenu()
42+
);
43+
}
44+
45+
private $classNameCompleter;
46+
}

Plugin.php

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,49 @@
44

55
use Symfony\Component\EventDispatcher\EventDispatcher;
66
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;
118
use Parser\UseParser;
129

1310
class Plugin
1411
{
1512
public function __construct(
1613
EventDispatcher $dispatcher,
17-
UseParser $useParser
14+
TypeResolver $resolver,
15+
Completer $completer
1816
) {
1917
$this->dispatcher = $dispatcher;
20-
$this->useParser = $useParser;
18+
$this->resolver = $resolver;
19+
$this->completer = $completer;
2120
}
2221

23-
public function load()
22+
public function init()
2423
{
25-
if ($this->isLoaded) {
26-
return;
27-
}
28-
$this->isLoaded = true;
29-
$plugin = $this;
3024
$this->dispatcher->addListener(
3125
NodeTypeResolver::BLOCK_START,
32-
function (TypeResolveEvent $e) use ($plugin) {
33-
$plugin->parentType = $e->getType();
34-
}
26+
[$this->resolver, 'handleParentTypeEvent']
3527
);
3628
$this->dispatcher->addListener(
3729
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']
5535
);
5636
}
5737

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;
5950
/** @var EventDispatcher */
6051
private $dispatcher;
61-
private $useParser;
62-
private $isLoaded = false;
6352
}

TypeResolver.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace Mkusher\PadawanDi;
4+
5+
use Parser\UseParser;
6+
use Complete\Resolver\TypeResolveEvent;
7+
use Entity\FQCN;
8+
use PhpParser\Node\Arg;
9+
use PhpParser\Node\Scalar\String_;
10+
11+
class TypeResolver
12+
{
13+
public function __construct(
14+
UseParser $useParser
15+
) {
16+
$this->useParser = $useParser;
17+
}
18+
19+
public function handleParentTypeEvent(TypeResolveEvent $e)
20+
{
21+
$this->parentType = $e->getType();
22+
}
23+
24+
public function handleTypeResolveEvent(TypeResolveEvent $e)
25+
{
26+
$parentType = $this->parentType;
27+
if ($parentType instanceof FQCN
28+
&& $parentType->toString() === 'DI\\Container'
29+
) {
30+
/** @var \Entity\Chain\MethodCall */
31+
$chain = $e->getChain();
32+
if ($chain->getType() === 'method' && count($chain->getArgs()) > 0) {
33+
$firstArg = array_pop($chain->getArgs())->value;
34+
if ($firstArg instanceof String_) {
35+
$className = $firstArg->value;
36+
$fqcn = $this->useParser->parseFQCN($className);
37+
$e->setType($fqcn);
38+
}
39+
}
40+
}
41+
}
42+
43+
/** @var UseParser */
44+
private $useParser;
45+
private $parentType;
46+
}

0 commit comments

Comments
 (0)