Skip to content

Commit 144e913

Browse files
committed
Synchronize only attached models to the TM worker
1 parent 9b0f7c0 commit 144e913

3 files changed

Lines changed: 51 additions & 8 deletions

File tree

src/vs/editor/common/model.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,12 @@ export interface ITextModel {
11161116
* @internal
11171117
*/
11181118
onDidChangeTokens(listener: (e: IModelTokensChangedEvent) => void): IDisposable;
1119+
/**
1120+
* An event emitted when the model has been attached to the first editor or detached from the last editor.
1121+
* @event
1122+
* @internal
1123+
*/
1124+
onDidChangeAttached(listener: () => void): IDisposable;
11191125
/**
11201126
* An event emitted right before disposing the model.
11211127
* @event

src/vs/editor/common/model/textModel.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ export class TextModel extends Disposable implements model.ITextModel {
233233
private readonly _onDidChangeOptions: Emitter<IModelOptionsChangedEvent> = this._register(new Emitter<IModelOptionsChangedEvent>());
234234
public readonly onDidChangeOptions: Event<IModelOptionsChangedEvent> = this._onDidChangeOptions.event;
235235

236+
private readonly _onDidChangeAttached: Emitter<void> = this._register(new Emitter<void>());
237+
public readonly onDidChangeAttached: Event<void> = this._onDidChangeAttached.event;
238+
236239
private readonly _eventEmitter: DidChangeContentEmitter = this._register(new DidChangeContentEmitter());
237240
public onDidChangeRawContentFast(listener: (e: ModelRawContentChangedEvent) => void): IDisposable {
238241
return this._eventEmitter.fastEvent((e: InternalModelContentChangeEvent) => listener(e.rawContentChangedEvent));
@@ -555,10 +558,16 @@ export class TextModel extends Disposable implements model.ITextModel {
555558
this._attachedEditorCount++;
556559
// Warm up tokens for the editor
557560
this._warmUpTokens();
561+
if (this._attachedEditorCount === 1) {
562+
this._onDidChangeAttached.fire(undefined);
563+
}
558564
}
559565

560566
public onBeforeDetached(): void {
561567
this._attachedEditorCount--;
568+
if (this._attachedEditorCount === 0) {
569+
this._onDidChangeAttached.fire(undefined);
570+
}
562571
}
563572

564573
private _shouldAutoTokenize(): boolean {

src/vs/workbench/services/textMate/electron-browser/textMateService.ts

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,32 +26,60 @@ class ModelWorkerTextMateTokenizer extends Disposable {
2626

2727
private readonly _worker: TextMateWorker;
2828
private readonly _model: ITextModel;
29+
private _isSynced: boolean;
2930

3031
constructor(worker: TextMateWorker, model: ITextModel) {
3132
super();
3233
this._worker = worker;
3334
this._model = model;
35+
this._isSynced = false;
3436

37+
this._register(this._model.onDidChangeAttached(() => this._onDidChangeAttached()));
38+
this._onDidChangeAttached();
39+
40+
this._register(this._model.onDidChangeContent((e) => {
41+
if (this._isSynced) {
42+
this._worker.acceptModelChanged(this._model.uri.toString(), e);
43+
}
44+
}));
45+
46+
this._register(this._model.onDidChangeLanguage((e) => {
47+
if (this._isSynced) {
48+
this._worker.acceptModelLanguageChanged(this._model.uri.toString(), this._model.getLanguageIdentifier().id);
49+
}
50+
}));
51+
}
52+
53+
private _onDidChangeAttached(): void {
54+
if (this._model.isAttachedToEditor()) {
55+
if (!this._isSynced) {
56+
this._beginSync();
57+
}
58+
} else {
59+
if (this._isSynced) {
60+
this._endSync();
61+
}
62+
}
63+
}
64+
65+
private _beginSync(): void {
66+
this._isSynced = true;
3567
this._worker.acceptNewModel({
3668
uri: this._model.uri,
3769
versionId: this._model.getVersionId(),
3870
lines: this._model.getLinesContent(),
3971
EOL: this._model.getEOL(),
4072
languageId: this._model.getLanguageIdentifier().id,
4173
});
74+
}
4275

43-
this._register(this._model.onDidChangeContent((e) => {
44-
this._worker.acceptModelChanged(this._model.uri.toString(), e);
45-
}));
46-
47-
this._register(this._model.onDidChangeLanguage((e) => {
48-
this._worker.acceptModelLanguageChanged(this._model.uri.toString(), this._model.getLanguageIdentifier().id);
49-
}));
76+
private _endSync(): void {
77+
this._worker.acceptRemovedModel(this._model.uri.toString());
5078
}
5179

5280
public dispose() {
5381
super.dispose();
54-
this._worker.acceptRemovedModel(this._model.uri.toString());
82+
this._endSync();
5583
}
5684
}
5785

0 commit comments

Comments
 (0)