From 081e03daf398470d55873bf8f7a1f6e50c1377df Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Fri, 30 Sep 2016 12:07:46 +0200 Subject: [PATCH] Upgrade language-server dep (#16) * Communicate over TCP socket on Windows * Update language-server dep --- composer.json | 2 +- src/extension.ts | 47 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/composer.json b/composer.json index 3153271..4a49d95 100644 --- a/composer.json +++ b/composer.json @@ -2,6 +2,6 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "felixfbecker/language-server": "^2.0" + "felixfbecker/language-server": "^2.3.0" } } diff --git a/src/extension.ts b/src/extension.ts index e8a6784..7150729 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -5,6 +5,7 @@ import { spawn, execFile, ChildProcess } from 'child_process'; import * as vscode from 'vscode'; import { LanguageClient, LanguageClientOptions, StreamInfo } from 'vscode-languageclient'; import * as semver from 'semver'; +import * as net from 'net'; export function activate(context: vscode.ExtensionContext) { @@ -32,18 +33,40 @@ export function activate(context: vscode.ExtensionContext) { return; } - const serverOptions = (): Promise => { - // The server is implemented in PHP - const serverPath = context.asAbsolutePath(path.join('vendor', 'felixfbecker', 'language-server', 'bin', 'php-language-server.php')); - const childProcess = spawn('php', [serverPath]); - childProcess.stderr.on('data', (chunk: Buffer) => { - console.error(chunk + ''); - }); - childProcess.stdout.on('data', (chunk: Buffer) => { - console.log(chunk + ''); - }); - return Promise.resolve(childProcess); - }; + const serverOptions = () => new Promise((resolve, reject) => { + function spawnServer(...args: string[]): ChildProcess { + // The server is implemented in PHP + const serverPath = context.asAbsolutePath(path.join('vendor', 'felixfbecker', 'language-server', 'bin', 'php-language-server.php')); + const childProcess = spawn('php', [serverPath, ...args]); + childProcess.stderr.on('data', (chunk: Buffer) => { + console.error(chunk + ''); + }); + childProcess.stdout.on('data', (chunk: Buffer) => { + console.log(chunk + ''); + }); + return childProcess; + } + if (process.platform === 'win32') { + // Use a TCP socket on Windows because of blocking STDIO + const server = net.createServer(socket => { + // 'connection' listener + console.log('PHP process connected'); + socket.on('end', () => { + console.log('PHP process disconnected'); + }); + server.close(); + resolve({ reader: socket, writer: socket }); + }); + // Listen on random port + server.listen(0, '127.0.0.1', () => { + const address = '127.0.0.1:' + server.address().port; + spawnServer('--tcp', address); + }); + } else { + // Use STDIO on Linux / Mac + resolve(spawnServer()); + } + }); // Options to control the language client let clientOptions: LanguageClientOptions = {