Skip to content

Commit fa448a2

Browse files
committed
fixed completers structure
Fixed completers structure Renamed Completer to CompleterFactory Added UseCompleter with Interfaces Fixed ClassNameCompleter to work with current Scope's uses Fixed ObjectCompleter specifications for collections
1 parent 567097f commit fa448a2

18 files changed

Lines changed: 263 additions & 143 deletions

src/Complete/CompleteEngine.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use Generator\IndexGenerator;
99
use Entity\Completion\Entry;
1010
use Entity\Completion\Context;
11-
use Complete\Completer\Completer;
11+
use Complete\Completer\CompleterFactory;
1212
use Complete\Resolver\ContextResolver;
1313
use Complete\Resolver\ScopeResolver;
1414
use Parser\Processor\IndexProcessor;
@@ -20,15 +20,15 @@ public function __construct(
2020
Parser $parser,
2121
IndexGenerator $generator,
2222
ContextResolver $contextResolver,
23-
Completer $completer,
23+
CompleterFactory $completer,
2424
IndexProcessor $indexProcessor,
2525
ScopeProcessor $scopeProcessor,
2626
LoggerInterface $logger
2727
){
2828
$this->parser = $parser;
2929
$this->generator = $generator;
3030
$this->contextResolver = $contextResolver;
31-
$this->completer = $completer;
31+
$this->completerFactory = $completer;
3232
$this->indexProcessor = $indexProcessor;
3333
$this->scopeProcessor = $scopeProcessor;
3434
$this->logger = $logger;
@@ -77,7 +77,11 @@ public function createCompletion(
7777
}
7878
protected function findEntries(Project $project, Scope $scope, $badLine, $column, $lines){
7979
$context = $this->contextResolver->getContext($badLine, $project->getIndex(), $scope);
80-
return $this->completer->getEntries($project, $context);
80+
$completer = $this->completerFactory->getCompleter($context);
81+
if($completer){
82+
return $completer->getEntries($project, $context);
83+
}
84+
return [];
8185
}
8286
/**
8387
* @TODO
@@ -150,7 +154,7 @@ private function isValidCache($file, $content){
150154
private $parser;
151155
private $generator;
152156
private $contextResolver;
153-
private $completer;
157+
private $completerFactory;
154158
private $indexProcessor;
155159
private $scopeProcessor;
156160
private $cachePool;

src/Complete/Completer/ClassNameCompleter.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
use Entity\Completion\Context;
77
use Entity\Completion\Entry;
88

9-
class ClassNameCompleter{
9+
class ClassNameCompleter implements CompleterInterface {
1010
public function getEntries(Project $project, Context $context){
1111
$entries = [];
1212
$postfix = trim($context->getData());
1313
foreach($project->getIndex()->getClasses() as $fqcn => $class){
1414
if(!empty($postfix) && strpos($fqcn, $postfix) === false){
1515
continue;
1616
}
17+
$fqcn = $context->getScope()->getUses()->findAlias($class->fqcn);
1718
$complete = str_replace($postfix, "", $fqcn);
1819
$entries[] = new Entry(
1920
$complete, '', '',

src/Complete/Completer/Completer.php

Lines changed: 0 additions & 53 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace Complete\Completer;
4+
5+
use Entity\Completion\Context;
6+
use Entity\Completion\Scope;
7+
use Entity\Project;
8+
9+
class CompleterFactory {
10+
public function __construct(
11+
ClassNameCompleter $classNameCompleter,
12+
InterfaceNameCompleter $interfaceNameCompleter,
13+
NamespaceCompleter $namespaceCompleter,
14+
ObjectCompleter $objectCompleter,
15+
UseCompleter $useCompleter
16+
){
17+
$this->classNameCompleter = $classNameCompleter;
18+
$this->interfaceNameCompleter = $interfaceNameCompleter;
19+
$this->namespaceCompleter = $namespaceCompleter;
20+
$this->objectCompleter = $objectCompleter;
21+
$this->useCompleter = $useCompleter;
22+
}
23+
public function getCompleter(Context $context){
24+
if($context->isNamespace()){
25+
return $this->namespaceCompleter;
26+
}
27+
elseif($context->isUse()){
28+
return $this->useCompleter;
29+
}
30+
elseif($context->isClassName()){
31+
return $this->classNameCompleter;
32+
}
33+
elseif($context->isInterfaceName()){
34+
return $this->interfaceNameCompleter;
35+
}
36+
elseif($context->isThis() || $context->isObject()){
37+
return $this->objectCompleter;
38+
}
39+
return null;
40+
}
41+
42+
private $classNameCompleter;
43+
private $interfaceNameCompleter;
44+
private $namespaceCompleter;
45+
private $objectCompleter;
46+
private $useCompleter;
47+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Complete\Completer;
4+
5+
use Entity\Project;
6+
use Entity\Completion\Context;
7+
8+
interface CompleterInterface {
9+
public function getEntries(Project $project, Context $context);
10+
}

src/Complete/Completer/InterfaceNameCompleter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Entity\Completion\Context;
77
use Entity\Completion\Entry;
88

9-
class InterfaceNameCompleter{
9+
class InterfaceNameCompleter implements CompleterInterface {
1010
public function getEntries(Project $project, Context $context){
1111
$entries = [];
1212
foreach($project->getIndex()->getInterfaces() as $interface){

src/Complete/Completer/NamespaceCompleter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Entity\Completion\Context;
77
use Entity\Completion\Entry;
88

9-
class NamespaceCompleter{
9+
class NamespaceCompleter implements CompleterInterface {
1010
public function getEntries(Project $project, Context $context){
1111
$entries = [];
1212
$postfix = trim($context->getData());

src/Complete/Completer/ObjectCompleter.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010
use Entity\Completion\Context;
1111
use Entity\Completion\Entry;
1212
use Entity\Completion\Scope;
13+
use Entity\Collection\Specification;
1314
use Psr\Log\LoggerInterface;
1415

1516
class ObjectCompleter {
1617
public function __construct(LoggerInterface $logger){
1718
$this->logger = $logger;
1819
}
1920
public function getEntries(Project $project, Context $context){
20-
$fqcn = $context->getData();
21+
/** @var FQCN $fqcn */
22+
list($fqcn, $isThis) = $context->getData();
2123
$this->logger->addDebug('creating entries');
2224
if(!($fqcn instanceof FQCN)){
2325
return [];
@@ -32,8 +34,9 @@ public function getEntries(Project $project, Context $context){
3234
return [];
3335
}
3436
$entries = [];
37+
$spec = new Specification($isThis ? 'private' : 'public');
3538
if($class->methods !== null){
36-
foreach($class->methods->all() AS $method){
39+
foreach($class->methods->all($spec) AS $method){
3740
$entry = $this->createEntryForMethod($method);
3841
$entries[] = $entry;
3942
}
@@ -42,7 +45,7 @@ public function getEntries(Project $project, Context $context){
4245
return $entries;
4346
}
4447
if($class->properties !== null){
45-
foreach($class->properties->all() AS $property){
48+
foreach($class->properties->all($spec) AS $property){
4649
$entries[] = $this->createEntryForProperty($property);
4750
}
4851
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Complete\Completer;
4+
5+
use Entity\Project;
6+
use Entity\Completion\Context;
7+
use Entity\Completion\Entry;
8+
9+
class UseCompleter implements CompleterInterface {
10+
public function getEntries(Project $project, Context $context){
11+
$entries = [];
12+
$postfix = trim($context->getData());
13+
$index = $project->getIndex();
14+
$fqcns = array_merge($index->getClasses(), $index->getInterfaces());
15+
foreach($fqcns as $fqcn => $class){
16+
if(!empty($postfix) && strpos($fqcn, $postfix) === false){
17+
continue;
18+
}
19+
$complete = str_replace($postfix, "", $fqcn);
20+
$entries[] = new Entry(
21+
$complete, '', '',
22+
$fqcn
23+
);
24+
}
25+
return $entries;
26+
}
27+
}

src/Complete/Resolver/ContextResolver.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Entity\Index;
99
use Parser\ErrorFreePhpParser;
1010
use Psr\Log\LoggerInterface;
11+
use PhpParser\Node\Expr\Variable;
1112

1213
class ContextResolver{
1314
public function __construct(
@@ -56,9 +57,10 @@ protected function createContext(Scope $scope, Token $token, $badLine, Index $in
5657
else {
5758
$workingNode = $nodes;
5859
}
59-
$context->setData(
60-
$this->typeResolver->getChainType($workingNode, $index, $scope)
61-
);
60+
$context->setData([
61+
$this->typeResolver->getChainType($workingNode, $index, $scope),
62+
$workingNode instanceof Variable && $workingNode->name === 'this'
63+
]);
6264
}
6365
if($token->isUseOperator()
6466
|| $token->isNamespaceOperator()
@@ -93,6 +95,7 @@ protected function prepareLine($badLine){
9395
){
9496
$badLine = '<?php ' . $badLine;
9597
}
98+
$badLine = str_replace(['elseif', 'else', 'catch'], '', $badLine);
9699
return $badLine;
97100
}
98101

0 commit comments

Comments
 (0)