critical((string)$e); }); @cli_set_process_title('PHP Language Server'); // If XDebug is enabled, restart without it $xdebugHandler = new XdebugHandler('PHPLS'); $xdebugHandler->setLogger($logger); $xdebugHandler->check(); unset($xdebugHandler); if (!empty($options['tcp'])) { // Connect to a TCP server $address = $options['tcp']; $server = function () use ($logger, $address) { /** @var ClientSocket $socket */ $socket = yield Amp\Socket\connect('tcp://' . $address); $ls = new LanguageServer( new ProtocolStreamReader($socket), new ProtocolStreamWriter($socket) ); yield $ls->getshutdownDeferred(); }; } else if (!empty($options['tcp-server'])) { // Run a TCP Server $address = $options['tcp-server']; $server = function () use ($logger, $address) { $server = Amp\Socket\listen('tcp://' . $address); $logger->debug("Server listening on $address"); while ($socket = yield $server->accept()) { /** @var ServerSocket $socket */ list($ip, $port) = \explode(':', $socket->getRemoteAddress()); $logger->debug("Accepted connection from {$ip}:{$port}." . PHP_EOL); Loop::run(function () use ($socket) { $ls = new LanguageServer( new ProtocolStreamReader($socket), new ProtocolStreamWriter($socket) ); yield $ls->getshutdownDeferred(); }); } }; } else { // Use STDIO $logger->debug('Listening on STDIN'); $inputStream = new ResourceInputStream(STDIN); $outputStream = new ResourceOutputStream(STDOUT); $ls = new LanguageServer( new ProtocolStreamReader($inputStream), new ProtocolStreamWriter($outputStream) ); $server = function () use ($ls) { yield $ls->getshutdownDeferred(); }; } Loop::run($server);