1
0
Fork 0
php-language-server/src/SignatureInformationFactory...

92 lines
2.5 KiB
PHP
Raw Normal View History

2017-12-10 05:10:43 +00:00
<?php
declare(strict_types = 1);
namespace LanguageServer;
use LanguageServer\Protocol\{SignatureInformation, ParameterInformation};
use Microsoft\PhpParser\FunctionLike;
class SignatureInformationFactory
{
/** @var DefinitionResolver */
private $definitionResolver;
/**
* Create a SignatureInformationFactory
*
* @param DefinitionResolver $definitionResolver
*/
public function __construct(DefinitionResolver $definitionResolver)
{
$this->definitionResolver = $definitionResolver;
}
/**
* Create a SignatureInformation from a FunctionLike node
*
* @param FunctionLike $node Node to create signature information from
*
* @return SignatureInformation
*/
public function create(FunctionLike $node): SignatureInformation
{
$params = $this->createParameters($node);
$label = $this->createLabel($params);
return new SignatureInformation(
$label,
$params,
$this->definitionResolver->getDocumentationFromNode($node)
);
}
/**
* Gets parameters from a FunctionLike node
*
* @param FunctionLike $node Node to get parameters from
*
* @return ParameterInformation[]
*/
private function createParameters(FunctionLike $node): array
{
$params = [];
if ($node->parameters) {
foreach ($node->parameters->getElements() as $element) {
$param = (string) $this->definitionResolver->getTypeFromNode($element);
$param .= ' ';
if ($element->dotDotDotToken) {
$param .= '...';
}
$param .= '$' . $element->getName();
if ($element->default) {
$param .= ' = ' . $element->default->getText();
}
$params[] = new ParameterInformation(
$param,
$this->definitionResolver->getDocumentationFromNode($element)
);
}
}
return $params;
}
/**
* Creates a signature information label from parameters
*
* @param ParameterInformation[] $params Parameters to create the label from
*
* @return string
*/
private function createLabel(array $params): string
{
$label = '(';
if ($params) {
foreach ($params as $param) {
$label .= $param->label . ', ';
}
$label = substr($label, 0, -2);
}
$label .= ')';
return $label;
}
}