@@ -10,7 +10,6 @@ import {
10
10
} from 'vscode-languageclient/node' ;
11
11
12
12
import { IExperimentService , IExtensions , IInterpreterPathService , Resource } from '../../common/types' ;
13
- import { noop } from '../../common/utils/misc' ;
14
13
import { IEnvironmentVariablesProvider } from '../../common/variables/types' ;
15
14
import { PythonEnvironment } from '../../pythonEnvironments/info' ;
16
15
import { captureTelemetry } from '../../telemetry' ;
@@ -51,14 +50,10 @@ namespace GetExperimentValue {
51
50
export class NodeLanguageServerProxy implements ILanguageServerProxy {
52
51
public languageClient : LanguageClient | undefined ;
53
52
54
- private languageServerTask : Promise < void > | undefined ;
55
-
56
53
private cancellationStrategy : FileBasedCancellationStrategy | undefined ;
57
54
58
55
private readonly disposables : Disposable [ ] = [ ] ;
59
56
60
- private disposed = false ;
61
-
62
57
private lsVersion : string | undefined ;
63
58
64
59
constructor (
@@ -76,24 +71,9 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
76
71
} ;
77
72
}
78
73
79
- @traceDecoratorVerbose ( 'Stopping language server' )
74
+ @traceDecoratorVerbose ( 'Disposing language server' )
80
75
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 ( ) ;
97
77
}
98
78
99
79
@traceDecoratorError ( 'Failed to start language server' )
@@ -109,11 +89,6 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
109
89
interpreter : PythonEnvironment | undefined ,
110
90
options : LanguageClientOptions ,
111
91
) : Promise < void > {
112
- if ( this . languageServerTask ) {
113
- await this . languageServerTask ;
114
- return ;
115
- }
116
-
117
92
const extension = this . extensions . getExtension ( PYLANCE_EXTENSION_ID ) ;
118
93
this . lsVersion = extension ?. packageJSON . version || '0' ;
119
94
@@ -129,8 +104,27 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
129
104
} ) ,
130
105
) ;
131
106
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
+ }
134
128
}
135
129
136
130
// eslint-disable-next-line class-methods-use-this
@@ -146,11 +140,6 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy {
146
140
NodeLanguageServerProxy . versionTelemetryProps ,
147
141
)
148
142
private registerHandlers ( _resource : Resource ) {
149
- if ( this . disposed ) {
150
- // Check if it got disposed in the interim.
151
- return ;
152
- }
153
-
154
143
const progressReporting = new ProgressReporting ( this . languageClient ! ) ;
155
144
this . disposables . push ( progressReporting ) ;
156
145
0 commit comments