forked from phpactor/language-server
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLanguageServerBuilder.php
More file actions
118 lines (105 loc) · 3.33 KB
/
LanguageServerBuilder.php
File metadata and controls
118 lines (105 loc) · 3.33 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
namespace Phpactor\LanguageServer;
use Amp\ByteStream\ResourceInputStream;
use Amp\ByteStream\ResourceOutputStream;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\InitializeParams;
use Phpactor\LanguageServer\Core\Dispatcher\DispatcherFactory;
use Phpactor\LanguageServer\Core\Server\Initializer\RequestInitializer;
use Phpactor\LanguageServer\Core\Server\ServerStats;
use Phpactor\LanguageServer\Core\Server\StreamProvider\ResourceStreamProvider;
use Phpactor\LanguageServer\Core\Server\StreamProvider\SocketStreamProvider;
use Phpactor\LanguageServer\Core\Server\Stream\ResourceDuplexStream;
use Phpactor\LanguageServer\Core\Server\LanguageServer;
use Phpactor\LanguageServer\Test\LanguageServerTester;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
final class LanguageServerBuilder
{
/**
* @var string|null
*/
private $tcpAddress = null;
/**
* @var ServerStats|null
*/
private $stats = null;
private function __construct(
private DispatcherFactory $dispatcherFactory,
private LoggerInterface $logger = new NullLogger(),
) {
}
/**
* Create a new instance of the builder \o/
*/
public static function create(
DispatcherFactory $dispatcherFactory,
LoggerInterface $logger = new NullLogger()
): self {
return new self(
$dispatcherFactory,
$logger
);
}
/**
* Start a TCP server on the given address.
*
* The TCP server can handle multiple connections/sessions, but must be
* started manually before clients can connect to it.
*
* The TCP server is valuable for development and for debugging as it echos
* the debug information to STDERR.
*
* Note that the default behavior is to start a STDIO server.
*/
public function tcpServer(?string $address = '0.0.0.0:0'): self
{
$this->tcpAddress = $address;
return $this;
}
/**
* Return a language server tester based on the current dispatcher.
*
* This is useful for integration testing scenarios.
*/
public function tester(
InitializeParams $params = new InitializeParams(new ClientCapabilities()),
): LanguageServerTester {
return new LanguageServerTester($this->dispatcherFactory, $params);
}
public function withServerStats(ServerStats $stats): self
{
$this->stats = $stats;
return $this;
}
/**
* Build the language server.
*
* The returned language server instance can then be started by calling
* start().
*/
public function build(): LanguageServer
{
if ($this->tcpAddress) {
$provider = new SocketStreamProvider(
\Amp\Socket\listen($this->tcpAddress),
$this->logger
);
} else {
$provider = new ResourceStreamProvider(
new ResourceDuplexStream(
new ResourceInputStream(STDIN),
new ResourceOutputStream(STDOUT)
),
$this->logger
);
}
return new LanguageServer(
$this->dispatcherFactory,
$this->logger,
$provider,
new RequestInitializer(),
$this->stats ?: new ServerStats()
);
}
}