@@ -10,7 +10,6 @@ import {
1010} from 'vscode-languageclient/node' ;
1111
1212import { IExperimentService , IExtensions , IInterpreterPathService , Resource } from '../../common/types' ;
13- import { noop } from '../../common/utils/misc' ;
1413import { IEnvironmentVariablesProvider } from '../../common/variables/types' ;
1514import { PythonEnvironment } from '../../pythonEnvironments/info' ;
1615import { captureTelemetry } from '../../telemetry' ;
@@ -51,14 +50,10 @@ namespace GetExperimentValue {
5150export class NodeLanguageServerProxy implements ILanguageServerProxy {
5251 public languageClient : LanguageClient | undefined ;
5352
54- private languageServerTask : Promise < void > | undefined ;
55-
5653 private cancellationStrategy : FileBasedCancellationStrategy | undefined ;
5754
5855 private readonly disposables : Disposable [ ] = [ ] ;
5956
60- private disposed = false ;
61-
6257 private lsVersion : string | undefined ;
6358
6459 constructor (
@@ -76,24 +71,9 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
7671 } ;
7772 }
7873
79- @traceDecoratorVerbose ( 'Stopping language server' )
74+ @traceDecoratorVerbose ( 'Disposing language server' )
8075 public dispose ( ) : void {
81- if ( this . languageClient ) {
82- // Do not await on this.
83- this . languageClient . stop ( ) . then ( noop , ( ex ) => traceError ( 'Stopping language client failed' , ex ) ) ;
84-
85- this . languageClient = undefined ;
86- this . languageServerTask = undefined ;
87- }
88- if ( this . cancellationStrategy ) {
89- this . cancellationStrategy . dispose ( ) ;
90- this . cancellationStrategy = undefined ;
91- }
92- while ( this . disposables . length > 0 ) {
93- const d = this . disposables . shift ( ) ! ;
94- d . dispose ( ) ;
95- }
96- this . disposed = true ;
76+ this . stop ( ) . ignoreErrors ( ) ;
9777 }
9878
9979 @traceDecoratorError ( 'Failed to start language server' )
@@ -109,11 +89,6 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
10989 interpreter : PythonEnvironment | undefined ,
11090 options : LanguageClientOptions ,
11191 ) : Promise < void > {
112- if ( this . languageServerTask ) {
113- await this . languageServerTask ;
114- return ;
115- }
116-
11792 const extension = this . extensions . getExtension ( PYLANCE_EXTENSION_ID ) ;
11893 this . lsVersion = extension ?. packageJSON . version || '0' ;
11994
@@ -129,8 +104,27 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
129104 } ) ,
130105 ) ;
131106
132- this . languageServerTask = this . languageClient . start ( ) ;
133- await this . languageServerTask ;
107+ await this . languageClient . start ( ) ;
108+ }
109+
110+ @traceDecoratorVerbose ( 'Disposing language server' )
111+ public async stop ( ) : Promise < void > {
112+ if ( this . languageClient ) {
113+ try {
114+ await this . languageClient . stop ( ) ;
115+ } catch ( ex ) {
116+ traceError ( 'Stopping language client failed' , ex ) ;
117+ }
118+ this . languageClient = undefined ;
119+ }
120+ if ( this . cancellationStrategy ) {
121+ this . cancellationStrategy . dispose ( ) ;
122+ this . cancellationStrategy = undefined ;
123+ }
124+ while ( this . disposables . length > 0 ) {
125+ const d = this . disposables . shift ( ) ! ;
126+ d . dispose ( ) ;
127+ }
134128 }
135129
136130 // eslint-disable-next-line class-methods-use-this
@@ -146,11 +140,6 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
146140 NodeLanguageServerProxy . versionTelemetryProps ,
147141 )
148142 private registerHandlers ( _resource : Resource ) {
149- if ( this . disposed ) {
150- // Check if it got disposed in the interim.
151- return ;
152- }
153-
154143 const progressReporting = new ProgressReporting ( this . languageClient ! ) ;
155144 this . disposables . push ( progressReporting ) ;
156145
0 commit comments