diff --git a/lib/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletor.php b/lib/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletor.php index b5eeeb3d..94ee47ab 100644 --- a/lib/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletor.php +++ b/lib/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletor.php @@ -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 @@ -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), ] ); @@ -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; + } } diff --git a/lib/Bridge/WorseReflection/Formatter/InterfaceFormatter.php b/lib/Bridge/WorseReflection/Formatter/InterfaceFormatter.php new file mode 100644 index 00000000..acf85778 --- /dev/null +++ b/lib/Bridge/WorseReflection/Formatter/InterfaceFormatter.php @@ -0,0 +1,22 @@ +name(); + } +} diff --git a/tests/Integration/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletorTest.php b/tests/Integration/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletorTest.php index 05c99deb..8264764e 100644 --- a/tests/Integration/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletorTest.php +++ b/tests/Integration/Bridge/TolerantParser/WorseReflection/WorseDeclaredClassCompletorTest.php @@ -50,7 +50,23 @@ public function provideComplete(): Generator 'name' => 'Exception', 'short_description' => 'Exception(string $message = \'\', int $code = 0, Throwable $previous = NULL)', ] - ] + ], + ]; + + yield 'interfaces' => [ + <<<'EOT' + +EOT + , + [ + [ + 'type' => Suggestion::TYPE_INTERFACE, + 'name' => 'ArrayAccess', + 'short_description' => 'ArrayAccess', + ] + ], ]; } }