Align language server spawning with arduino-cli

This commit is contained in:
Miro Spönemann
2020-01-14 15:11:00 +01:00
parent 2577451c15
commit 6618816330
3 changed files with 75 additions and 76 deletions

View File

@@ -1,9 +1,9 @@
import * as which from 'which';
import * as os from 'os';
import { join, delimiter } from 'path';
import { injectable } from 'inversify';
import { injectable, inject } from 'inversify';
import { ILogger } from '@theia/core';
import { BaseLanguageServerContribution, IConnection, LanguageServerStartOptions } from '@theia/languages/lib/node';
import { Board } from '../../common/protocol/boards-service';
import { getExecPath } from '../exec-util';
@injectable()
export class ArduinoLanguageServerContribution extends BaseLanguageServerContribution {
@@ -23,10 +23,13 @@ export class ArduinoLanguageServerContribution extends BaseLanguageServerContrib
return this.description.name;
}
@inject(ILogger)
protected logger: ILogger;
async start(clientConnection: IConnection, options: LanguageServerStartOptions): Promise<void> {
const languageServer = await this.resolveExecutable('arduino-language-server');
const clangd = await this.resolveExecutable('clangd');
const cli = await this.resolveExecutable('arduino-cli');
const languageServer = await getExecPath('arduino-language-server', this.logger);
const clangd = await getExecPath('clangd', this.logger, '--version', os.platform() !== 'win32');
const cli = await getExecPath('arduino-cli', this.logger, 'version');
// Add '-log' argument to enable logging to files
const args: string[] = ['-clangd', clangd, '-cli', cli];
if (options.parameters && options.parameters.selectedBoard) {
@@ -45,21 +48,4 @@ export class ArduinoLanguageServerContribution extends BaseLanguageServerContrib
serverConnection.onClose(() => (clientConnection as any).reader.socket.close());
}
protected resolveExecutable(name: string): Promise<string> {
return new Promise<string>((resolve, reject) => {
const segments = ['..', '..', '..', 'build'];
if (name === 'clangd' && os.platform() !== 'win32') {
segments.push('bin');
}
const path = `${process.env.PATH}${delimiter}${join(__dirname, ...segments)}`;
const suffix = os.platform() === 'win32' ? '.exe' : '';
which(name + suffix, { path }, (err, execPath) => {
if (err) {
reject(err);
} else {
resolve(execPath);
}
});
});
}
}