From 04e0b3441647a894d73ba5bb36e45550b79de46f Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Tue, 5 May 2020 21:15:32 -0700 Subject: [PATCH 01/11] Fix path --- src/client/activation/node/languageClientFactory.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/activation/node/languageClientFactory.ts b/src/client/activation/node/languageClientFactory.ts index 8490c4910041..d607afdd5d31 100644 --- a/src/client/activation/node/languageClientFactory.ts +++ b/src/client/activation/node/languageClientFactory.ts @@ -20,7 +20,7 @@ export class NodeLanguageClientFactory implements ILanguageClientFactory { constructor( @inject(IFileSystem) private readonly fs: IFileSystem, @inject(ILanguageServerFolderService) private readonly languageServerFolderService: ILanguageServerFolderService - ) {} + ) { } public async createLanguageClient( resource: Resource, From 4477900742b0dea66a9c1219a8e16b5254f2f69d Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Thu, 18 Jun 2020 11:40:57 -0700 Subject: [PATCH 02/11] Actually fix settings --- src/client/testing/common/updateTestSettings.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/client/testing/common/updateTestSettings.ts b/src/client/testing/common/updateTestSettings.ts index 1f5c79faf32c..1a309a66c1b5 100644 --- a/src/client/testing/common/updateTestSettings.ts +++ b/src/client/testing/common/updateTestSettings.ts @@ -31,7 +31,7 @@ export class UpdateTestSettingService implements IExtensionActivationService { const filesToBeFixed = await this.getFilesToBeFixed(resource); await Promise.all(filesToBeFixed.map((file) => this.fixSettingInFile(file))); } - public getSettingsFiles(resource: Resource) { + public getSettingsFiles(resource: Resource): string[] { const settingsFiles: string[] = []; if (this.application.userSettingsFile) { settingsFiles.push(this.application.userSettingsFile); @@ -42,7 +42,7 @@ export class UpdateTestSettingService implements IExtensionActivationService { } return settingsFiles; } - public async getFilesToBeFixed(resource: Resource) { + public async getFilesToBeFixed(resource: Resource): Promise { const files = this.getSettingsFiles(resource); const result = await Promise.all( files.map(async (file) => { @@ -87,10 +87,11 @@ export class UpdateTestSettingService implements IExtensionActivationService { return fileContents; } - public async doesFileNeedToBeFixed(filePath: string) { + public async doesFileNeedToBeFixed(filePath: string): Promise { try { const contents = await this.fs.readFile(filePath); return ( + contents.indexOf('python.jediEnabled') > 0 || contents.indexOf('python.unitTest.') > 0 || contents.indexOf('.pyTest') > 0 || contents.indexOf('.pep8') > 0 From d0d50dedd938bb5380c1413c25b6150dc420a938 Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Thu, 18 Jun 2020 11:45:41 -0700 Subject: [PATCH 03/11] Add news --- news/2 Fixes/12429.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/2 Fixes/12429.md diff --git a/news/2 Fixes/12429.md b/news/2 Fixes/12429.md new file mode 100644 index 000000000000..4fea2a4f8f5c --- /dev/null +++ b/news/2 Fixes/12429.md @@ -0,0 +1 @@ +Fixed issue when `python.jediEnabled` setting was not removed and `python.languageServer` setting was not updated. From 03aa5f92820ac00a443d1b0cec174f8b0ad5e98c Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Thu, 18 Jun 2020 11:53:02 -0700 Subject: [PATCH 04/11] Add test --- .../diagnostics/checks/updateTestSettings.unit.test.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts b/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts index 819b27b9f8cb..c9a5bd704ee0 100644 --- a/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts +++ b/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts @@ -168,6 +168,12 @@ suite('Application Diagnostics - Check Test Settings', () => { assert.ok(!needsToBeFixed); verify(fs.readFile(__filename)).once(); }); + test('Verify `python.jediEnabled` is found in user settings', async () => { + when(fs.readFile(__filename)).thenResolve('"python.jediEnabled": false'); + const needsToBeFixed = await diagnosticService.doesFileNeedToBeFixed(__filename); + assert.ok(needsToBeFixed); + verify(fs.readFile(__filename)).once(); + }); [ { From e4a032f43211c9082e5ae4f0db96deee6160471f Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Thu, 18 Jun 2020 11:54:54 -0700 Subject: [PATCH 05/11] Format --- src/client/activation/node/languageClientFactory.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/activation/node/languageClientFactory.ts b/src/client/activation/node/languageClientFactory.ts index 8bd72f7d60b0..a8d9cbdab41d 100644 --- a/src/client/activation/node/languageClientFactory.ts +++ b/src/client/activation/node/languageClientFactory.ts @@ -20,7 +20,7 @@ export class NodeLanguageClientFactory implements ILanguageClientFactory { constructor( @inject(IFileSystem) private readonly fs: IFileSystem, @inject(ILanguageServerFolderService) private readonly languageServerFolderService: ILanguageServerFolderService - ) { } + ) {} public async createLanguageClient( resource: Resource, From 27eeec76f8519ed0beb45274db2cd9200bde1f26 Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Thu, 18 Jun 2020 16:29:44 -0700 Subject: [PATCH 06/11] Suppress 'jediEnabled' removal --- src/client/testing/common/updateTestSettings.ts | 13 +++---------- .../checks/updateTestSettings.unit.test.ts | 12 ++++++------ 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/client/testing/common/updateTestSettings.ts b/src/client/testing/common/updateTestSettings.ts index 1a309a66c1b5..b7b60aad8ad8 100644 --- a/src/client/testing/common/updateTestSettings.ts +++ b/src/client/testing/common/updateTestSettings.ts @@ -107,13 +107,13 @@ export class UpdateTestSettingService implements IExtensionActivationService { // - `true` or missing then set to `languageServer: Jedi`. // - `false` and `languageServer` is present, do nothing. // - `false` and `languageServer` is NOT present, set `languageServer` to `Microsoft`. - // `jediEnabled` is then removed. + // `jediEnabled` is NOT removed since JSONC parser may also remove comments. const jediEnabledPath = ['python.jediEnabled']; const languageServerPath = ['python.languageServer']; try { - let ast = parseTree(fileContent); - let jediEnabledNode = findNodeAtLocation(ast, jediEnabledPath); + const ast = parseTree(fileContent); + const jediEnabledNode = findNodeAtLocation(ast, jediEnabledPath); const jediEnabled = jediEnabledNode ? getNodeValue(jediEnabledNode) : true; const languageServerNode = findNodeAtLocation(ast, languageServerPath); const formattingOptions: FormattingOptions = { @@ -135,13 +135,6 @@ export class UpdateTestSettingService implements IExtensionActivationService { } fileContent = applyEdits(fileContent, edits); - // Remove jediEnabled - ast = parseTree(fileContent); - jediEnabledNode = findNodeAtLocation(ast, jediEnabledPath); - if (jediEnabledNode) { - edits = modify(fileContent, jediEnabledPath, undefined, { formattingOptions }); - fileContent = applyEdits(fileContent, edits); - } // tslint:disable-next-line:no-empty } catch {} return fileContent; diff --git a/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts b/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts index c9a5bd704ee0..d70dd05728ef 100644 --- a/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts +++ b/src/test/application/diagnostics/checks/updateTestSettings.unit.test.ts @@ -224,32 +224,32 @@ suite('Application Diagnostics - Check Test Settings', () => { { testTitle: 'jediEnabled: true, no languageServer setting', contents: '{ "python.jediEnabled": true }', - expectedContent: '{"python.languageServer": "Jedi"}' + expectedContent: '{ "python.jediEnabled": true, "python.languageServer": "Jedi"}' }, { testTitle: 'jediEnabled: true, languageServer setting present', contents: '{ "python.jediEnabled": true }', - expectedContent: '{"python.languageServer": "Jedi"}' + expectedContent: '{ "python.jediEnabled": true, "python.languageServer": "Jedi"}' }, { testTitle: 'jediEnabled: false, no languageServer setting', contents: '{ "python.jediEnabled": false }', - expectedContent: '{"python.languageServer": "Microsoft"}' + expectedContent: '{ "python.jediEnabled": false, "python.languageServer": "Microsoft"}' }, { testTitle: 'jediEnabled: false, languageServer is Microsoft', contents: '{ "python.jediEnabled": false, "python.languageServer": "Microsoft" }', - expectedContent: '{"python.languageServer": "Microsoft"}' + expectedContent: '{ "python.jediEnabled": false, "python.languageServer": "Microsoft"}' }, { testTitle: 'jediEnabled: false, languageServer is None', contents: '{ "python.jediEnabled": false, "python.languageServer": "None" }', - expectedContent: '{"python.languageServer": "None"}' + expectedContent: '{ "python.jediEnabled": false, "python.languageServer": "None"}' }, { testTitle: 'jediEnabled: false, languageServer is Jedi', contents: '{ "python.jediEnabled": false, "python.languageServer": "Jedi" }', - expectedContent: '{"python.languageServer": "Jedi"}' + expectedContent: '{ "python.jediEnabled": false, "python.languageServer": "Jedi"}' } ].forEach((item) => { test(item.testTitle, async () => { From 3ed655b7f239d923598226cbc7ae9461f98ae266 Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Fri, 26 Jun 2020 08:31:45 -0700 Subject: [PATCH 07/11] Drop survey first launch threshold --- src/client/languageServices/languageServerSurveyBanner.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/languageServices/languageServerSurveyBanner.ts b/src/client/languageServices/languageServerSurveyBanner.ts index 3d58991a6094..721b9d05d965 100644 --- a/src/client/languageServices/languageServerSurveyBanner.ts +++ b/src/client/languageServices/languageServerSurveyBanner.ts @@ -44,8 +44,8 @@ export class LanguageServerSurveyBanner implements IPythonExtensionBanner { @inject(IPersistentStateFactory) private persistentState: IPersistentStateFactory, @inject(IBrowserService) private browserService: IBrowserService, @inject(ILanguageServerFolderService) private lsService: ILanguageServerFolderService, - showAfterMinimumEventsCount: number = 100, - showBeforeMaximumEventsCount: number = 500 + showAfterMinimumEventsCount: number = 30, + showBeforeMaximumEventsCount: number = 200 ) { this.minCompletionsBeforeShow = showAfterMinimumEventsCount; this.maxCompletionsBeforeShow = showBeforeMaximumEventsCount; From 404ee783690324514d2855837844ffd71facfbea Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Mon, 29 Jun 2020 15:02:17 -0700 Subject: [PATCH 08/11] LS name --- package.json | 1 + .../activation/node/languageServerFolderService.ts | 9 +++------ src/client/activation/types.ts | 2 +- .../node/languageServerFolderService.unit.test.ts | 11 ++++------- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 84579ddb0091..3ba0d91b91bc 100644 --- a/package.json +++ b/package.json @@ -2248,6 +2248,7 @@ "enum": [ "Jedi", "Microsoft", + "Pylance", "None" ], "default": "Jedi", diff --git a/src/client/activation/node/languageServerFolderService.ts b/src/client/activation/node/languageServerFolderService.ts index f89d3f9a78ac..84c0a200e848 100644 --- a/src/client/activation/node/languageServerFolderService.ts +++ b/src/client/activation/node/languageServerFolderService.ts @@ -14,6 +14,8 @@ import { IServiceContainer } from '../../ioc/types'; import { LanguageServerFolderService } from '../common/languageServerFolderService'; import { FolderVersionPair, ILanguageServerFolderService, NodeLanguageServerFolder } from '../types'; +export const PylanceExtensionName = 'ms-python.vscode-pylance'; + class FallbackNodeLanguageServerFolderService extends LanguageServerFolderService { constructor(serviceContainer: IServiceContainer) { super(serviceContainer, NodeLanguageServerFolder); @@ -99,12 +101,7 @@ export class NodeLanguageServerFolderService implements ILanguageServerFolderSer return undefined; } - const extensionName = this.workspaceService.getConfiguration('python').get('lsExtensionName'); - if (!extensionName) { - return undefined; - } - - const extension = this.extensions.getExtension(extensionName); + const extension = this.extensions.getExtension(ExtensionName); if (!extension) { return undefined; } diff --git a/src/client/activation/types.ts b/src/client/activation/types.ts index 81bb69e5a244..b51ad0c42fbe 100644 --- a/src/client/activation/types.ts +++ b/src/client/activation/types.ts @@ -66,7 +66,7 @@ export interface IExtensionActivationService { export enum LanguageServerType { Jedi = 'Jedi', Microsoft = 'Microsoft', - Node = 'Node', + Node = 'Pylance', None = 'None' } diff --git a/src/test/activation/node/languageServerFolderService.unit.test.ts b/src/test/activation/node/languageServerFolderService.unit.test.ts index 0804c997ff2a..115bdecc7eda 100644 --- a/src/test/activation/node/languageServerFolderService.unit.test.ts +++ b/src/test/activation/node/languageServerFolderService.unit.test.ts @@ -9,7 +9,8 @@ import { Extension, Uri, WorkspaceConfiguration } from 'vscode'; import { ILanguageServerFolder, ILSExtensionApi, - NodeLanguageServerFolderService + NodeLanguageServerFolderService, + PylanceExtensionName } from '../../../client/activation/node/languageServerFolderService'; import { IWorkspaceService } from '../../../client/common/application/types'; import { IConfigurationService, IExtensions, IPythonSettings } from '../../../client/common/types'; @@ -19,7 +20,6 @@ import { IServiceContainer } from '../../../client/ioc/types'; suite('Node Language Server Folder Service', () => { const resource = Uri.parse('a'); - const extensionName = 'some.extension'; let serviceContainer: TypeMoq.IMock; let pythonSettings: TypeMoq.IMock; @@ -99,7 +99,6 @@ suite('Node Language Server Folder Service', () => { test('lsExtensionName is undefined', async () => { pythonSettings.setup((p) => p.downloadLanguageServer).returns(() => true); workspaceConfiguration.setup((wc) => wc.get('packageName')).returns(() => undefined); - workspaceConfiguration.setup((wc) => wc.get('lsExtensionName')).returns(() => undefined); const folderService = new TestService( serviceContainer.object, @@ -116,8 +115,7 @@ suite('Node Language Server Folder Service', () => { test('lsExtension not installed', async () => { pythonSettings.setup((p) => p.downloadLanguageServer).returns(() => true); workspaceConfiguration.setup((wc) => wc.get('packageName')).returns(() => undefined); - workspaceConfiguration.setup((wc) => wc.get('lsExtensionName')).returns(() => extensionName); - extensions.setup((e) => e.getExtension(extensionName)).returns(() => undefined); + extensions.setup((e) => e.getExtension(PylanceExtensionName)).returns(() => undefined); const folderService = new TestService( serviceContainer.object, @@ -150,8 +148,7 @@ suite('Node Language Server Folder Service', () => { extension.setup((e) => e.exports).returns(() => extensionApi); pythonSettings.setup((p) => p.downloadLanguageServer).returns(() => true); workspaceConfiguration.setup((wc) => wc.get('packageName')).returns(() => undefined); - workspaceConfiguration.setup((wc) => wc.get('lsExtensionName')).returns(() => extensionName); - extensions.setup((e) => e.getExtension(extensionName)).returns(() => extension.object); + extensions.setup((e) => e.getExtension(PylanceExtensionName)).returns(() => extension.object); folderService = new TestService( serviceContainer.object, configService.object, From 372c1a13d3ef688f2a3379cafe2a254dc3d54e4b Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Mon, 29 Jun 2020 15:08:06 -0700 Subject: [PATCH 09/11] Typo --- src/client/activation/node/languageServerFolderService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/activation/node/languageServerFolderService.ts b/src/client/activation/node/languageServerFolderService.ts index 84c0a200e848..44922a052970 100644 --- a/src/client/activation/node/languageServerFolderService.ts +++ b/src/client/activation/node/languageServerFolderService.ts @@ -101,7 +101,7 @@ export class NodeLanguageServerFolderService implements ILanguageServerFolderSer return undefined; } - const extension = this.extensions.getExtension(ExtensionName); + const extension = this.extensions.getExtension(PylanceExtensionName); if (!extension) { return undefined; } From 5db36aceb4f374f6f1cbf1c37ece17bf6b4dd360 Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Mon, 29 Jun 2020 15:17:34 -0700 Subject: [PATCH 10/11] Undo --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index b71969f49960..0395f3f5673b 100644 --- a/package.json +++ b/package.json @@ -2248,7 +2248,6 @@ "enum": [ "Jedi", "Microsoft", - "Pylance", "None" ], "default": "Jedi", From b9a7c13acb14ed582b52394215c7a9a7a1e36ba0 Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Mon, 29 Jun 2020 15:35:28 -0700 Subject: [PATCH 11/11] Change string --- src/client/activation/activationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/activation/activationService.ts b/src/client/activation/activationService.ts index cacc74ddd577..f825a5235dc5 100644 --- a/src/client/activation/activationService.ts +++ b/src/client/activation/activationService.ts @@ -287,7 +287,7 @@ export class LanguageServerExtensionActivationService outputLine = 'Starting Microsoft Python language server.'; break; case LanguageServerType.Node: - outputLine = 'Starting Node.js language server.'; + outputLine = 'Starting Pylance language server.'; break; case LanguageServerType.None: outputLine = 'Editor support is inactive since language server is set to None.';