Skip to content

Commit 04fa41c

Browse files
authored
Fixes some memory leaks reported in #281077 (#281972)
1 parent 8a175dc commit 04fa41c

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { mapFindFirst } from '../../../../../base/common/arraysFind.js';
77
import { itemsEquals } from '../../../../../base/common/equals.js';
88
import { BugIndicatingError, onUnexpectedExternalError } from '../../../../../base/common/errors.js';
99
import { Emitter } from '../../../../../base/common/event.js';
10-
import { Disposable } from '../../../../../base/common/lifecycle.js';
10+
import { Disposable, DisposableStore } from '../../../../../base/common/lifecycle.js';
1111
import { IObservable, IObservableWithChange, IReader, ITransaction, autorun, constObservable, derived, derivedHandleChanges, derivedOpts, mapObservableArrayCached, observableFromEvent, observableSignal, observableValue, recomputeInitiallyAndOnChange, subtransaction, transaction } from '../../../../../base/common/observable.js';
1212
import { firstNonWhitespaceIndex } from '../../../../../base/common/strings.js';
1313
import { isDefined } from '../../../../../base/common/types.js';
@@ -143,7 +143,7 @@ export class InlineCompletionsModel extends Disposable {
143143
const snippetController = SnippetController2.get(this._editor);
144144
this._isInSnippetMode = snippetController?.isInSnippetObservable ?? constObservable(false);
145145

146-
defaultAccountService.getDefaultAccount().then(account => this.sku.set(skuFromAccount(account), undefined));
146+
defaultAccountService.getDefaultAccount().then(createDisposableCb(account => this.sku.set(skuFromAccount(account), undefined), this._store));
147147
this._register(defaultAccountService.onDidChangeDefaultAccount(account => this.sku.set(skuFromAccount(account), undefined)));
148148

149149
this._typing = this._register(new TypingInterval(this.textModel));
@@ -1280,3 +1280,25 @@ function skuFromAccount(account: IDefaultAccount | null): InlineSuggestSku | und
12801280
}
12811281
return undefined;
12821282
}
1283+
1284+
class DisposableCallback<T> {
1285+
private _cb: ((e: T) => void) | undefined;
1286+
1287+
constructor(cb: (e: T) => void) {
1288+
this._cb = cb;
1289+
}
1290+
1291+
dispose(): void {
1292+
this._cb = undefined;
1293+
}
1294+
1295+
readonly handler = (val: T) => {
1296+
return this._cb?.(val);
1297+
};
1298+
}
1299+
1300+
function createDisposableCb<T>(cb: (e: T) => void, store: DisposableStore): (e: T) => void {
1301+
const dcb = new DisposableCallback(cb);
1302+
store.add(dcb);
1303+
return dcb.handler;
1304+
}

0 commit comments

Comments
 (0)