8000 Declared class completor by dantleech · Pull Request #20 · phpactor/completion · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository was archived by the owner on Mar 6, 2022. It is now read-only.

Declared class completor #20

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Phpactor\Completion\Core\Formatter\ObjectFormatter;
use Phpactor\Completion\Core\Suggestion;
use Phpactor\WorseReflection\Core\Exception\NotFound;
use Phpactor\WorseReflection\Core\Reflection\ReflectionClassLike;
use Phpactor\WorseReflection\Core\Reflector\ClassReflector;

class WorseDeclaredClassCompletor implements TolerantCompletor, TolerantQualifiable
Expand All @@ -37,22 +38,27 @@ public function __construct(ClassReflector $reflector, ObjectFormatter $formatte
*/
public function complete(Node $node, string $source, int $offset): Generator
{
$classes = get_declared_classes();
$classes = array_merge(
get_declared_classes(),
get_declared_interfaces()
);

$classes = array_filter($classes, function ($class) use ($node) {
$class = basename(str_replace('\\', '/', $class));
return 0 === strpos($class, $node->getText());
});

foreach ($classes as $class) {
try {
$reflectionClass = $this->reflector->reflectClass($class);
$reflectionClass = $this->reflector->reflectClassLike($class);
} catch (NotFound $e) {
continue;
}

yield Suggestion::createWithOptions(
$class,
$reflectionClass->name()->short(),
[
'type' => Suggestion::TYPE_CLASS,
'type' => $this->typeFor($reflectionClass),
'short_description' => $this->formatter->format($reflectionClass),
]
);
Expand All @@ -63,4 +69,17 @@ public function qualifier(): TolerantQualifier
{
return new ClassQualifier();
}

private function typeFor(ReflectionClassLike $reflectionClass)
{
if ($reflectionClass->isClass()) {
return Suggestion::TYPE_CLASS;
}

if ($reflectionClass->isInterface()) {
return Suggestion::TYPE_INTERFACE;
}

return Suggestion::TYPE_CLASS;
}
}
22 changes: 22 additions & 0 deletions lib/Bridge/WorseReflection/Formatter/InterfaceFormatter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Phpactor\Completion\Bridge\WorseReflection\Formatter;

use Phpactor\Completion\Core\Formatter\Formatter;
use Phpactor\Completion\Core\Formatter\ObjectFormatter;
use Phpactor\WorseReflection\Core\Reflection\ReflectionInterface;

class InterfaceFormatter implements Formatter
{
public function canFormat($object): bool
{
return $object instanceof ReflectionInterface;
}

public function format(ObjectFormatter $formatter, $class): string
{
assert($class instanceof ReflectionInterface);

return $class->name();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,23 @@ public function provideComplete(): Generator
'name' => 'Exception',
'short_description' => 'Exception(string $message = \'\', int $code = 0, Throwable $previous = NULL)',
]
]
],
];

yield 'interfaces' => [
<<<'EOT'
<?php

$class = new ArrayAccess<>
EOT
,
[
[
'type' => Suggestion::TYPE_INTERFACE,
'name' => 'ArrayAccess',
'short_description' => 'ArrayAccess',
]
],
];
}
}
0