2016-10-08 12:59:08 +00:00
|
|
|
<?php
|
|
|
|
declare(strict_types = 1);
|
|
|
|
|
2016-10-09 14:03:56 +00:00
|
|
|
namespace LanguageServer\NodeVisitor;
|
2016-10-08 12:59:08 +00:00
|
|
|
|
|
|
|
use PhpParser\{NodeVisitorAbstract, Node};
|
2016-11-18 14:22:24 +00:00
|
|
|
use LanguageServer\{Definition, DefinitionResolver};
|
2016-10-20 00:08:23 +00:00
|
|
|
use LanguageServer\Protocol\SymbolInformation;
|
2016-10-08 12:59:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Collects definitions of classes, interfaces, traits, methods, properties and constants
|
|
|
|
* Depends on ReferencesAdder and NameResolver
|
|
|
|
*/
|
|
|
|
class DefinitionCollector extends NodeVisitorAbstract
|
|
|
|
{
|
|
|
|
/**
|
2016-11-18 14:22:24 +00:00
|
|
|
* Map from fully qualified name (FQN) to Definition
|
2016-10-08 12:59:08 +00:00
|
|
|
*
|
2016-11-18 14:22:24 +00:00
|
|
|
* @var Definition[]
|
2016-10-08 12:59:08 +00:00
|
|
|
*/
|
|
|
|
public $definitions = [];
|
|
|
|
|
2016-10-20 00:08:23 +00:00
|
|
|
/**
|
2016-11-18 14:22:24 +00:00
|
|
|
* Map from fully qualified name (FQN) to Node
|
2016-10-20 00:08:23 +00:00
|
|
|
*
|
2016-11-18 14:22:24 +00:00
|
|
|
* @var Node[]
|
2016-10-20 00:08:23 +00:00
|
|
|
*/
|
2016-11-18 14:22:24 +00:00
|
|
|
public $nodes = [];
|
|
|
|
|
|
|
|
private $definitionResolver;
|
|
|
|
|
|
|
|
public function __construct(DefinitionResolver $definitionResolver)
|
|
|
|
{
|
|
|
|
$this->definitionResolver = $definitionResolver;
|
|
|
|
}
|
2016-10-20 00:08:23 +00:00
|
|
|
|
2016-10-08 12:59:08 +00:00
|
|
|
public function enterNode(Node $node)
|
|
|
|
{
|
2016-11-18 14:22:24 +00:00
|
|
|
$fqn = DefinitionResolver::getDefinedFqn($node);
|
|
|
|
// Only index definitions with an FQN (no variables)
|
2016-10-20 00:08:23 +00:00
|
|
|
if ($fqn === null) {
|
|
|
|
return;
|
2016-10-08 12:59:08 +00:00
|
|
|
}
|
2016-11-18 14:22:24 +00:00
|
|
|
$this->nodes[$fqn] = $node;
|
|
|
|
$def = new Definition;
|
|
|
|
$def->fqn = $fqn;
|
|
|
|
$def->symbolInformation = SymbolInformation::fromNode($node, $fqn);
|
|
|
|
$def->type = $this->definitionResolver->getTypeFromNode($node);
|
|
|
|
$def->declarationLine = $this->definitionResolver->getDeclarationLineFromNode($node);
|
|
|
|
$def->documentation = $this->definitionResolver->getDocumentationFromNode($node);
|
|
|
|
|
|
|
|
$this->definitions[$fqn] = $def;
|
2016-10-08 12:59:08 +00:00
|
|
|
}
|
|
|
|
}
|