diff --git a/src/client/activation/activationService.ts b/src/client/activation/activationService.ts index 0d525499362d..3cc2d7f18b80 100644 --- a/src/client/activation/activationService.ts +++ b/src/client/activation/activationService.ts @@ -322,6 +322,12 @@ export class LanguageServerExtensionActivationService } } private async getKey(resource: Resource, interpreter?: PythonInterpreter): Promise { + const configurationService = this.serviceContainer.get(IConfigurationService); + const serverType = configurationService.getSettings(this.resource).languageServer; + if (serverType === LanguageServerType.Node) { + return 'shared-ls'; + } + const resourcePortion = this.workspaceService.getWorkspaceFolderIdentifier( resource, workspacePathNameForGlobalWorkspaces diff --git a/src/client/activation/common/analysisOptions.ts b/src/client/activation/common/analysisOptions.ts new file mode 100644 index 000000000000..5594cacd67f2 --- /dev/null +++ b/src/client/activation/common/analysisOptions.ts @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +import { injectable } from 'inversify'; +import { Disposable, Event, EventEmitter, WorkspaceFolder } from 'vscode'; +import { DocumentFilter, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient'; + +import { PYTHON_LANGUAGE } from '../../common/constants'; +import { traceDecorators } from '../../common/logger'; +import { IOutputChannel, Resource } from '../../common/types'; +import { debounceSync } from '../../common/utils/decorators'; +import { IEnvironmentVariablesProvider } from '../../common/variables/types'; +import { PythonInterpreter } from '../../interpreter/contracts'; +import { ILanguageServerAnalysisOptions, ILanguageServerOutputChannel } from '../types'; + +@injectable() +export abstract class LanguageServerAnalysisOptionsBase implements ILanguageServerAnalysisOptions { + protected disposables: Disposable[] = []; + protected readonly didChange = new EventEmitter(); + private envPythonPath: string = ''; + private readonly output: IOutputChannel; + + protected constructor( + private readonly envVarsProvider: IEnvironmentVariablesProvider, + lsOutputChannel: ILanguageServerOutputChannel + ) { + this.output = lsOutputChannel.channel; + } + + public async initialize(_resource: Resource, _interpreter: PythonInterpreter | undefined) { + const disposable = this.envVarsProvider.onDidEnvironmentVariablesChange(this.onEnvVarChange, this); + this.disposables.push(disposable); + } + + public get onDidChange(): Event { + return this.didChange.event; + } + + public dispose(): void { + this.disposables.forEach((d) => d.dispose()); + this.didChange.dispose(); + } + + @traceDecorators.error('Failed to get analysis options') + public async getAnalysisOptions(): Promise { + const workspaceFolder = this.getWorkspaceFolder(); + const documentSelector = this.getDocumentFilters(workspaceFolder); + + return { + documentSelector, + workspaceFolder, + synchronize: { + configurationSection: PYTHON_LANGUAGE + }, + outputChannel: this.output, + revealOutputChannelOn: RevealOutputChannelOn.Never, + initializationOptions: await this.getInitializationOptions() + }; + } + + protected getWorkspaceFolder(): WorkspaceFolder | undefined { + return undefined; + } + + protected getDocumentFilters(_workspaceFolder?: WorkspaceFolder): DocumentFilter[] { + return [ + { scheme: 'file', language: PYTHON_LANGUAGE }, + { scheme: 'untitled', language: PYTHON_LANGUAGE } + ]; + } + + // tslint:disable-next-line: no-any + protected async getInitializationOptions(): Promise { + return undefined; + } + + protected async getEnvPythonPath(): Promise { + const vars = await this.envVarsProvider.getEnvironmentVariables(); + this.envPythonPath = vars.PYTHONPATH || ''; + return this.envPythonPath; + } + + @debounceSync(1000) + protected onEnvVarChange(): void { + this.notifyifEnvPythonPathChanged().ignoreErrors(); + } + + protected async notifyifEnvPythonPathChanged(): Promise { + const vars = await this.envVarsProvider.getEnvironmentVariables(); + const envPythonPath = vars.PYTHONPATH || ''; + + if (this.envPythonPath !== envPythonPath) { + this.didChange.fire(); + } + } +} diff --git a/src/client/activation/languageServer/analysisOptions.ts b/src/client/activation/languageServer/analysisOptions.ts index 89bd7353b2ea..922451601008 100644 --- a/src/client/activation/languageServer/analysisOptions.ts +++ b/src/client/activation/languageServer/analysisOptions.ts @@ -2,77 +2,81 @@ // Licensed under the MIT License. import { inject, injectable } from 'inversify'; import * as path from 'path'; -import { ConfigurationChangeEvent, Disposable, Event, EventEmitter, WorkspaceFolder } from 'vscode'; -import { DocumentFilter, DocumentSelector, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient'; +import { ConfigurationChangeEvent, WorkspaceFolder } from 'vscode'; +import { DocumentFilter } from 'vscode-languageclient'; import { IWorkspaceService } from '../../common/application/types'; -import { isTestExecution, PYTHON_LANGUAGE } from '../../common/constants'; import { traceDecorators, traceError } from '../../common/logger'; -import { IConfigurationService, IExtensionContext, IOutputChannel, IPathUtils, Resource } from '../../common/types'; +import { IConfigurationService, IExtensionContext, IPathUtils, Resource } from '../../common/types'; import { debounceSync } from '../../common/utils/decorators'; import { IEnvironmentVariablesProvider } from '../../common/variables/types'; import { PythonInterpreter } from '../../interpreter/contracts'; -import { ILanguageServerAnalysisOptions, ILanguageServerFolderService, ILanguageServerOutputChannel } from '../types'; +import { LanguageServerAnalysisOptionsBase } from '../common/analysisOptions'; +import { ILanguageServerFolderService, ILanguageServerOutputChannel } from '../types'; @injectable() -export class LanguageServerAnalysisOptions implements ILanguageServerAnalysisOptions { - private envPythonPath: string = ''; - private excludedFiles: string[] = []; - private typeshedPaths: string[] = []; - private disposables: Disposable[] = []; - private languageServerFolder: string = ''; +export class DotNetLanguageServerAnalysisOptions extends LanguageServerAnalysisOptionsBase { private resource: Resource; private interpreter: PythonInterpreter | undefined; - private output: IOutputChannel; - private readonly didChange = new EventEmitter(); + private languageServerFolder: string = ''; + private excludedFiles: string[] = []; + private typeshedPaths: string[] = []; + constructor( @inject(IExtensionContext) private readonly context: IExtensionContext, - @inject(IEnvironmentVariablesProvider) private readonly envVarsProvider: IEnvironmentVariablesProvider, + @inject(IEnvironmentVariablesProvider) envVarsProvider: IEnvironmentVariablesProvider, @inject(IConfigurationService) private readonly configuration: IConfigurationService, @inject(IWorkspaceService) private readonly workspace: IWorkspaceService, - @inject(ILanguageServerOutputChannel) private readonly lsOutputChannel: ILanguageServerOutputChannel, + @inject(ILanguageServerOutputChannel) lsOutputChannel: ILanguageServerOutputChannel, @inject(IPathUtils) private readonly pathUtils: IPathUtils, @inject(ILanguageServerFolderService) private readonly languageServerFolderService: ILanguageServerFolderService ) { - this.output = this.lsOutputChannel.channel; + super(envVarsProvider, lsOutputChannel); } + public async initialize(resource: Resource, interpreter: PythonInterpreter | undefined) { + await super.initialize(resource, interpreter); + this.resource = resource; this.interpreter = interpreter; this.languageServerFolder = await this.languageServerFolderService.getLanguageServerFolderName(resource); - let disposable = this.workspace.onDidChangeConfiguration(this.onSettingsChangedHandler, this); - this.disposables.push(disposable); - - disposable = this.envVarsProvider.onDidEnvironmentVariablesChange(this.onEnvVarChange, this); + const disposable = this.workspace.onDidChangeConfiguration(this.onSettingsChangedHandler, this); this.disposables.push(disposable); } - public get onDidChange(): Event { - return this.didChange.event; + + protected getWorkspaceFolder(): WorkspaceFolder | undefined { + return this.workspace.getWorkspaceFolder(this.resource); } - public dispose(): void { - this.disposables.forEach((d) => d.dispose()); - this.didChange.dispose(); + + protected getDocumentFilters(workspaceFolder?: WorkspaceFolder): DocumentFilter[] { + const filters = super.getDocumentFilters(workspaceFolder); + + // Set the document selector only when in a multi-root workspace scenario. + if ( + workspaceFolder && + Array.isArray(this.workspace.workspaceFolders) && + this.workspace.workspaceFolders!.length > 1 + ) { + filters[0].pattern = `${workspaceFolder.uri.fsPath}/**/*`; + } + + return filters; } - // tslint:disable-next-line: max-func-body-length - @traceDecorators.error('Failed to get analysis options') - public async getAnalysisOptions(): Promise { + + protected async getInitializationOptions() { const properties: Record = {}; const interpreterInfo = this.interpreter; if (!interpreterInfo) { - // tslint:disable-next-line:no-suspicious-comment - // TODO: How do we handle this? It is pretty unlikely... throw Error('did not find an active interpreter'); } - // tslint:disable-next-line:no-string-literal - properties['InterpreterPath'] = interpreterInfo.path; + properties.InterpreterPath = interpreterInfo.path; const version = interpreterInfo.version; if (version) { - // tslint:disable-next-line:no-string-literal - properties['Version'] = `${version.major}.${version.minor}.${version.patch}`; + properties.Version = `${version.major}.${version.minor}.${version.patch}`; } else { traceError('Unable to determine Python version. Analysis may be limited.'); } @@ -87,72 +91,25 @@ export class LanguageServerAnalysisOptions implements ILanguageServerAnalysisOpt } } - // tslint:disable-next-line: no-suspicious-comment - // TODO: remove this setting since LS 0.2.92+ is not using it. - // tslint:disable-next-line:no-string-literal - properties['DatabasePath'] = path.join(this.context.extensionPath, this.languageServerFolder); - - const vars = await this.envVarsProvider.getEnvironmentVariables(); - this.envPythonPath = vars.PYTHONPATH || ''; - if (this.envPythonPath !== '') { - const paths = this.envPythonPath.split(this.pathUtils.delimiter).filter((item) => item.trim().length > 0); + const envPythonPath = await this.getEnvPythonPath(); + if (envPythonPath !== '') { + const paths = envPythonPath.split(this.pathUtils.delimiter).filter((item) => item.trim().length > 0); searchPaths.push(...paths); } searchPaths = searchPaths.map((p) => path.normalize(p)); - this.excludedFiles = this.getExcludedFiles(); - this.typeshedPaths = this.getTypeshedPaths(); - const workspaceFolder = this.workspace.getWorkspaceFolder(this.resource); - const documentSelector = this.getDocumentSelector(workspaceFolder); - // Options to control the language client. return { - // Register the server for Python documents. - documentSelector, - workspaceFolder, - synchronize: { - configurationSection: PYTHON_LANGUAGE + interpreter: { + properties }, - outputChannel: this.output, - revealOutputChannelOn: RevealOutputChannelOn.Never, - initializationOptions: { - interpreter: { - properties - }, - displayOptions: { - preferredFormat: 'markdown', - trimDocumentationLines: false, - maxDocumentationLineLength: 0, - trimDocumentationText: false, - maxDocumentationTextLength: 0 - }, - searchPaths, - typeStubSearchPaths: this.typeshedPaths, - cacheFolderPath: this.getCacheFolderPath(), - excludeFiles: this.excludedFiles, - testEnvironment: isTestExecution(), - analysisUpdates: true, - traceLogging: true, // Max level, let LS decide through settings actual level of logging. - asyncStartup: true - } + searchPaths, + typeStubSearchPaths: this.typeshedPaths, + cacheFolderPath: this.getCacheFolderPath(), + excludeFiles: this.excludedFiles }; } - protected getDocumentSelector(workspaceFolder?: WorkspaceFolder): DocumentSelector { - const documentSelector: DocumentFilter[] = [ - { scheme: 'file', language: PYTHON_LANGUAGE }, - { scheme: 'untitled', language: PYTHON_LANGUAGE } - ]; - // Set the document selector only when in a multi-root workspace scenario. - if ( - workspaceFolder && - Array.isArray(this.workspace.workspaceFolders) && - this.workspace.workspaceFolders!.length > 1 - ) { - // tslint:disable-next-line:no-any - documentSelector[0].pattern = `${workspaceFolder.uri.fsPath}/**/*`; - } - return documentSelector; - } + protected getExcludedFiles(): string[] { const list: string[] = ['**/Lib/**', '**/site-packages/**']; this.getVsCodeExcludeSection('search.exclude', list); @@ -170,6 +127,7 @@ export class LanguageServerAnalysisOptions implements ILanguageServerAnalysisOpt .forEach((p) => list.push(p)); } } + protected getPythonExcludeSection(list: string[]): void { const pythonSettings = this.configuration.getSettings(this.resource); const paths = pythonSettings && pythonSettings.linting ? pythonSettings.linting.ignorePatterns : undefined; @@ -177,28 +135,33 @@ export class LanguageServerAnalysisOptions implements ILanguageServerAnalysisOpt paths.filter((p) => p && p.length > 0).forEach((p) => list.push(p)); } } + protected getTypeshedPaths(): string[] { const settings = this.configuration.getSettings(this.resource); return settings.analysis.typeshedPaths && settings.analysis.typeshedPaths.length > 0 ? settings.analysis.typeshedPaths : [path.join(this.context.extensionPath, this.languageServerFolder, 'Typeshed')]; } + protected getCacheFolderPath(): string | null { const settings = this.configuration.getSettings(this.resource); return settings.analysis.cacheFolderPath && settings.analysis.cacheFolderPath.length > 0 ? settings.analysis.cacheFolderPath : null; } + protected async onSettingsChangedHandler(e?: ConfigurationChangeEvent): Promise { if (e && !e.affectsConfiguration('python', this.resource)) { return; } this.onSettingsChanged(); } + @debounceSync(1000) protected onSettingsChanged(): void { this.notifyIfSettingsChanged().ignoreErrors(); } + @traceDecorators.verbose('Changes in python settings detected in analysis options') protected async notifyIfSettingsChanged(): Promise { const excludedFiles = this.getExcludedFiles(); @@ -221,18 +184,4 @@ export class LanguageServerAnalysisOptions implements ILanguageServerAnalysisOpt } } } - - @debounceSync(1000) - protected onEnvVarChange(): void { - this.notifyifEnvPythonPathChanged().ignoreErrors(); - } - - protected async notifyifEnvPythonPathChanged(): Promise { - const vars = await this.envVarsProvider.getEnvironmentVariables(); - const envPythonPath = vars.PYTHONPATH || ''; - - if (this.envPythonPath !== envPythonPath) { - this.didChange.fire(); - } - } } diff --git a/src/client/activation/languageServer/manager.ts b/src/client/activation/languageServer/manager.ts index 97c1d35e03ae..9dabcc1ddcbc 100644 --- a/src/client/activation/languageServer/manager.ts +++ b/src/client/activation/languageServer/manager.ts @@ -38,7 +38,9 @@ export class DotNetLanguageServerManager implements ILanguageServerManager { private connected: boolean = false; constructor( @inject(IServiceContainer) private readonly serviceContainer: IServiceContainer, - @inject(ILanguageServerAnalysisOptions) private readonly analysisOptions: ILanguageServerAnalysisOptions, + @inject(ILanguageServerAnalysisOptions) + @named(LanguageServerType.Microsoft) + private readonly analysisOptions: ILanguageServerAnalysisOptions, @inject(ILanguageServerExtension) private readonly lsExtension: ILanguageServerExtension, @inject(IPythonExtensionBanner) @named(BANNER_NAME_LS_SURVEY) diff --git a/src/client/activation/node/analysisOptions.ts b/src/client/activation/node/analysisOptions.ts new file mode 100644 index 000000000000..487ecc7e2208 --- /dev/null +++ b/src/client/activation/node/analysisOptions.ts @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +import { inject, injectable } from 'inversify'; + +import { IEnvironmentVariablesProvider } from '../../common/variables/types'; +import { LanguageServerAnalysisOptionsBase } from '../common/analysisOptions'; +import { ILanguageServerOutputChannel } from '../types'; + +@injectable() +export class NodeLanguageServerAnalysisOptions extends LanguageServerAnalysisOptionsBase { + constructor( + @inject(IEnvironmentVariablesProvider) envVarsProvider: IEnvironmentVariablesProvider, + @inject(ILanguageServerOutputChannel) lsOutputChannel: ILanguageServerOutputChannel + ) { + super(envVarsProvider, lsOutputChannel); + } +} diff --git a/src/client/activation/node/manager.ts b/src/client/activation/node/manager.ts index 7889e3854c91..06f7ecdf0f89 100644 --- a/src/client/activation/node/manager.ts +++ b/src/client/activation/node/manager.ts @@ -37,7 +37,9 @@ export class NodeLanguageServerManager implements ILanguageServerManager { private connected: boolean = false; constructor( @inject(IServiceContainer) private readonly serviceContainer: IServiceContainer, - @inject(ILanguageServerAnalysisOptions) private readonly analysisOptions: ILanguageServerAnalysisOptions, + @inject(ILanguageServerAnalysisOptions) + @named(LanguageServerType.Node) + private readonly analysisOptions: ILanguageServerAnalysisOptions, @inject(IPythonExtensionBanner) @named(BANNER_NAME_LS_SURVEY) private readonly surveyBanner: IPythonExtensionBanner, diff --git a/src/client/activation/serviceRegistry.ts b/src/client/activation/serviceRegistry.ts index f50d4438b17e..c7afe4e9afb1 100644 --- a/src/client/activation/serviceRegistry.ts +++ b/src/client/activation/serviceRegistry.ts @@ -24,7 +24,7 @@ import { LanguageServerDownloadChannel } from './common/packageRepository'; import { ExtensionSurveyPrompt } from './extensionSurvey'; import { JediExtensionActivator } from './jedi'; import { DotNetLanguageServerActivator } from './languageServer/activator'; -import { LanguageServerAnalysisOptions } from './languageServer/analysisOptions'; +import { DotNetLanguageServerAnalysisOptions } from './languageServer/analysisOptions'; import { DotNetLanguageClientFactory } from './languageServer/languageClientFactory'; import { LanguageServerCompatibilityService } from './languageServer/languageServerCompatibilityService'; import { LanguageServerExtension } from './languageServer/languageServerExtension'; @@ -40,6 +40,7 @@ import { DotNetLanguageServerManager } from './languageServer/manager'; import { LanguageServerOutputChannel } from './languageServer/outputChannel'; import { PlatformData } from './languageServer/platformData'; import { NodeLanguageServerActivator } from './node/activator'; +import { NodeLanguageServerAnalysisOptions } from './node/analysisOptions'; import { NodeLanguageClientFactory } from './node/languageClientFactory'; import { NodeLanguageServerFolderService } from './node/languageServerFolderService'; import { @@ -84,7 +85,6 @@ export function registerTypes(serviceManager: IServiceManager, languageServerTyp JediExtensionActivator, LanguageServerType.Jedi ); - serviceManager.add(ILanguageServerAnalysisOptions, LanguageServerAnalysisOptions); serviceManager.addSingleton( IPythonExtensionBanner, @@ -108,6 +108,11 @@ export function registerTypes(serviceManager: IServiceManager, languageServerTyp ); if (languageServerType === LanguageServerType.Microsoft) { + serviceManager.add( + ILanguageServerAnalysisOptions, + DotNetLanguageServerAnalysisOptions, + LanguageServerType.Microsoft + ); serviceManager.add( ILanguageServerActivator, DotNetLanguageServerActivator, @@ -146,6 +151,11 @@ export function registerTypes(serviceManager: IServiceManager, languageServerTyp ); registerDotNetTypes(serviceManager); } else if (languageServerType === LanguageServerType.Node) { + serviceManager.add( + ILanguageServerAnalysisOptions, + NodeLanguageServerAnalysisOptions, + LanguageServerType.Node + ); serviceManager.add( ILanguageServerActivator, NodeLanguageServerActivator, diff --git a/src/test/activation/languageServer/analysisOptions.unit.test.ts b/src/test/activation/languageServer/analysisOptions.unit.test.ts index 0513157e0453..e7451d439c49 100644 --- a/src/test/activation/languageServer/analysisOptions.unit.test.ts +++ b/src/test/activation/languageServer/analysisOptions.unit.test.ts @@ -4,9 +4,9 @@ import { expect } from 'chai'; import { instance, mock, verify, when } from 'ts-mockito'; import * as typemoq from 'typemoq'; import { ConfigurationChangeEvent, Uri, WorkspaceFolder } from 'vscode'; -import { DocumentSelector } from 'vscode-languageclient'; +import { DocumentFilter } from 'vscode-languageclient'; -import { LanguageServerAnalysisOptions } from '../../../client/activation/languageServer/analysisOptions'; +import { DotNetLanguageServerAnalysisOptions } from '../../../client/activation/languageServer/analysisOptions'; import { DotNetLanguageServerFolderService } from '../../../client/activation/languageServer/languageServerFolderService'; import { ILanguageServerFolderService, ILanguageServerOutputChannel } from '../../../client/activation/types'; import { IWorkspaceService } from '../../../client/common/application/types'; @@ -28,9 +28,9 @@ import { sleep } from '../../core'; // tslint:disable:no-unnecessary-override no-any chai-vague-errors no-unused-expression max-func-body-length suite('Language Server - Analysis Options', () => { - class TestClass extends LanguageServerAnalysisOptions { - public getDocumentSelector(workspaceFolder?: WorkspaceFolder): DocumentSelector { - return super.getDocumentSelector(workspaceFolder); + class TestClass extends DotNetLanguageServerAnalysisOptions { + public getDocumentFilters(workspaceFolder?: WorkspaceFolder): DocumentFilter[] { + return super.getDocumentFilters(workspaceFolder); } public getExcludedFiles(): string[] { return super.getExcludedFiles(); @@ -213,7 +213,7 @@ suite('Language Server - Analysis Options', () => { { scheme: 'untitled', language: PYTHON_LANGUAGE } ]; - const selector = analysisOptions.getDocumentSelector(); + const selector = analysisOptions.getDocumentFilters(); expect(selector).to.deep.equal(expectedSelector); }); @@ -226,7 +226,7 @@ suite('Language Server - Analysis Options', () => { { scheme: 'untitled', language: PYTHON_LANGUAGE } ]; - const selector = analysisOptions.getDocumentSelector(workspaceFolder); + const selector = analysisOptions.getDocumentFilters(workspaceFolder); expect(selector).to.deep.equal(expectedSelector); }); @@ -240,7 +240,7 @@ suite('Language Server - Analysis Options', () => { { scheme: 'untitled', language: PYTHON_LANGUAGE } ]; - const selector = analysisOptions.getDocumentSelector(workspaceFolder1); + const selector = analysisOptions.getDocumentFilters(workspaceFolder1); expect(selector).to.deep.equal(expectedSelector); }); diff --git a/src/test/activation/languageServer/manager.unit.test.ts b/src/test/activation/languageServer/manager.unit.test.ts index 20aaa6c8c78d..143a754a2dab 100644 --- a/src/test/activation/languageServer/manager.unit.test.ts +++ b/src/test/activation/languageServer/manager.unit.test.ts @@ -5,7 +5,7 @@ import * as chaiAsPromised from 'chai-as-promised'; import { instance, mock, verify, when } from 'ts-mockito'; import { Uri } from 'vscode'; import { LanguageClientOptions } from 'vscode-languageclient'; -import { LanguageServerAnalysisOptions } from '../../../client/activation/languageServer/analysisOptions'; +import { DotNetLanguageServerAnalysisOptions } from '../../../client/activation/languageServer/analysisOptions'; import { LanguageServerExtension } from '../../../client/activation/languageServer/languageServerExtension'; import { DotNetLanguageServerFolderService } from '../../../client/activation/languageServer/languageServerFolderService'; import { DotNetLanguageServerProxy } from '../../../client/activation/languageServer/languageServerProxy'; @@ -42,7 +42,7 @@ suite('Language Server - Manager', () => { const languageClientOptions = ({ x: 1 } as any) as LanguageClientOptions; setup(() => { serviceContainer = mock(ServiceContainer); - analysisOptions = mock(LanguageServerAnalysisOptions); + analysisOptions = mock(DotNetLanguageServerAnalysisOptions); languageServer = mock(DotNetLanguageServerProxy); lsExtension = mock(LanguageServerExtension); surveyBanner = mock(ProposeLanguageServerBanner); diff --git a/src/test/activation/serviceRegistry.unit.test.ts b/src/test/activation/serviceRegistry.unit.test.ts index afbdcd229b01..8ac3d6639bc5 100644 --- a/src/test/activation/serviceRegistry.unit.test.ts +++ b/src/test/activation/serviceRegistry.unit.test.ts @@ -11,7 +11,7 @@ import { LanguageServerDownloadChannel } from '../../client/activation/common/pa import { ExtensionSurveyPrompt } from '../../client/activation/extensionSurvey'; import { JediExtensionActivator } from '../../client/activation/jedi'; import { DotNetLanguageServerActivator } from '../../client/activation/languageServer/activator'; -import { LanguageServerAnalysisOptions } from '../../client/activation/languageServer/analysisOptions'; +import { DotNetLanguageServerAnalysisOptions } from '../../client/activation/languageServer/analysisOptions'; import { DotNetLanguageClientFactory } from '../../client/activation/languageServer/languageClientFactory'; import { LanguageServerCompatibilityService } from '../../client/activation/languageServer/languageServerCompatibilityService'; import { LanguageServerExtension } from '../../client/activation/languageServer/languageServerExtension'; @@ -198,7 +198,8 @@ suite('Unit Tests - Language Server Activation Service Registry', () => { verify( serviceManager.add( ILanguageServerAnalysisOptions, - LanguageServerAnalysisOptions + DotNetLanguageServerAnalysisOptions, + LanguageServerType.Microsoft ) ).once(); verify(serviceManager.add(ILanguageServerProxy, DotNetLanguageServerProxy)).once();