Skip to content

Commit 7ce5fe0

Browse files
author
Benjamin Pasero
committed
Preserve word wrap state in target file when saving untitled file (fix microsoft#33840)
1 parent ceabb06 commit 7ce5fe0

5 files changed

Lines changed: 35 additions & 5 deletions

File tree

src/vs/editor/browser/services/abstractCodeEditorService.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ export abstract class AbstractCodeEditorService extends Disposable implements IC
120120
return this._transientWatchers[uri].get(key);
121121
}
122122

123+
public getTransientModelProperties(model: ITextModel): [string, any][] | undefined {
124+
const uri = model.uri.toString();
125+
126+
if (!this._transientWatchers.hasOwnProperty(uri)) {
127+
return undefined;
128+
}
129+
130+
return this._transientWatchers[uri].keys().map(key => [key, this._transientWatchers[uri].get(key)]);
131+
}
132+
123133
_removeWatcher(w: ModelTransientSettingWatcher): void {
124134
delete this._transientWatchers[w.uri];
125135
}
@@ -145,4 +155,8 @@ export class ModelTransientSettingWatcher {
145155
public get(key: string): any {
146156
return this._values[key];
147157
}
158+
159+
public keys(): string[] {
160+
return Object.keys(this._values);
161+
}
148162
}

src/vs/editor/browser/services/codeEditorService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export interface ICodeEditorService {
4343

4444
setTransientModelProperty(model: ITextModel, key: string, value: any): void;
4545
getTransientModelProperty(model: ITextModel, key: string): any;
46+
getTransientModelProperties(model: ITextModel): [string, any][] | undefined;
4647

4748
getActiveCodeEditor(): ICodeEditor | null;
4849
openCodeEditor(input: IResourceInput, source: ICodeEditor | null, sideBySide?: boolean): Promise<ICodeEditor | null>;

src/vs/workbench/services/textfile/browser/textFileService.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { IFilesConfigurationService } from 'vs/workbench/services/filesConfigura
3232
import { CancellationToken } from 'vs/base/common/cancellation';
3333
import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService';
3434
import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel';
35+
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
3536

3637
/**
3738
* The workbench file service implementation implements the raw file service spec and adds additional methods on top.
@@ -70,7 +71,8 @@ export abstract class AbstractTextFileService extends Disposable implements ITex
7071
@IEditorService private readonly editorService: IEditorService,
7172
@ITextResourceConfigurationService protected readonly textResourceConfigurationService: ITextResourceConfigurationService,
7273
@IFilesConfigurationService protected readonly filesConfigurationService: IFilesConfigurationService,
73-
@ITextModelService private readonly textModelService: ITextModelService
74+
@ITextModelService private readonly textModelService: ITextModelService,
75+
@ICodeEditorService private readonly codeEditorService: ICodeEditorService
7476
) {
7577
super();
7678

@@ -517,6 +519,14 @@ export abstract class AbstractTextFileService extends Disposable implements ITex
517519
if (sourceMode.language !== PLAINTEXT_MODE_ID && targetMode.language === PLAINTEXT_MODE_ID) {
518520
targetTextModel.setMode(sourceMode); // only use if more specific than plain/text
519521
}
522+
523+
// transient properties
524+
const sourceTransientProperties = this.codeEditorService.getTransientModelProperties(sourceTextModel);
525+
if (sourceTransientProperties) {
526+
for (const [key, value] of sourceTransientProperties) {
527+
this.codeEditorService.setTransientModelProperty(targetTextModel, key, value);
528+
}
529+
}
520530
}
521531

522532
// save model

src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic
3838
import { assign } from 'vs/base/common/objects';
3939
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
4040
import { ITextModelService } from 'vs/editor/common/services/resolverService';
41+
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
4142

4243
export class NativeTextFileService extends AbstractTextFileService {
4344

@@ -55,9 +56,10 @@ export class NativeTextFileService extends AbstractTextFileService {
5556
@ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService,
5657
@IProductService private readonly productService: IProductService,
5758
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService,
58-
@ITextModelService textModelService: ITextModelService
59+
@ITextModelService textModelService: ITextModelService,
60+
@ICodeEditorService codeEditorService: ICodeEditorService
5961
) {
60-
super(fileService, untitledTextEditorService, lifecycleService, instantiationService, modelService, environmentService, historyService, dialogService, fileDialogService, editorService, textResourceConfigurationService, filesConfigurationService, textModelService);
62+
super(fileService, untitledTextEditorService, lifecycleService, instantiationService, modelService, environmentService, historyService, dialogService, fileDialogService, editorService, textResourceConfigurationService, filesConfigurationService, textModelService, codeEditorService);
6163
}
6264

6365
private _encoding: EncodingOracle | undefined;

src/vs/workbench/test/workbenchTestServices.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,8 @@ export class TestTextFileService extends NativeTextFileService {
207207
@ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService,
208208
@IProductService productService: IProductService,
209209
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService,
210-
@ITextModelService textModelService: ITextModelService
210+
@ITextModelService textModelService: ITextModelService,
211+
@ICodeEditorService codeEditorService: ICodeEditorService
211212
) {
212213
super(
213214
fileService,
@@ -223,7 +224,8 @@ export class TestTextFileService extends NativeTextFileService {
223224
textResourceConfigurationService,
224225
productService,
225226
filesConfigurationService,
226-
textModelService
227+
textModelService,
228+
codeEditorService
227229
);
228230
}
229231

@@ -1238,6 +1240,7 @@ export class TestCodeEditorService implements ICodeEditorService {
12381240
resolveDecorationOptions(_typeKey: string, _writable: boolean): IModelDecorationOptions { return Object.create(null); }
12391241
setTransientModelProperty(_model: ITextModel, _key: string, _value: any): void { }
12401242
getTransientModelProperty(_model: ITextModel, _key: string) { }
1243+
getTransientModelProperties(_model: ITextModel) { return undefined; }
12411244
getActiveCodeEditor(): ICodeEditor | null { return null; }
12421245
openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise<ICodeEditor | null> { return Promise.resolve(null); }
12431246
}

0 commit comments

Comments
 (0)