@@ -19,7 +19,7 @@ import * as vscode from "vscode";
19
19
import { requireNativeModule } from "../utilities/native" ;
20
20
const { spawn } = requireNativeModule < typeof nodePty > ( "node-pty" ) ;
21
21
22
- export interface SwiftProcess {
22
+ export interface SwiftProcess extends vscode . Disposable {
23
23
/**
24
24
* Resolved path to the `swift` executable
25
25
*/
@@ -73,7 +73,7 @@ export interface SwiftProcess {
73
73
setDimensions ( dimensions : vscode . TerminalDimensions ) : void ;
74
74
}
75
75
76
- class CloseHandler {
76
+ class CloseHandler implements vscode . Disposable {
77
77
private readonly closeEmitter : vscode . EventEmitter < number | void > = new vscode . EventEmitter <
78
78
number | void
79
79
> ( ) ;
@@ -94,6 +94,10 @@ class CloseHandler {
94
94
}
95
95
}
96
96
97
+ dispose ( ) {
98
+ this . closeEmitter . dispose ( ) ;
99
+ }
100
+
97
101
private queueClose ( ) {
98
102
this . closeTimeout = setTimeout ( ( ) => {
99
103
this . closeEmitter . fire ( this . exitCode ) ;
@@ -110,14 +114,22 @@ export class SwiftPtyProcess implements SwiftProcess {
110
114
private readonly writeEmitter : vscode . EventEmitter < string > = new vscode . EventEmitter < string > ( ) ;
111
115
private readonly errorEmitter : vscode . EventEmitter < Error > = new vscode . EventEmitter < Error > ( ) ;
112
116
private readonly closeHandler : CloseHandler = new CloseHandler ( ) ;
117
+ private disposables : vscode . Disposable [ ] = [ ] ;
113
118
114
119
private spawnedProcess ?: nodePty . IPty ;
115
120
116
121
constructor (
117
122
public readonly command : string ,
118
123
public readonly args : string [ ] ,
119
124
private options : vscode . ProcessExecutionOptions = { }
120
- ) { }
125
+ ) {
126
+ this . disposables . push (
127
+ this . spawnEmitter ,
128
+ this . writeEmitter ,
129
+ this . errorEmitter ,
130
+ this . closeHandler
131
+ ) ;
132
+ }
121
133
122
134
spawn ( ) : void {
123
135
try {
@@ -147,6 +159,11 @@ export class SwiftPtyProcess implements SwiftProcess {
147
159
this . closeHandler . handle ( ) ;
148
160
}
149
161
} ) ;
162
+ this . disposables . push (
163
+ this . onDidClose ( ( ) => {
164
+ this . dispose ( ) ;
165
+ } )
166
+ ) ;
150
167
} catch ( error ) {
151
168
this . errorEmitter . fire ( new Error ( `${ error } ` ) ) ;
152
169
this . closeHandler . handle ( ) ;
@@ -173,6 +190,10 @@ export class SwiftPtyProcess implements SwiftProcess {
173
190
this . spawnedProcess ?. resize ( dimensions . columns , dimensions . rows ) ;
174
191
}
175
192
193
+ dispose ( ) {
194
+ this . disposables . forEach ( d => d . dispose ( ) ) ;
195
+ }
196
+
176
197
onDidSpawn : vscode . Event < void > = this . spawnEmitter . event ;
177
198
178
199
onDidWrite : vscode . Event < string > = this . writeEmitter . event ;
@@ -197,14 +218,22 @@ export class ReadOnlySwiftProcess implements SwiftProcess {
197
218
private readonly writeEmitter : vscode . EventEmitter < string > = new vscode . EventEmitter < string > ( ) ;
198
219
private readonly errorEmitter : vscode . EventEmitter < Error > = new vscode . EventEmitter < Error > ( ) ;
199
220
private readonly closeHandler : CloseHandler = new CloseHandler ( ) ;
221
+ private disposables : vscode . Disposable [ ] = [ ] ;
200
222
201
223
private spawnedProcess : child_process . ChildProcessWithoutNullStreams | undefined ;
202
224
203
225
constructor (
204
226
public readonly command : string ,
205
227
public readonly args : string [ ] ,
206
228
private readonly options : vscode . ProcessExecutionOptions = { }
207
- ) { }
229
+ ) {
230
+ this . disposables . push (
231
+ this . spawnEmitter ,
232
+ this . writeEmitter ,
233
+ this . errorEmitter ,
234
+ this . closeHandler
235
+ ) ;
236
+ }
208
237
209
238
spawn ( ) : void {
210
239
try {
@@ -231,12 +260,16 @@ export class ReadOnlySwiftProcess implements SwiftProcess {
231
260
232
261
this . spawnedProcess . once ( "exit" , code => {
233
262
this . closeHandler . handle ( code ?? undefined ) ;
234
- this . dispose ( ) ;
235
263
} ) ;
264
+
265
+ this . disposables . push (
266
+ this . onDidClose ( ( ) => {
267
+ this . dispose ( ) ;
268
+ } )
269
+ ) ;
236
270
} catch ( error ) {
237
271
this . errorEmitter . fire ( new Error ( `${ error } ` ) ) ;
238
272
this . closeHandler . handle ( ) ;
239
- this . dispose ( ) ;
240
273
}
241
274
}
242
275
@@ -260,6 +293,7 @@ export class ReadOnlySwiftProcess implements SwiftProcess {
260
293
this . spawnedProcess ?. stdout . removeAllListeners ( ) ;
261
294
this . spawnedProcess ?. stderr . removeAllListeners ( ) ;
262
295
this . spawnedProcess ?. removeAllListeners ( ) ;
296
+ this . disposables . forEach ( d => d . dispose ( ) ) ;
263
297
}
264
298
265
299
onDidSpawn : vscode . Event < void > = this . spawnEmitter . event ;
0 commit comments