提交 a3f7b53d 编写于 作者: S Sandeep Somavarapu

Fix #42594

上级 93681eb4
......@@ -130,7 +130,7 @@ abstract class AbstractFileOutputChannel extends Disposable {
protected model: ITextModel;
readonly file: URI;
private startOffset: number = 0;
protected startOffset: number = 0;
protected endOffset: number = 0;
constructor(
......@@ -164,38 +164,20 @@ abstract class AbstractFileOutputChannel extends Disposable {
this.startOffset = this.endOffset;
}
loadModel(): TPromise<ITextModel> {
return this.fileService.resolveContent(this.file, { position: this.startOffset })
.then(content => {
if (this.model) {
this.model.setValue(content.value);
} else {
this.model = this.createModel(content.value);
}
this.endOffset = this.startOffset + new Buffer(this.model.getValueLength()).byteLength;
return this.model;
});
}
resetModel(): TPromise<void> {
this.startOffset = 0;
this.endOffset = 0;
protected createModel(content: string): ITextModel {
if (this.model) {
return this.loadModel() as TPromise;
this.model.setValue(content);
} else {
this.model = this.modelService.createModel(content, this.modeService.getOrCreateMode(OUTPUT_MIME), this.modelUri);
this.onModelCreated(this.model);
const disposables: IDisposable[] = [];
disposables.push(this.model.onWillDispose(() => {
this.onModelWillDispose(this.model);
this.model = null;
dispose(disposables);
}));
}
return TPromise.as(null);
}
private createModel(content: string): ITextModel {
const model = this.modelService.createModel(content, this.modeService.getOrCreateMode(OUTPUT_MIME), this.modelUri);
this.onModelCreated(model);
const disposables: IDisposable[] = [];
disposables.push(model.onWillDispose(() => {
this.onModelWillDispose(model);
this.model = null;
dispose(disposables);
}));
return model;
return this.model;
}
appendToModel(content: string): void {
......@@ -227,7 +209,6 @@ class OutputChannelBackedByFile extends AbstractFileOutputChannel implements Out
private loadingFromFileInProgress: boolean = false;
private resettingDelayer: ThrottledDelayer<void>;
private readonly rotatingFilePath: string;
private hasContentsToFlush: boolean = false;
constructor(
outputChannelIdentifier: IOutputChannelIdentifier,
......@@ -273,37 +254,50 @@ class OutputChannelBackedByFile extends AbstractFileOutputChannel implements Out
}
loadModel(): TPromise<ITextModel> {
this.startLoadingFromFile();
return super.loadModel()
.then(model => {
this.finishedLoadingFromFile();
return model;
this.loadingFromFileInProgress = true;
if (this.modelUpdater.isScheduled()) {
this.modelUpdater.cancel();
}
this.appendedMessage = '';
return this.loadFile()
.then(content => {
if (this.endOffset !== this.startOffset + new Buffer(content).byteLength) {
// Queue content is not written into the file
// Flush it and load file again
this.flush();
return this.loadFile();
}
return content;
})
.then(content => {
if (this.appendedMessage) {
this.write(this.appendedMessage);
this.appendedMessage = '';
}
this.loadingFromFileInProgress = false;
return this.createModel(content);
});
}
protected updateModel(): void {
if (this.model && this.appendedMessage) {
this.appendToModel(this.appendedMessage);
this.appendedMessage = '';
private resetModel(): TPromise<void> {
this.startOffset = 0;
this.endOffset = 0;
if (this.model) {
return this.loadModel() as TPromise;
}
return TPromise.as(null);
}
private startLoadingFromFile(): void {
this.loadingFromFileInProgress = true;
this.flush();
if (this.modelUpdater.isScheduled()) {
this.modelUpdater.cancel();
}
this.appendedMessage = '';
private loadFile(): TPromise<string> {
return this.fileService.resolveContent(this.file, { position: this.startOffset })
.then(content => this.appendedMessage ? content.value + this.appendedMessage : content.value);
}
private finishedLoadingFromFile(): void {
if (this.appendedMessage) {
this.write(this.appendedMessage);
protected updateModel(): void {
if (this.model && this.appendedMessage) {
this.appendToModel(this.appendedMessage);
this.appendedMessage = '';
}
this.loadingFromFileInProgress = false;
}
private onFileChangedInOutputDirector(eventType: string, fileName: string): void {
......@@ -315,14 +309,10 @@ class OutputChannelBackedByFile extends AbstractFileOutputChannel implements Out
private write(content: string): void {
this.outputWriter.critical(content);
this.hasContentsToFlush = true;
}
private flush(): void {
if (this.hasContentsToFlush) {
this.outputWriter.flush();
this.hasContentsToFlush = false;
}
this.outputWriter.flush();
}
}
......@@ -384,6 +374,14 @@ class FileOutputChannel extends AbstractFileOutputChannel implements OutputChann
this._register(toDisposable(() => this.fileHandler.unwatch()));
}
loadModel(): TPromise<ITextModel> {
return this.fileService.resolveContent(this.file, { position: this.startOffset })
.then(content => {
this.endOffset = this.startOffset + new Buffer(content.value).byteLength;
return this.createModel(content.value);
});
}
append(message: string): void {
throw new Error('Not supported');
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册