Skip to content

Commit 075d574

Browse files
authored
Ensure Language Server can start without ICU (#5196)
For #5043
1 parent 14ffa65 commit 075d574

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed

news/1 Enhancements/5043.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Ensure `Language Server` can start without [ICU](http://site.icu-project.org/home).

src/client/activation/languageServer/activator.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export class LanguageServerExtensionActivator implements ILanguageServerActivato
5050
this.manager.dispose();
5151
}
5252
@traceDecorators.error('Failed to ensure language server is available')
53-
protected async ensureLanguageServerIsAvailable(resource: Resource) {
53+
public async ensureLanguageServerIsAvailable(resource: Resource) {
5454
const settings = this.configurationService.getSettings(resource);
5555
if (!settings.downloadLanguageServer) {
5656
return;
@@ -60,6 +60,15 @@ export class LanguageServerExtensionActivator implements ILanguageServerActivato
6060
const mscorlib = path.join(languageServerFolderPath, 'mscorlib.dll');
6161
if (!(await this.fs.fileExists(mscorlib))) {
6262
await this.lsDownloader.downloadLanguageServer(languageServerFolderPath, this.resource);
63+
await this.prepareLanguageServerForNoICU(languageServerFolderPath);
6364
}
6465
}
66+
public async prepareLanguageServerForNoICU(languageServerFolderPath: string): Promise<void> {
67+
const targetJsonFile = path.join(languageServerFolderPath, 'Microsoft.Python.LanguageServer.runtimeconfig.json');
68+
if (await this.fs.fileExists(targetJsonFile)) {
69+
return;
70+
}
71+
const json = { runtimeOptions: { configProperties: { 'System.Globalization.Invariant': true } } };
72+
await this.fs.writeFile(targetJsonFile, JSON.stringify(json));
73+
}
6574
}

src/test/activation/languageServer/activator.unit.test.ts

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { LanguageServerDownloader } from '../../../client/activation/languageSer
1111
import { LanguageServerFolderService } from '../../../client/activation/languageServer/languageServerFolderService';
1212
import { LanguageServerManager } from '../../../client/activation/languageServer/manager';
1313
import {
14-
ILanguageServerActivator,
1514
ILanguageServerDownloader,
1615
ILanguageServerFolderService,
1716
ILanguageServerManager
@@ -30,7 +29,7 @@ import { sleep } from '../../core';
3029
// tslint:disable:max-func-body-length
3130

3231
suite('Language Server - Activator', () => {
33-
let activator: ILanguageServerActivator;
32+
let activator: LanguageServerExtensionActivator;
3433
let workspaceService: IWorkspaceService;
3534
let manager: ILanguageServerManager;
3635
let fs: IFileSystem;
@@ -150,4 +149,59 @@ suite('Language Server - Activator', () => {
150149

151150
verify(manager.dispose()).once();
152151
});
152+
test('Download and check if ICU config exists', async () => {
153+
const languageServerFolder = 'Some folder name';
154+
const languageServerFolderPath = path.join(EXTENSION_ROOT_DIR, languageServerFolder);
155+
const mscorlib = path.join(languageServerFolderPath, 'mscorlib.dll');
156+
const targetJsonFile = path.join(languageServerFolderPath, 'Microsoft.Python.LanguageServer.runtimeconfig.json');
157+
158+
when(settings.downloadLanguageServer).thenReturn(true);
159+
when(lsFolderService.getLanguageServerFolderName(undefined)).thenResolve(languageServerFolder);
160+
when(fs.fileExists(mscorlib)).thenResolve(false);
161+
when(lsDownloader.downloadLanguageServer(languageServerFolderPath, undefined)).thenResolve();
162+
when(fs.fileExists(targetJsonFile)).thenResolve(false);
163+
164+
await activator.ensureLanguageServerIsAvailable(undefined);
165+
166+
verify(lsFolderService.getLanguageServerFolderName(undefined)).once();
167+
verify(lsDownloader.downloadLanguageServer(anything(), undefined)).once();
168+
verify(fs.fileExists(targetJsonFile)).once();
169+
});
170+
test('Do not download nor check if ICU config exists after downloading', async () => {
171+
const languageServerFolder = 'Some folder name';
172+
const languageServerFolderPath = path.join(EXTENSION_ROOT_DIR, languageServerFolder);
173+
const mscorlib = path.join(languageServerFolderPath, 'mscorlib.dll');
174+
const targetJsonFile = path.join(languageServerFolderPath, 'Microsoft.Python.LanguageServer.runtimeconfig.json');
175+
176+
when(settings.downloadLanguageServer).thenReturn(true);
177+
when(lsFolderService.getLanguageServerFolderName(undefined)).thenResolve(languageServerFolder);
178+
when(fs.fileExists(mscorlib)).thenResolve(true);
179+
180+
await activator.ensureLanguageServerIsAvailable(undefined);
181+
182+
verify(lsFolderService.getLanguageServerFolderName(undefined)).once();
183+
verify(lsDownloader.downloadLanguageServer(anything(), undefined)).never();
184+
verify(fs.fileExists(targetJsonFile)).never();
185+
});
186+
test('JSON file is created to ensure LS can start without ICU', async () => {
187+
const targetJsonFile = path.join('some folder', 'Microsoft.Python.LanguageServer.runtimeconfig.json');
188+
const contents = { runtimeOptions: { configProperties: { 'System.Globalization.Invariant': true } } };
189+
when(fs.fileExists(targetJsonFile)).thenResolve(false);
190+
when(fs.writeFile(targetJsonFile, JSON.stringify(contents))).thenResolve();
191+
192+
await activator.prepareLanguageServerForNoICU('some folder');
193+
194+
verify(fs.fileExists(targetJsonFile)).atLeast(1);
195+
verify(fs.writeFile(targetJsonFile, JSON.stringify(contents))).once();
196+
});
197+
test('JSON file is not created if it already exists', async () => {
198+
const targetJsonFile = path.join('some folder', 'Microsoft.Python.LanguageServer.runtimeconfig.json');
199+
const contents = { runtimeOptions: { configProperties: { 'System.Globalization.Invariant': true } } };
200+
when(fs.fileExists(targetJsonFile)).thenResolve(true);
201+
202+
await activator.prepareLanguageServerForNoICU('some folder');
203+
204+
verify(fs.fileExists(targetJsonFile)).atLeast(1);
205+
verify(fs.writeFile(targetJsonFile, JSON.stringify(contents))).never();
206+
});
153207
});

0 commit comments

Comments
 (0)