From e14377c12c87319dc2fa31290e523c344a9a0465 Mon Sep 17 00:00:00 2001 From: HeeJae Chang Date: Thu, 29 Sep 2022 13:18:06 -0700 Subject: [PATCH 1/4] removed ILanguageServer no longer used. --- src/client/activation/jedi/manager.ts | 4 - src/client/activation/node/manager.ts | 4 - src/client/activation/serviceRegistry.ts | 2 - src/client/activation/types.ts | 44 +-- src/client/jupyter/jupyterIntegration.ts | 31 +- .../languageServer/jediLSExtensionManager.ts | 10 +- .../languageServerCapabilities.ts | 307 ------------------ .../languageServer/noneLSExtensionManager.ts | 95 +----- .../pylanceLSExtensionManager.ts | 10 +- src/client/languageServer/types.ts | 11 +- src/client/languageServer/watcher.ts | 19 +- src/test/.vscode/settings.json | 5 +- ...eractiveWindowMiddlewareAddon.unit.test.ts | 2 - .../activation/serviceRegistry.unit.test.ts | 4 - .../jediLSExtensionManager.unit.test.ts | 1 - .../languageServerCapabilities.unit.test.ts | 104 ------ .../noneLSExtensionManager.unit.test.ts | 4 - .../pylanceLSExtensionManager.unit.test.ts | 1 - 18 files changed, 20 insertions(+), 638 deletions(-) delete mode 100644 src/client/languageServer/languageServerCapabilities.ts delete mode 100644 src/test/languageServer/languageServerCapabilities.unit.test.ts diff --git a/src/client/activation/jedi/manager.ts b/src/client/activation/jedi/manager.ts index fa3fbc8b7505..672e9a1b33fd 100644 --- a/src/client/activation/jedi/manager.ts +++ b/src/client/activation/jedi/manager.ts @@ -59,10 +59,6 @@ export class JediLanguageServerManager implements ILanguageServerManager { this.disposables.forEach((d) => d.dispose()); } - public get languageProxy(): ILanguageServerProxy | undefined { - return this.languageServerProxy; - } - @traceDecoratorError('Failed to start language server') public async start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise { this.resource = resource; diff --git a/src/client/activation/node/manager.ts b/src/client/activation/node/manager.ts index d9b1b48fe754..249054bbbb91 100644 --- a/src/client/activation/node/manager.ts +++ b/src/client/activation/node/manager.ts @@ -59,10 +59,6 @@ export class NodeLanguageServerManager implements ILanguageServerManager { this.disposables.forEach((d) => d.dispose()); } - public get languageProxy(): ILanguageServerProxy { - return this.languageServerProxy; - } - @traceDecoratorError('Failed to start language server') public async start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise { if (this.started) { diff --git a/src/client/activation/serviceRegistry.ts b/src/client/activation/serviceRegistry.ts index d7512b533cad..aed2d2e346e4 100644 --- a/src/client/activation/serviceRegistry.ts +++ b/src/client/activation/serviceRegistry.ts @@ -9,7 +9,6 @@ import { IExtensionActivationManager, IExtensionActivationService, IExtensionSingleActivationService, - ILanguageServerCache, ILanguageServerOutputChannel, } from './types'; import { LoadLanguageServerExtension } from './common/loadLanguageServerExtension'; @@ -36,7 +35,6 @@ export function registerTypes(serviceManager: IServiceManager): void { serviceManager.addSingleton(ILanguageServerWatcher, LanguageServerWatcher); serviceManager.addBinding(ILanguageServerWatcher, IExtensionActivationService); - serviceManager.addBinding(ILanguageServerWatcher, ILanguageServerCache); serviceManager.addSingleton(LspNotebooksExperiment, LspNotebooksExperiment); serviceManager.addBinding(LspNotebooksExperiment, IExtensionSingleActivationService); } diff --git a/src/client/activation/types.ts b/src/client/activation/types.ts index 3ca10b29255d..86abf2a2672f 100644 --- a/src/client/activation/types.ts +++ b/src/client/activation/types.ts @@ -3,19 +3,8 @@ 'use strict'; -import { - CodeLensProvider, - CompletionItemProvider, - DefinitionProvider, - DocumentSymbolProvider, - Event, - HoverProvider, - ReferenceProvider, - RenameProvider, - SignatureHelpProvider, -} from 'vscode'; +import { Event } from 'vscode'; import { LanguageClient, LanguageClientOptions } from 'vscode-languageclient/node'; -import * as lsp from 'vscode-languageserver-protocol'; import type { IDisposable, IOutputChannel, Resource } from '../common/types'; import { PythonEnvironment } from '../pythonEnvironments/info'; @@ -69,41 +58,13 @@ export enum LanguageServerType { None = 'None', } -/** - * This interface is a subset of the vscode-protocol connection interface. - * It's the minimum set of functions needed in order to talk to a language server. - */ -export type ILanguageServerConnection = Pick< - lsp.ProtocolConnection, - 'sendRequest' | 'sendNotification' | 'onProgress' | 'sendProgress' | 'onNotification' | 'onRequest' ->; - -export interface ILanguageServer - extends RenameProvider, - DefinitionProvider, - HoverProvider, - ReferenceProvider, - CompletionItemProvider, - CodeLensProvider, - DocumentSymbolProvider, - SignatureHelpProvider, - IDisposable { - readonly connection?: ILanguageServerConnection; - readonly capabilities?: lsp.ServerCapabilities; -} - export const ILanguageServerActivator = Symbol('ILanguageServerActivator'); -export interface ILanguageServerActivator extends ILanguageServer { +export interface ILanguageServerActivator { start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise; activate(): void; deactivate(): void; } -export const ILanguageServerCache = Symbol('ILanguageServerCache'); -export interface ILanguageServerCache { - get(resource: Resource, interpreter?: PythonEnvironment): Promise; -} - export const ILanguageClientFactory = Symbol('ILanguageClientFactory'); export interface ILanguageClientFactory { createLanguageClient( @@ -121,7 +82,6 @@ export interface ILanguageServerAnalysisOptions extends IDisposable { } export const ILanguageServerManager = Symbol('ILanguageServerManager'); export interface ILanguageServerManager extends IDisposable { - readonly languageProxy: ILanguageServerProxy | undefined; start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise; connect(): void; disconnect(): void; diff --git a/src/client/jupyter/jupyterIntegration.ts b/src/client/jupyter/jupyterIntegration.ts index a99e5e8057d1..692bef74214d 100644 --- a/src/client/jupyter/jupyterIntegration.ts +++ b/src/client/jupyter/jupyterIntegration.ts @@ -6,10 +6,8 @@ import { inject, injectable, named } from 'inversify'; import { dirname } from 'path'; -import { CancellationToken, Disposable, Event, Extension, Memento, Uri } from 'vscode'; -import * as lsp from 'vscode-languageserver-protocol'; +import { CancellationToken, Event, Extension, Memento, Uri } from 'vscode'; import type { SemVer } from 'semver'; -import { ILanguageServerCache, ILanguageServerConnection } from '../activation/types'; import { IWorkspaceService } from '../common/application/types'; import { JUPYTER_EXTENSION_ID } from '../common/constants'; import { InterpreterUri, ModuleInstallFlags } from '../common/installer/types'; @@ -23,7 +21,6 @@ import { ProductInstallStatus, Resource, } from '../common/types'; -import { isResource } from '../common/utils/misc'; import { getDebugpyPackagePath } from '../debugger/extension/adapter/remoteLaunchers'; import { IEnvironmentActivationService } from '../interpreter/activation/types'; import { IInterpreterQuickPickItem, IInterpreterSelector } from '../interpreter/configuration/types'; @@ -38,11 +35,6 @@ import { import { PythonEnvironment } from '../pythonEnvironments/info'; import { IDataViewerDataProvider, IJupyterUriProvider } from './types'; -interface ILanguageServer extends Disposable { - readonly connection: ILanguageServerConnection; - readonly capabilities: lsp.ServerCapabilities; -} - /** * This allows Python extension to update Product enum without breaking Jupyter. * I.e. we have a strict contract, else using numbers (in enums) is bound to break across products. @@ -139,11 +131,6 @@ type PythonApiForJupyterExtension = { * Retrieve interpreter path selected for Jupyter server from Python memento storage */ getInterpreterPathSelectedForJupyterServer(): string | undefined; - /** - * Returns a ILanguageServer that can be used for communicating with a language server process. - * @param resource file that determines which connection to return - */ - getLanguageServer(resource?: InterpreterUri): Promise; /** * Registers a visibility filter for the interpreter status bar. */ @@ -207,7 +194,6 @@ export class JupyterExtensionIntegration { @inject(IInterpreterSelector) private readonly interpreterSelector: IInterpreterSelector, @inject(IInstaller) private readonly installer: IInstaller, @inject(IEnvironmentActivationService) private readonly envActivation: IEnvironmentActivationService, - @inject(ILanguageServerCache) private readonly languageServerCache: ILanguageServerCache, @inject(IMemento) @named(GLOBAL_MEMENTO) private globalState: Memento, @inject(IInterpreterDisplay) private interpreterDisplay: IInterpreterDisplay, @inject(IComponentAdapter) private pyenvs: IComponentAdapter, @@ -272,21 +258,6 @@ export class JupyterExtensionIntegration { getDebuggerPath: async () => dirname(getDebugpyPackagePath()), getInterpreterPathSelectedForJupyterServer: () => this.globalState.get('INTERPRETER_PATH_SELECTED_FOR_JUPYTER_SERVER'), - getLanguageServer: async (r) => { - const resource = isResource(r) ? r : undefined; - const interpreter = !isResource(r) ? r : undefined; - const client = await this.languageServerCache.get(resource, interpreter); - - // Some language servers don't support the connection yet. - if (client && client.connection && client.capabilities) { - return { - connection: client.connection, - capabilities: client.capabilities, - dispose: client.dispose, - }; - } - return undefined; - }, registerInterpreterStatusFilter: this.interpreterDisplay.registerVisibilityFilter.bind( this.interpreterDisplay, ), diff --git a/src/client/languageServer/jediLSExtensionManager.ts b/src/client/languageServer/jediLSExtensionManager.ts index a4836523660f..4cbfb6f33466 100644 --- a/src/client/languageServer/jediLSExtensionManager.ts +++ b/src/client/languageServer/jediLSExtensionManager.ts @@ -19,14 +19,12 @@ import { IInterpreterService } from '../interpreter/contracts'; import { IServiceContainer } from '../ioc/types'; import { traceError } from '../logging'; import { PythonEnvironment } from '../pythonEnvironments/info'; -import { LanguageServerCapabilities } from './languageServerCapabilities'; import { ILanguageServerExtensionManager } from './types'; -export class JediLSExtensionManager extends LanguageServerCapabilities - implements IDisposable, ILanguageServerExtensionManager { - serverManager: JediLanguageServerManager; +export class JediLSExtensionManager implements IDisposable, ILanguageServerExtensionManager { + private serverProxy: JediLanguageServerProxy; - serverProxy: JediLanguageServerProxy; + serverManager: JediLanguageServerManager; clientFactory: JediLanguageClientFactory; @@ -43,8 +41,6 @@ export class JediLSExtensionManager extends LanguageServerCapabilities environmentService: IEnvironmentVariablesProvider, commandManager: ICommandManager, ) { - super(); - this.analysisOptions = new JediLanguageServerAnalysisOptions( environmentService, outputChannel, diff --git a/src/client/languageServer/languageServerCapabilities.ts b/src/client/languageServer/languageServerCapabilities.ts deleted file mode 100644 index e5fc1e3f276e..000000000000 --- a/src/client/languageServer/languageServerCapabilities.ts +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import { - CancellationToken, - CodeLens, - CompletionContext, - CompletionItem, - CompletionList, - DocumentSymbol, - Hover, - Location, - LocationLink, - Position, - ProviderResult, - ReferenceContext, - SignatureHelp, - SignatureHelpContext, - SymbolInformation, - TextDocument, - WorkspaceEdit, -} from 'vscode'; -import * as vscodeLanguageClient from 'vscode-languageclient/node'; -import { ILanguageServer, ILanguageServerConnection, ILanguageServerProxy } from '../activation/types'; -import { ILanguageServerCapabilities } from './types'; - -/* - * The Language Server Capabilities class implements the ILanguageServer interface to provide support for the existing Jupyter integration. - */ -export class LanguageServerCapabilities implements ILanguageServerCapabilities { - serverProxy: ILanguageServerProxy | undefined; - - public dispose(): void { - // Nothing to do here. - } - - get(): Promise { - return Promise.resolve(this); - } - - public get connection(): ILanguageServerConnection | undefined { - const languageClient = this.getLanguageClient(); - if (languageClient) { - // Return an object that looks like a connection - return { - sendNotification: languageClient.sendNotification.bind(languageClient), - sendRequest: languageClient.sendRequest.bind(languageClient), - sendProgress: languageClient.sendProgress.bind(languageClient), - onRequest: languageClient.onRequest.bind(languageClient), - onNotification: languageClient.onNotification.bind(languageClient), - onProgress: languageClient.onProgress.bind(languageClient), - }; - } - - return undefined; - } - - public get capabilities(): vscodeLanguageClient.ServerCapabilities | undefined { - const languageClient = this.getLanguageClient(); - if (languageClient) { - return languageClient.initializeResult?.capabilities; - } - - return undefined; - } - - public provideRenameEdits( - document: TextDocument, - position: Position, - newName: string, - token: CancellationToken, - ): ProviderResult { - return this.handleProvideRenameEdits(document, position, newName, token); - } - - public provideDefinition( - document: TextDocument, - position: Position, - token: CancellationToken, - ): ProviderResult { - return this.handleProvideDefinition(document, position, token); - } - - public provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { - return this.handleProvideHover(document, position, token); - } - - public provideReferences( - document: TextDocument, - position: Position, - context: ReferenceContext, - token: CancellationToken, - ): ProviderResult { - return this.handleProvideReferences(document, position, context, token); - } - - public provideCompletionItems( - document: TextDocument, - position: Position, - token: CancellationToken, - context: CompletionContext, - ): ProviderResult { - return this.handleProvideCompletionItems(document, position, token, context); - } - - public provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { - return this.handleProvideCodeLenses(document, token); - } - - public provideDocumentSymbols( - document: TextDocument, - token: CancellationToken, - ): ProviderResult { - return this.handleProvideDocumentSymbols(document, token); - } - - public provideSignatureHelp( - document: TextDocument, - position: Position, - token: CancellationToken, - context: SignatureHelpContext, - ): ProviderResult { - return this.handleProvideSignatureHelp(document, position, token, context); - } - - protected getLanguageClient(): vscodeLanguageClient.LanguageClient | undefined { - return this.serverProxy?.languageClient; - } - - private async handleProvideRenameEdits( - document: TextDocument, - position: Position, - newName: string, - token: CancellationToken, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.RenameParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position), - newName, - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.RenameRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asWorkspaceEdit(result); - } - } - - return undefined; - } - - private async handleProvideDefinition( - document: TextDocument, - position: Position, - token: CancellationToken, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.TextDocumentPositionParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position), - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.DefinitionRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asDefinitionResult(result); - } - } - - return undefined; - } - - private async handleProvideHover( - document: TextDocument, - position: Position, - token: CancellationToken, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.TextDocumentPositionParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position), - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.HoverRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asHover(result); - } - } - - return undefined; - } - - private async handleProvideReferences( - document: TextDocument, - position: Position, - context: ReferenceContext, - token: CancellationToken, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.ReferenceParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position), - context, - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.ReferencesRequest.type, args, token); - if (result) { - // Remove undefined part. - return result.map((l) => { - const r = languageClient!.protocol2CodeConverter.asLocation(l); - return r!; - }); - } - } - - return undefined; - } - - private async handleProvideCodeLenses( - document: TextDocument, - token: CancellationToken, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.CodeLensParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.CodeLensRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asCodeLenses(result); - } - } - - return undefined; - } - - private async handleProvideCompletionItems( - document: TextDocument, - position: Position, - token: CancellationToken, - context: CompletionContext, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args = languageClient.code2ProtocolConverter.asCompletionParams(document, position, context); - const result = await languageClient.sendRequest(vscodeLanguageClient.CompletionRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asCompletionResult(result); - } - } - - return undefined; - } - - private async handleProvideDocumentSymbols( - document: TextDocument, - token: CancellationToken, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.DocumentSymbolParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - }; - const result = await languageClient.sendRequest( - vscodeLanguageClient.DocumentSymbolRequest.type, - args, - token, - ); - if (result && result.length) { - if ((result[0] as DocumentSymbol).range) { - // Document symbols - const docSymbols = result as vscodeLanguageClient.DocumentSymbol[]; - return languageClient.protocol2CodeConverter.asDocumentSymbols(docSymbols); - } - // Document symbols - const symbols = result as vscodeLanguageClient.SymbolInformation[]; - return languageClient.protocol2CodeConverter.asSymbolInformations(symbols); - } - } - - return undefined; - } - - private async handleProvideSignatureHelp( - document: TextDocument, - position: Position, - token: CancellationToken, - _context: SignatureHelpContext, - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.TextDocumentPositionParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position), - }; - const result = await languageClient.sendRequest( - vscodeLanguageClient.SignatureHelpRequest.type, - args, - token, - ); - if (result) { - return languageClient.protocol2CodeConverter.asSignatureHelp(result); - } - } - - return undefined; - } -} diff --git a/src/client/languageServer/noneLSExtensionManager.ts b/src/client/languageServer/noneLSExtensionManager.ts index b5f6207e0a41..1d93ea50be51 100644 --- a/src/client/languageServer/noneLSExtensionManager.ts +++ b/src/client/languageServer/noneLSExtensionManager.ts @@ -3,45 +3,15 @@ /* eslint-disable class-methods-use-this */ -import { - CancellationToken, - CodeLens, - CompletionContext, - CompletionItem, - CompletionList, - DocumentSymbol, - Hover, - Location, - LocationLink, - Position, - ProviderResult, - ReferenceContext, - SignatureHelp, - SignatureHelpContext, - SymbolInformation, - TextDocument, - WorkspaceEdit, -} from 'vscode'; -import { ILanguageServer, ILanguageServerProxy } from '../activation/types'; import { ILanguageServerExtensionManager } from './types'; // This LS manager implements ILanguageServer directly // instead of extending LanguageServerCapabilities because it doesn't need to do anything. -export class NoneLSExtensionManager implements ILanguageServer, ILanguageServerExtensionManager { - serverProxy: ILanguageServerProxy | undefined; - - constructor() { - this.serverProxy = undefined; - } - +export class NoneLSExtensionManager implements ILanguageServerExtensionManager { dispose(): void { // Nothing to do here. } - get(): Promise { - return Promise.resolve(this); - } - startLanguageServer(): Promise { return Promise.resolve(); } @@ -58,67 +28,4 @@ export class NoneLSExtensionManager implements ILanguageServer, ILanguageServerE // Nothing to do here. return Promise.resolve(); } - - public provideRenameEdits( - _document: TextDocument, - _position: Position, - _newName: string, - _token: CancellationToken, - ): ProviderResult { - return null; - } - - public provideDefinition( - _document: TextDocument, - _position: Position, - _token: CancellationToken, - ): ProviderResult { - return null; - } - - public provideHover( - _document: TextDocument, - _position: Position, - _token: CancellationToken, - ): ProviderResult { - return null; - } - - public provideReferences( - _document: TextDocument, - _position: Position, - _context: ReferenceContext, - _token: CancellationToken, - ): ProviderResult { - return null; - } - - public provideCompletionItems( - _document: TextDocument, - _position: Position, - _token: CancellationToken, - _context: CompletionContext, - ): ProviderResult { - return null; - } - - public provideCodeLenses(_document: TextDocument, _token: CancellationToken): ProviderResult { - return null; - } - - public provideDocumentSymbols( - _document: TextDocument, - _token: CancellationToken, - ): ProviderResult { - return null; - } - - public provideSignatureHelp( - _document: TextDocument, - _position: Position, - _token: CancellationToken, - _context: SignatureHelpContext, - ): ProviderResult { - return null; - } } diff --git a/src/client/languageServer/pylanceLSExtensionManager.ts b/src/client/languageServer/pylanceLSExtensionManager.ts index 2cc74308feea..3865886880b2 100644 --- a/src/client/languageServer/pylanceLSExtensionManager.ts +++ b/src/client/languageServer/pylanceLSExtensionManager.ts @@ -25,14 +25,12 @@ import { IInterpreterService } from '../interpreter/contracts'; import { IServiceContainer } from '../ioc/types'; import { traceLog } from '../logging'; import { PythonEnvironment } from '../pythonEnvironments/info'; -import { LanguageServerCapabilities } from './languageServerCapabilities'; import { ILanguageServerExtensionManager } from './types'; -export class PylanceLSExtensionManager extends LanguageServerCapabilities - implements IDisposable, ILanguageServerExtensionManager { - serverManager: NodeLanguageServerManager; +export class PylanceLSExtensionManager implements IDisposable, ILanguageServerExtensionManager { + private serverProxy: NodeLanguageServerProxy; - serverProxy: NodeLanguageServerProxy; + serverManager: NodeLanguageServerManager; clientFactory: NodeLanguageClientFactory; @@ -53,8 +51,6 @@ export class PylanceLSExtensionManager extends LanguageServerCapabilities readonly applicationShell: IApplicationShell, lspNotebooksExperiment: LspNotebooksExperiment, ) { - super(); - this.analysisOptions = new NodeLanguageServerAnalysisOptions( outputChannel, workspaceService, diff --git a/src/client/languageServer/types.ts b/src/client/languageServer/types.ts index cab882f78f3e..f7cad157fcef 100644 --- a/src/client/languageServer/types.ts +++ b/src/client/languageServer/types.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { ILanguageServer, ILanguageServerProxy, LanguageServerType } from '../activation/types'; +import { LanguageServerType } from '../activation/types'; import { Resource } from '../common/types'; import { PythonEnvironment } from '../pythonEnvironments/info'; @@ -15,12 +15,7 @@ export interface ILanguageServerWatcher { readonly languageServerType: LanguageServerType; startLanguageServer(languageServerType: LanguageServerType, resource?: Resource): Promise; restartLanguageServers(): Promise; -} - -export interface ILanguageServerCapabilities extends ILanguageServer { - serverProxy: ILanguageServerProxy | undefined; - - get(): Promise; + get(resource: Resource, interpreter?: PythonEnvironment): Promise; } /** @@ -28,7 +23,7 @@ export interface ILanguageServerCapabilities extends ILanguageServer { * They are responsible for starting and stopping the language server provided by their LS extension. * They also extend the `ILanguageServer` interface via `ILanguageServerCapabilities` to continue supporting the Jupyter integration. */ -export interface ILanguageServerExtensionManager extends ILanguageServerCapabilities { +export interface ILanguageServerExtensionManager { startLanguageServer(resource: Resource, interpreter?: PythonEnvironment): Promise; stopLanguageServer(): Promise; canStartLanguageServer(interpreter: PythonEnvironment | undefined): boolean; diff --git a/src/client/languageServer/watcher.ts b/src/client/languageServer/watcher.ts index 8fb6591b70c8..f7c4193bde90 100644 --- a/src/client/languageServer/watcher.ts +++ b/src/client/languageServer/watcher.ts @@ -6,13 +6,7 @@ import { inject, injectable } from 'inversify'; import { ConfigurationChangeEvent, Uri, WorkspaceFoldersChangeEvent } from 'vscode'; import * as nls from 'vscode-nls'; import { LanguageServerChangeHandler } from '../activation/common/languageServerChangeHandler'; -import { - IExtensionActivationService, - ILanguageServer, - ILanguageServerCache, - ILanguageServerOutputChannel, - LanguageServerType, -} from '../activation/types'; +import { IExtensionActivationService, ILanguageServerOutputChannel, LanguageServerType } from '../activation/types'; import { IApplicationShell, ICommandManager, IWorkspaceService } from '../common/application/types'; import { IFileSystem } from '../common/platform/types'; import { @@ -41,11 +35,8 @@ const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @injectable() /** * The Language Server Watcher class implements the ILanguageServerWatcher interface, which is the one-stop shop for language server activation. - * - * It also implements the ILanguageServerCache interface needed by our Jupyter support. */ -export class LanguageServerWatcher - implements IExtensionActivationService, ILanguageServerWatcher, ILanguageServerCache { +export class LanguageServerWatcher implements IExtensionActivationService, ILanguageServerWatcher { public readonly supportedWorkspaceTypes = { untrustedWorkspace: true, virtualWorkspace: true }; languageServerExtensionManager: ILanguageServerExtensionManager | undefined; @@ -202,9 +193,7 @@ export class LanguageServerWatcher }); } - // ILanguageServerCache - - public async get(resource?: Resource): Promise { + public async get(resource?: Resource): Promise { const key = this.getWorkspaceKey(resource, this.languageServerType); let languageServerExtensionManager = this.workspaceLanguageServers.get(key); @@ -212,7 +201,7 @@ export class LanguageServerWatcher languageServerExtensionManager = await this.startAndGetLanguageServer(this.languageServerType, resource); } - return Promise.resolve(languageServerExtensionManager.get()); + return Promise.resolve(languageServerExtensionManager); } // Private methods diff --git a/src/test/.vscode/settings.json b/src/test/.vscode/settings.json index ef9292849a9d..8d238e1ae79e 100644 --- a/src/test/.vscode/settings.json +++ b/src/test/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.linting.pylintEnabled": false, + "python.linting.pylintEnabled": true, "python.linting.flake8Enabled": false, "python.testing.pytestArgs": [], "python.testing.unittestArgs": ["-s=./tests", "-p=test_*.py", "-v", "-s", ".", "-p", "*test*.py"], @@ -15,5 +15,6 @@ "python.formatting.provider": "yapf", // Don't set this to `Pylance`, for CI we want to use the LS that ships with the extension. "python.languageServer": "Jedi", - "python.pythonPath": "C:\\GIT\\s p\\vscode-python\\.venv\\Scripts\\python.exe" + "python.pythonPath": "C:\\GIT\\s p\\vscode-python\\.venv\\Scripts\\python.exe", + "python.defaultInterpreterPath": "python" } diff --git a/src/test/activation/node/lspInteractiveWindowMiddlewareAddon.unit.test.ts b/src/test/activation/node/lspInteractiveWindowMiddlewareAddon.unit.test.ts index 9fd78760804b..472dea147503 100644 --- a/src/test/activation/node/lspInteractiveWindowMiddlewareAddon.unit.test.ts +++ b/src/test/activation/node/lspInteractiveWindowMiddlewareAddon.unit.test.ts @@ -19,7 +19,6 @@ import { } from '../../../client/interpreter/contracts'; import { IInterpreterSelector } from '../../../client/interpreter/configuration/types'; import { IEnvironmentActivationService } from '../../../client/interpreter/activation/types'; -import { ILanguageServerCache } from '../../../client/activation/types'; import { IWorkspaceService } from '../../../client/common/application/types'; import { MockMemento } from '../../mocks/mementos'; @@ -37,7 +36,6 @@ suite('Pylance Language Server - Interactive Window LSP Notebooks', () => { mock(), mock(), mock(), - mock(), new MockMemento(), mock(), mock(), diff --git a/src/test/activation/serviceRegistry.unit.test.ts b/src/test/activation/serviceRegistry.unit.test.ts index 1d3f4f383082..cf715b90ecfe 100644 --- a/src/test/activation/serviceRegistry.unit.test.ts +++ b/src/test/activation/serviceRegistry.unit.test.ts @@ -9,14 +9,11 @@ import { registerTypes } from '../../client/activation/serviceRegistry'; import { IExtensionActivationManager, IExtensionSingleActivationService, - ILanguageServerCache, ILanguageServerOutputChannel, } from '../../client/activation/types'; import { ServiceManager } from '../../client/ioc/serviceManager'; import { IServiceManager } from '../../client/ioc/types'; import { LoadLanguageServerExtension } from '../../client/activation/common/loadLanguageServerExtension'; -import { ILanguageServerWatcher } from '../../client/languageServer/types'; -import { LanguageServerWatcher } from '../../client/languageServer/watcher'; suite('Unit Tests - Language Server Activation Service Registry', () => { let serviceManager: IServiceManager; @@ -28,7 +25,6 @@ suite('Unit Tests - Language Server Activation Service Registry', () => { test('Ensure common services are registered', async () => { registerTypes(instance(serviceManager)); - verify(serviceManager.addSingleton(ILanguageServerWatcher, LanguageServerWatcher)).once(); verify( serviceManager.add(IExtensionActivationManager, ExtensionActivationManager), ).once(); diff --git a/src/test/languageServer/jediLSExtensionManager.unit.test.ts b/src/test/languageServer/jediLSExtensionManager.unit.test.ts index 5fffef66a92e..b57a0bbd096d 100644 --- a/src/test/languageServer/jediLSExtensionManager.unit.test.ts +++ b/src/test/languageServer/jediLSExtensionManager.unit.test.ts @@ -35,7 +35,6 @@ suite('Language Server - Jedi LS extension manager', () => { test('Constructor should create a client proxy, a server manager and a server proxy', () => { assert.notStrictEqual(manager.clientFactory, undefined); assert.notStrictEqual(manager.serverManager, undefined); - assert.notStrictEqual(manager.serverProxy, undefined); }); test('canStartLanguageServer should return true if an interpreter is passed in', () => { diff --git a/src/test/languageServer/languageServerCapabilities.unit.test.ts b/src/test/languageServer/languageServerCapabilities.unit.test.ts deleted file mode 100644 index 4392e2901af8..000000000000 --- a/src/test/languageServer/languageServerCapabilities.unit.test.ts +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import * as assert from 'assert'; -import { ILanguageServerProxy } from '../../client/activation/types'; -import { LanguageServerCapabilities } from '../../client/languageServer/languageServerCapabilities'; - -suite('Language server - capabilities', () => { - test('get() should not return undefined', async () => { - const capabilities = new LanguageServerCapabilities(); - - const result = await capabilities.get(); - - assert.notDeepStrictEqual(result, undefined); - }); - - test('The connection property should return an object if there is a language client', () => { - const serverProxy = ({ - languageClient: { - sendNotification: () => { - /* nothing */ - }, - sendRequest: () => { - /* nothing */ - }, - sendProgress: () => { - /* nothing */ - }, - onRequest: () => { - /* nothing */ - }, - onNotification: () => { - /* nothing */ - }, - onProgress: () => { - /* nothing */ - }, - }, - } as unknown) as ILanguageServerProxy; - - const capabilities = new LanguageServerCapabilities(); - capabilities.serverProxy = serverProxy; - - const result = capabilities.connection; - - assert.notDeepStrictEqual(result, undefined); - assert.strictEqual(typeof result, 'object'); - }); - - test('The connection property should return undefined if there is no language client', () => { - const serverProxy = ({} as unknown) as ILanguageServerProxy; - - const capabilities = new LanguageServerCapabilities(); - capabilities.serverProxy = serverProxy; - - const result = capabilities.connection; - - assert.deepStrictEqual(result, undefined); - }); - - test('capabilities() should return an object if there is an initialized language client', () => { - const serverProxy = ({ - languageClient: { - initializeResult: { - capabilities: {}, - }, - }, - } as unknown) as ILanguageServerProxy; - - const capabilities = new LanguageServerCapabilities(); - capabilities.serverProxy = serverProxy; - - const result = capabilities.capabilities; - - assert.notDeepStrictEqual(result, undefined); - assert.strictEqual(typeof result, 'object'); - }); - - test('capabilities() should return undefined if there is no language client', () => { - const serverProxy = ({} as unknown) as ILanguageServerProxy; - - const capabilities = new LanguageServerCapabilities(); - capabilities.serverProxy = serverProxy; - - const result = capabilities.capabilities; - - assert.deepStrictEqual(result, undefined); - }); - - test('capabilities() should return undefined if the language client is not initialized', () => { - const serverProxy = ({ - languageClient: { - initializeResult: undefined, - }, - } as unknown) as ILanguageServerProxy; - - const capabilities = new LanguageServerCapabilities(); - capabilities.serverProxy = serverProxy; - - const result = capabilities.capabilities; - - assert.deepStrictEqual(result, undefined); - }); -}); diff --git a/src/test/languageServer/noneLSExtensionManager.unit.test.ts b/src/test/languageServer/noneLSExtensionManager.unit.test.ts index f662dc152e69..2f27e420ca48 100644 --- a/src/test/languageServer/noneLSExtensionManager.unit.test.ts +++ b/src/test/languageServer/noneLSExtensionManager.unit.test.ts @@ -11,10 +11,6 @@ suite('Language Server - No LS extension manager', () => { manager = new NoneLSExtensionManager(); }); - test('Constructor should not create a server proxy', () => { - assert.strictEqual(manager.serverProxy, undefined); - }); - test('canStartLanguageServer should return true', () => { const result = manager.canStartLanguageServer(); diff --git a/src/test/languageServer/pylanceLSExtensionManager.unit.test.ts b/src/test/languageServer/pylanceLSExtensionManager.unit.test.ts index 1a51c93d4783..0118cca0764f 100644 --- a/src/test/languageServer/pylanceLSExtensionManager.unit.test.ts +++ b/src/test/languageServer/pylanceLSExtensionManager.unit.test.ts @@ -45,7 +45,6 @@ suite('Language Server - Pylance LS extension manager', () => { test('Constructor should create a client proxy, a server manager and a server proxy', () => { assert.notStrictEqual(manager.clientFactory, undefined); assert.notStrictEqual(manager.serverManager, undefined); - assert.notStrictEqual(manager.serverProxy, undefined); }); test('canStartLanguageServer should return true if Pylance is installed', () => { From 0ccee928b4f82d95f50d61217eba88bec0e2e796 Mon Sep 17 00:00:00 2001 From: HeeJae Chang Date: Thu, 29 Sep 2022 13:31:34 -0700 Subject: [PATCH 2/4] revert back settings file --- src/test/.vscode/settings.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/.vscode/settings.json b/src/test/.vscode/settings.json index 8d238e1ae79e..ac8c0c9acc9b 100644 --- a/src/test/.vscode/settings.json +++ b/src/test/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.linting.pylintEnabled": true, + "python.linting.pylintEnabled": false, "python.linting.flake8Enabled": false, "python.testing.pytestArgs": [], "python.testing.unittestArgs": ["-s=./tests", "-p=test_*.py", "-v", "-s", ".", "-p", "*test*.py"], @@ -15,6 +15,5 @@ "python.formatting.provider": "yapf", // Don't set this to `Pylance`, for CI we want to use the LS that ships with the extension. "python.languageServer": "Jedi", - "python.pythonPath": "C:\\GIT\\s p\\vscode-python\\.venv\\Scripts\\python.exe", - "python.defaultInterpreterPath": "python" -} + "python.pythonPath": "C:\\GIT\\s p\\vscode-python\\.venv\\Scripts\\python.exe" +} \ No newline at end of file From d90353f102237c096ec2595de6156c948fc2723d Mon Sep 17 00:00:00 2001 From: HeeJae Chang Date: Thu, 29 Sep 2022 13:32:55 -0700 Subject: [PATCH 3/4] added new line --- src/test/.vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/.vscode/settings.json b/src/test/.vscode/settings.json index ac8c0c9acc9b..ef9292849a9d 100644 --- a/src/test/.vscode/settings.json +++ b/src/test/.vscode/settings.json @@ -16,4 +16,4 @@ // Don't set this to `Pylance`, for CI we want to use the LS that ships with the extension. "python.languageServer": "Jedi", "python.pythonPath": "C:\\GIT\\s p\\vscode-python\\.venv\\Scripts\\python.exe" -} \ No newline at end of file +} From cd0cf1c6a233214fee4af5fe119c1ff8c0a40b51 Mon Sep 17 00:00:00 2001 From: HeeJae Chang Date: Thu, 29 Sep 2022 13:48:49 -0700 Subject: [PATCH 4/4] made more stuff to be internal --- src/client/activation/jedi/languageServerProxy.ts | 2 +- src/client/activation/node/manager.ts | 5 +++-- src/client/activation/types.ts | 4 ---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/client/activation/jedi/languageServerProxy.ts b/src/client/activation/jedi/languageServerProxy.ts index 94401bc83874..a03b7ba96b39 100644 --- a/src/client/activation/jedi/languageServerProxy.ts +++ b/src/client/activation/jedi/languageServerProxy.ts @@ -16,7 +16,7 @@ import { killPid } from '../../common/process/rawProcessApis'; import { traceDecoratorError, traceDecoratorVerbose, traceError } from '../../logging'; export class JediLanguageServerProxy implements ILanguageServerProxy { - public languageClient: LanguageClient | undefined; + private languageClient: LanguageClient | undefined; private readonly disposables: Disposable[] = []; diff --git a/src/client/activation/node/manager.ts b/src/client/activation/node/manager.ts index 249054bbbb91..85d57622e327 100644 --- a/src/client/activation/node/manager.ts +++ b/src/client/activation/node/manager.ts @@ -11,9 +11,10 @@ import { captureTelemetry } from '../../telemetry'; import { EventName } from '../../telemetry/constants'; import { Commands } from '../commands'; import { NodeLanguageClientMiddleware } from './languageClientMiddleware'; -import { ILanguageServerAnalysisOptions, ILanguageServerManager, ILanguageServerProxy } from '../types'; +import { ILanguageServerAnalysisOptions, ILanguageServerManager } from '../types'; import { traceDecoratorError, traceDecoratorVerbose } from '../../logging'; import { PYLANCE_EXTENSION_ID } from '../../common/constants'; +import { NodeLanguageServerProxy } from './languageServerProxy'; export class NodeLanguageServerManager implements ILanguageServerManager { private resource!: Resource; @@ -35,7 +36,7 @@ export class NodeLanguageServerManager implements ILanguageServerManager { constructor( private readonly serviceContainer: IServiceContainer, private readonly analysisOptions: ILanguageServerAnalysisOptions, - private readonly languageServerProxy: ILanguageServerProxy, + private readonly languageServerProxy: NodeLanguageServerProxy, commandManager: ICommandManager, private readonly extensions: IExtensions, ) { diff --git a/src/client/activation/types.ts b/src/client/activation/types.ts index 86abf2a2672f..873d608f0bd0 100644 --- a/src/client/activation/types.ts +++ b/src/client/activation/types.ts @@ -89,10 +89,6 @@ export interface ILanguageServerManager extends IDisposable { export const ILanguageServerProxy = Symbol('ILanguageServerProxy'); export interface ILanguageServerProxy extends IDisposable { - /** - * LanguageClient in use - */ - languageClient: LanguageClient | undefined; start( resource: Resource, interpreter: PythonEnvironment | undefined,