Skip to content

Commit dd80af1

Browse files
committed
Fix client crash when file open without workspace
1 parent 3436473 commit dd80af1

File tree

5 files changed

+201
-213
lines changed

5 files changed

+201
-213
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## [0.3.1] - 2020-04-05
4+
- Fix client crashing when open file without workspace
5+
36
## [0.3.0] - 2020-01-26
47
- Added automatic updates of language server
58
- Added `entarch` snipped for Entity + Architecture

client/package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/src/extension.ts

Lines changed: 51 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import util = require('util');
1616
import * as lockfile from 'proper-lockfile';
1717
import AbortController from 'abort-controller';
1818
const exec = util.promisify(require('child_process').exec);
19+
const output = vscode.window.createOutputChannel('VHDL LS Client');
1920

2021
import {
2122
LanguageClient,
@@ -43,14 +44,18 @@ export async function activate(ctx: ExtensionContext) {
4344
const languageServerDir = ctx.asAbsolutePath(
4445
path.join('server', 'vhdl_ls')
4546
);
47+
output.appendLine(
48+
'Checking for language server executable in ' + languageServerDir
49+
);
4650
let languageServerVersion = embeddedVersion(languageServerDir);
4751
if (languageServerVersion == '0.0.0') {
48-
console.log('No language server installed');
49-
window.showInformationMessage('Downloading language server');
52+
output.appendLine('No language server installed');
53+
window.showInformationMessage('Downloading language server...');
5054
await getLatestLanguageServer(60000, ctx);
5155
languageServerVersion = embeddedVersion(languageServerDir);
56+
} else {
57+
output.appendLine('Found version ' + languageServerVersion);
5258
}
53-
console.log(languageServerVersion);
5459
languageServer = path.join(
5560
'server',
5661
'vhdl_ls',
@@ -61,51 +66,54 @@ export async function activate(ctx: ExtensionContext) {
6166
);
6267

6368
// Get language server configuration and command to start server
64-
let languageServerBinary = vscode.workspace
69+
70+
let workspace = vscode.workspace;
71+
let languageServerBinary = workspace
6572
.getConfiguration()
6673
.get('vhdlls.languageServer');
6774
let lsBinary = languageServerBinary as keyof typeof LanguageServerBinary;
6875
let serverOptions: ServerOptions;
6976
switch (lsBinary) {
7077
case 'embedded':
7178
serverOptions = getServerOptionsEmbedded(ctx);
72-
console.log('Using embedded language server');
79+
output.appendLine('Using embedded language server');
7380
break;
7481

7582
case 'user':
7683
serverOptions = getServerOptionsUser(ctx);
77-
console.log('Using user specified language server');
78-
console.log(serverOptions);
84+
output.appendLine('Using user specified language server');
7985
break;
8086

8187
case 'systemPath':
8288
serverOptions = getServerOptionsSystemPath();
83-
console.log('Running language server from path');
89+
output.appendLine('Running language server from path');
8490
break;
8591

8692
case 'docker':
8793
serverOptions = await getServerOptionsDocker();
88-
console.log('Using vhdl_ls from Docker Hub');
94+
output.appendLine('Using vhdl_ls from Docker Hub');
8995
break;
9096

9197
default:
9298
serverOptions = getServerOptionsEmbedded(ctx);
93-
console.log('Using embedded language server (default)');
99+
output.appendLine('Using embedded language server (default)');
94100
break;
95101
}
96102

97103
// Options to control the language client
98104
let clientOptions: LanguageClientOptions = {
99105
documentSelector: [{ scheme: 'file', language: 'vhdl' }],
100-
synchronize: {
106+
};
107+
if (workspace.workspaceFolders) {
108+
clientOptions.synchronize = {
101109
fileEvents: workspace.createFileSystemWatcher(
102110
path.join(
103-
vscode.workspace.workspaceFolders[0].uri.fsPath,
111+
workspace.workspaceFolders[0].uri.fsPath,
104112
'vhdl_ls.toml'
105113
)
106114
),
107-
},
108-
};
115+
};
116+
}
109117

110118
// Create the language client
111119
client = new LanguageClient(
@@ -123,7 +131,7 @@ export async function activate(ctx: ExtensionContext) {
123131
ctx.subscriptions.push(
124132
vscode.commands.registerCommand('vhdlls.restart', async () => {
125133
const MSG = 'Restarting VHDL LS';
126-
console.log(MSG);
134+
output.appendLine(MSG);
127135
window.showInformationMessage(MSG);
128136
await client.stop();
129137
languageServerDisposable.dispose();
@@ -132,23 +140,23 @@ export async function activate(ctx: ExtensionContext) {
132140
})
133141
);
134142

135-
console.log('Checking for updates');
143+
output.appendLine('Checking for updates...');
136144
lockfile
137145
.lock(ctx.asAbsolutePath('server'), {
138146
lockfilePath: ctx.asAbsolutePath(path.join('server', '.lock')),
139147
})
140148
.then((release: () => void) => {
141149
getLatestLanguageServer(60000, ctx)
142-
.catch(err => {
143-
console.log(err);
150+
.catch((err) => {
151+
output.appendLine(err);
144152
})
145153
.finally(() => {
146-
console.log('Language server update finished.');
154+
output.appendLine('Language server update finished.');
147155
return release();
148156
});
149157
});
150158

151-
console.log('Started');
159+
output.appendLine('Language server started');
152160
}
153161

154162
export function deactivate(): Thenable<void> | undefined {
@@ -166,7 +174,7 @@ function embeddedVersion(languageServerDir: string): string {
166174
if (semver.gt(dir, version)) {
167175
fs.remove(path.join(languageServerDir, version)).catch(
168176
(err: any) => {
169-
console.log(err);
177+
output.appendLine(err);
170178
}
171179
);
172180
return dir;
@@ -182,13 +190,12 @@ function embeddedVersion(languageServerDir: string): string {
182190
async function getServerOptionsDocker() {
183191
const image = 'kraigher/vhdl_ls:latest';
184192
let pullCmd = 'docker pull ' + image;
185-
console.log(`Pulling '${image}'`);
186-
console.log(pullCmd);
193+
output.appendLine(`Pulling '${image}'`);
194+
output.appendLine(pullCmd);
187195
const { stdout, stderr } = await exec(pullCmd);
188-
console.log(stdout);
189-
console.log(stderr);
196+
output.append(stdout);
197+
output.append(stderr);
190198

191-
console.log(vscode.workspace.workspaceFolders[0]);
192199
let wsPath = vscode.workspace.workspaceFolders[0].uri.fsPath;
193200
let mountPath = wsPath;
194201
if (isWindows) {
@@ -213,8 +220,6 @@ async function getServerOptionsDocker() {
213220
`${wsPath}:${mountPath}:ro`,
214221
image,
215222
];
216-
console.log(serverCommand);
217-
console.log(serverArgs);
218223
let serverOptions: ServerOptions = {
219224
run: {
220225
command: serverCommand,
@@ -298,34 +303,34 @@ async function getLatestLanguageServer(
298303
}
299304

300305
let latest = semver.valid(semver.coerce(latestRelease.data.name));
301-
console.log(`Current vhdl_ls version: ${current}`);
302-
console.log(`Latest vhdl_ls version: ${latest}`);
306+
output.appendLine(`Current vhdl_ls version: ${current}`);
307+
output.appendLine(`Latest vhdl_ls version: ${latest}`);
303308

304309
// Download new version if available
305310
if (semver.prerelease(latest)) {
306-
console.log('Latest is pre-release, skipping');
311+
output.appendLine('Latest version is pre-release, skipping');
307312
} else if (semver.lte(latest, current)) {
308-
console.log('Language server is already up-to-date');
313+
output.appendLine('Language server is up-to-date');
309314
} else {
310315
const languageServerAssetName = languageServerName + '.zip';
311316
let browser_download_url = latestRelease.data.assets.filter(
312-
asset => asset.name == languageServerAssetName
317+
(asset) => asset.name == languageServerAssetName
313318
)[0].browser_download_url;
314319
if (browser_download_url.length == 0) {
315320
throw new Error(
316321
`No asset with name ${languageServerAssetName} in release.`
317322
);
318323
}
319324

320-
console.log('Fetching ' + browser_download_url);
325+
output.appendLine('Fetching ' + browser_download_url);
321326
const abortController = new AbortController();
322327
const timeout = setTimeout(() => {
323328
abortController.abort();
324329
}, timeoutMs);
325330
let download = await fetch(browser_download_url, {
326331
signal: abortController.signal,
327-
}).catch(err => {
328-
console.log(err);
332+
}).catch((err) => {
333+
output.appendLine(err);
329334
throw new Error(
330335
`Language server download timed out after ${timeoutMs.toFixed(
331336
2
@@ -338,7 +343,7 @@ async function getLatestLanguageServer(
338343
const languageServerAsset = ctx.asAbsolutePath(
339344
path.join('server', 'install', latest, languageServerAssetName)
340345
);
341-
console.log(`Writing ${languageServerAsset}`);
346+
output.appendLine(`Writing ${languageServerAsset}`);
342347
if (!fs.existsSync(path.dirname(languageServerAsset))) {
343348
fs.mkdirSync(path.dirname(languageServerAsset), {
344349
recursive: true,
@@ -351,11 +356,11 @@ async function getLatestLanguageServer(
351356
});
352357
download.body.pipe(dest);
353358
dest.on('finish', () => {
354-
console.log('Server download complete');
359+
output.appendLine('Server download complete');
355360
resolve();
356361
});
357362
dest.on('error', (err: any) => {
358-
console.log('Server download error');
363+
output.appendLine('Server download error');
359364
reject(err);
360365
});
361366
});
@@ -364,25 +369,27 @@ async function getLatestLanguageServer(
364369
const targetDir = ctx.asAbsolutePath(
365370
path.join('server', 'vhdl_ls', latest)
366371
);
367-
console.log(`Extracting ${languageServerAsset} to ${targetDir}`);
372+
output.appendLine(
373+
`Extracting ${languageServerAsset} to ${targetDir}`
374+
);
368375
if (!fs.existsSync(targetDir)) {
369376
fs.mkdirSync(targetDir, { recursive: true });
370377
}
371-
extract(languageServerAsset, { dir: targetDir }, err => {
378+
extract(languageServerAsset, { dir: targetDir }, (err) => {
372379
try {
373380
fs.removeSync(
374381
ctx.asAbsolutePath(path.join('server', 'install'))
375382
);
376383
} catch {}
377384
if (err) {
378-
console.log('Error when extracting server');
379-
console.log(err);
385+
output.appendLine('Error when extracting server');
386+
output.appendLine(err);
380387
try {
381388
fs.removeSync(targetDir);
382389
} catch {}
383390
reject(err);
384391
} else {
385-
console.log('Server extracted');
392+
output.appendLine('Server extracted');
386393
resolve();
387394
}
388395
});

0 commit comments

Comments
 (0)