Skip to content

Commit d275d09

Browse files
author
Benjamin Pasero
committed
text models - reduce need for isResolved()
1 parent c6750ff commit d275d09

3 files changed

Lines changed: 16 additions & 26 deletions

File tree

src/vs/workbench/common/editor/textEditorModel.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ export class BaseTextEditorModel extends EditorModel implements ITextEditorModel
8181
* Creates the text editor model with the provided value, optional preferred mode
8282
* (can be comma separated for multiple values) and optional resource URL.
8383
*/
84-
protected createTextEditorModel(value: ITextBufferFactory, resource: URI | undefined, preferredMode?: string): EditorModel {
84+
protected createTextEditorModel(value: ITextBufferFactory, resource: URI | undefined, preferredMode?: string): ITextModel {
8585
const firstLineText = this.getFirstLineText(value);
8686
const languageSelection = this.getOrCreateMode(resource, this.modeService, preferredMode, firstLineText);
8787

8888
return this.doCreateTextEditorModel(value, languageSelection, resource);
8989
}
9090

91-
private doCreateTextEditorModel(value: ITextBufferFactory, languageSelection: ILanguageSelection, resource: URI | undefined): EditorModel {
91+
private doCreateTextEditorModel(value: ITextBufferFactory, languageSelection: ILanguageSelection, resource: URI | undefined): ITextModel {
9292
let model = resource && this.modelService.getModel(resource);
9393
if (!model) {
9494
model = this.modelService.createModel(value, languageSelection, resource);
@@ -102,7 +102,7 @@ export class BaseTextEditorModel extends EditorModel implements ITextEditorModel
102102

103103
this.textEditorModelHandle = model.uri;
104104

105-
return this;
105+
return model;
106106
}
107107

108108
protected getFirstLineText(value: ITextBufferFactory | ITextModel): string {

src/vs/workbench/common/editor/untitledTextEditorModel.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { IModelService } from 'vs/editor/common/services/modelService';
1111
import { Emitter } from 'vs/base/common/event';
1212
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
1313
import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService';
14-
import { ITextBufferFactory } from 'vs/editor/common/model';
14+
import { ITextBufferFactory, ITextModel } from 'vs/editor/common/model';
1515
import { createTextBufferFactory } from 'vs/editor/common/model/textModel';
1616
import { IResolvedTextEditorModel, ITextEditorModel } from 'vs/editor/common/services/resolverService';
1717
import { IWorkingCopyService, IWorkingCopy, WorkingCopyCapabilities, IWorkingCopyBackup } from 'vs/workbench/services/workingCopy/common/workingCopyService';
@@ -189,7 +189,7 @@ export class UntitledTextEditorModel extends BaseTextEditorModel implements IUnt
189189

190190
// Listen to text model events
191191
const textEditorModel = assertIsDefined(this.textEditorModel);
192-
this._register(textEditorModel.onDidChangeContent(e => this.onModelContentChanged(e)));
192+
this._register(textEditorModel.onDidChangeContent(e => this.onModelContentChanged(textEditorModel, e)));
193193
this._register(textEditorModel.onDidChangeLanguage(() => this.onConfigurationChange())); // mode change can have impact on config
194194

195195
// Name
@@ -209,16 +209,12 @@ export class UntitledTextEditorModel extends BaseTextEditorModel implements IUnt
209209
return this as UntitledTextEditorModel & IResolvedTextEditorModel;
210210
}
211211

212-
private onModelContentChanged(e: IModelContentChangedEvent): void {
213-
if (!this.isResolved()) {
214-
return;
215-
}
216-
212+
private onModelContentChanged(model: ITextModel, e: IModelContentChangedEvent): void {
217213
this.versionId++;
218214

219215
// mark the untitled text editor as non-dirty once its content becomes empty and we do
220216
// not have an associated path set. we never want dirty indicator in that case.
221-
if (!this.hasAssociatedFilePath && this.textEditorModel.getLineCount() === 1 && this.textEditorModel.getLineContent(1) === '') {
217+
if (!this.hasAssociatedFilePath && model.getLineCount() === 1 && model.getLineContent(1) === '') {
222218
this.setDirty(false);
223219
}
224220

src/vs/workbench/services/textfile/common/textFileEditorModel.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { IFileService, FileOperationError, FileOperationResult, FileChangesEvent
1515
import { IModeService } from 'vs/editor/common/services/modeService';
1616
import { IModelService } from 'vs/editor/common/services/modelService';
1717
import { timeout } from 'vs/base/common/async';
18-
import { ITextBufferFactory } from 'vs/editor/common/model';
18+
import { ITextBufferFactory, ITextModel } from 'vs/editor/common/model';
1919
import { INotificationService } from 'vs/platform/notification/common/notification';
2020
import { ILogService } from 'vs/platform/log/common/log';
2121
import { basename } from 'vs/base/common/path';
@@ -393,7 +393,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
393393
}
394394

395395
// Update Existing Model
396-
if (this.isResolved()) {
396+
if (this.textEditorModel) {
397397
this.doUpdateTextModel(content.value);
398398
}
399399

@@ -412,7 +412,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
412412
this.logService.trace('[text file model] load() - created text editor model', this.resource.toString());
413413

414414
// Create model
415-
this.createTextEditorModel(value, resource, this.preferredMode);
415+
const textModel = this.createTextEditorModel(value, resource, this.preferredMode);
416416

417417
// We restored a backup so we have to set the model as being dirty
418418
if (fromBackup) {
@@ -425,7 +425,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
425425
}
426426

427427
// Model Listeners
428-
this.installModelListeners();
428+
this.installModelListeners(textModel);
429429
}
430430

431431
private doUpdateTextModel(value: ITextBufferFactory): void {
@@ -446,19 +446,17 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
446446
this.updateSavedVersionId();
447447
}
448448

449-
private installModelListeners(): void {
449+
private installModelListeners(model: ITextModel): void {
450450

451451
// See https://github.com/Microsoft/vscode/issues/30189
452452
// This code has been extracted to a different method because it caused a memory leak
453453
// where `value` was captured in the content change listener closure scope.
454454

455455
// Content Change
456-
if (this.isResolved()) {
457-
this._register(this.textEditorModel.onDidChangeContent(() => this.onModelContentChanged()));
458-
}
456+
this._register(model.onDidChangeContent(() => this.onModelContentChanged(model)));
459457
}
460458

461-
private onModelContentChanged(): void {
459+
private onModelContentChanged(model: ITextModel): void {
462460
this.logService.trace(`[text file model] onModelContentChanged() - enter`, this.resource.toString());
463461

464462
// In any case increment the version id because it tracks the textual content state of the model at all times
@@ -472,7 +470,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
472470

473471
// The contents changed as a matter of Undo and the version reached matches the saved one
474472
// In this case we clear the dirty flag and emit a SAVED event to indicate this state.
475-
if (this.isResolved() && this.textEditorModel.getAlternativeVersionId() === this.bufferSavedVersionId) {
473+
if (model.getAlternativeVersionId() === this.bufferSavedVersionId) {
476474
this.logService.trace('[text file model] onModelContentChanged() - model content changed back to last saved version', this.resource.toString());
477475

478476
// Clear flags
@@ -739,11 +737,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
739737
this._onDidSaveError.fire();
740738
}
741739

742-
private doTouch(versionId: number, reason: SaveReason): Promise<void> {
743-
if (!this.isResolved()) {
744-
return Promise.resolve();
745-
}
746-
740+
private doTouch(this: TextFileEditorModel & IResolvedTextFileEditorModel, versionId: number, reason: SaveReason): Promise<void> {
747741
const lastResolvedFileStat = assertIsDefined(this.lastResolvedFileStat);
748742
return this.saveSequentializer.setPending(versionId, this.textFileService.write(lastResolvedFileStat.resource, this.createSnapshot(), {
749743
mtime: lastResolvedFileStat.mtime,

0 commit comments

Comments
 (0)