forked from felixfbecker/php-language-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSignatureInformationFactory.php
91 lines (84 loc) Β· 2.55 KB
/
SignatureInformationFactory.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
declare(strict_types = 1);
namespace LanguageServer;
use LanguageServerProtocol\{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;
}
}