Skip to content

Commit dac2e27

Browse files
author
Benjamin Pasero
committed
files2 - move encoding out of fileservice
1 parent 3d67364 commit dac2e27

9 files changed

Lines changed: 48 additions & 51 deletions

File tree

src/vs/platform/files/common/files.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { VSBuffer, VSBufferReadable } from 'vs/base/common/buffer';
1818
export const IFileService = createDecorator<IFileService>('fileService');
1919

2020
export interface IResourceEncodings {
21-
getWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding;
21+
getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding;
2222
}
2323

2424
export interface IResourceEncoding {
@@ -65,11 +65,6 @@ export interface IFileService {
6565

6666
//#endregion
6767

68-
/**
69-
* Helper to determine read/write encoding for resources.
70-
*/
71-
encoding: IResourceEncodings;
72-
7368
/**
7469
* Allows to listen for file changes. The event will fire for every file within the opened workspace
7570
* (if any) as well as all files that have been watched explicitly using the #watch() API.

src/vs/workbench/services/files/node/encoding.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export class ResourceEncodings extends Disposable implements IResourceEncodings
7878
return this.getEncodingForResource(resource, preferredEncoding);
7979
}
8080

81-
getWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding {
81+
getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding {
8282
const resourceEncoding = this.getEncodingForResource(resource, preferredEncoding);
8383

8484
return {

src/vs/workbench/services/files2/common/fileService2.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Disposable, IDisposable, toDisposable, combinedDisposable, dispose } from 'vs/base/common/lifecycle';
7-
import { IFileService, IResolveFileOptions, IResourceEncodings, FileChangesEvent, FileOperationEvent, IFileSystemProviderRegistrationEvent, IFileSystemProvider, IFileStat, IResolveFileResult, IResolveContentOptions, IContent, IStreamContent, ICreateFileOptions, IFileSystemProviderActivationEvent, FileOperationError, FileOperationResult, FileOperation, FileSystemProviderCapabilities, FileType, toFileSystemProviderErrorCode, FileSystemProviderErrorCode, IStat, IFileStatWithMetadata, IResolveMetadataFileOptions, etag, hasReadWriteCapability, hasFileFolderCopyCapability, hasOpenReadWriteCloseCapability, toFileOperationResult, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadWriteCapability, IResolveFileResultWithMetadata, IWatchOptions, ILegacyFileService, IWriteFileOptions } from 'vs/platform/files/common/files';
7+
import { IFileService, IResolveFileOptions, FileChangesEvent, FileOperationEvent, IFileSystemProviderRegistrationEvent, IFileSystemProvider, IFileStat, IResolveFileResult, IResolveContentOptions, IContent, IStreamContent, ICreateFileOptions, IFileSystemProviderActivationEvent, FileOperationError, FileOperationResult, FileOperation, FileSystemProviderCapabilities, FileType, toFileSystemProviderErrorCode, FileSystemProviderErrorCode, IStat, IFileStatWithMetadata, IResolveMetadataFileOptions, etag, hasReadWriteCapability, hasFileFolderCopyCapability, hasOpenReadWriteCloseCapability, toFileOperationResult, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadWriteCapability, IResolveFileResultWithMetadata, IWatchOptions, ILegacyFileService, IWriteFileOptions } from 'vs/platform/files/common/files';
88
import { URI } from 'vs/base/common/uri';
99
import { Event, Emitter } from 'vs/base/common/event';
1010
import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
@@ -288,14 +288,6 @@ export class FileService2 extends Disposable implements IFileService {
288288

289289
//#region File Reading/Writing
290290

291-
get encoding(): IResourceEncodings {
292-
if (!this._legacy) {
293-
throw new Error('Legacy file service not ready yet');
294-
}
295-
296-
return this._legacy.encoding;
297-
}
298-
299291
async createFile(resource: URI, bufferOrReadable: VSBuffer | VSBufferReadable = VSBuffer.fromString(''), options?: ICreateFileOptions): Promise<IFileStatWithMetadata> {
300292

301293
// validate overwrite

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

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
273273
size: 0,
274274
etag: etag(Date.now(), 0),
275275
value: createTextBufferFactory(''), /* will be filled later from backup */
276-
encoding: this.fileService.encoding.getWriteEncoding(this.resource, this.preferredEncoding).encoding,
276+
encoding: this.textFileService.encoding.getPreferredWriteEncoding(this.resource, this.preferredEncoding).encoding,
277277
isReadonly: false
278278
};
279279

@@ -346,31 +346,30 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
346346
}
347347
}
348348

349-
private loadWithContent(content: IRawTextContent, options?: ILoadOptions, backup?: URI): Promise<TextFileEditorModel> {
350-
return this.doLoadWithContent(content, backup).then(model => {
349+
private async loadWithContent(content: IRawTextContent, options?: ILoadOptions, backup?: URI): Promise<TextFileEditorModel> {
350+
const model = await this.doLoadWithContent(content, backup);
351351

352-
// Telemetry: We log the fileGet telemetry event after the model has been loaded to ensure a good mimetype
353-
const settingsType = this.getTypeIfSettings();
354-
if (settingsType) {
355-
/* __GDPR__
356-
"settingsRead" : {
357-
"settingsType": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
358-
}
359-
*/
360-
this.telemetryService.publicLog('settingsRead', { settingsType }); // Do not log read to user settings.json and .vscode folder as a fileGet event as it ruins our JSON usage data
361-
} else {
362-
/* __GDPR__
363-
"fileGet" : {
364-
"${include}": [
365-
"${FileTelemetryData}"
366-
]
367-
}
368-
*/
369-
this.telemetryService.publicLog('fileGet', this.getTelemetryData(options && options.reason ? options.reason : LoadReason.OTHER));
370-
}
352+
// Telemetry: We log the fileGet telemetry event after the model has been loaded to ensure a good mimetype
353+
const settingsType = this.getTypeIfSettings();
354+
if (settingsType) {
355+
/* __GDPR__
356+
"settingsRead" : {
357+
"settingsType": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
358+
}
359+
*/
360+
this.telemetryService.publicLog('settingsRead', { settingsType }); // Do not log read to user settings.json and .vscode folder as a fileGet event as it ruins our JSON usage data
361+
} else {
362+
/* __GDPR__
363+
"fileGet" : {
364+
"${include}": [
365+
"${FileTelemetryData}"
366+
]
367+
}
368+
*/
369+
this.telemetryService.publicLog('fileGet', this.getTelemetryData(options && options.reason ? options.reason : LoadReason.OTHER));
370+
}
371371

372-
return model;
373-
});
372+
return model;
374373
}
375374

376375
private doLoadWithContent(content: IRawTextContent, backup?: URI): Promise<TextFileEditorModel> {

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { IResult, ITextFileOperationResult, ITextFileService, IRawTextContent, I
1515
import { ConfirmResult, IRevertOptions } from 'vs/workbench/common/editor';
1616
import { ILifecycleService, ShutdownReason, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
1717
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
18-
import { IFileService, IResolveContentOptions, IFilesConfiguration, FileOperationError, FileOperationResult, AutoSaveConfiguration, HotExitConfiguration, ITextSnapshot, IWriteTextFileOptions, IFileStatWithMetadata, toBufferOrReadable, ICreateFileOptions } from 'vs/platform/files/common/files';
18+
import { IFileService, IResolveContentOptions, IFilesConfiguration, FileOperationError, FileOperationResult, AutoSaveConfiguration, HotExitConfiguration, ITextSnapshot, IWriteTextFileOptions, IFileStatWithMetadata, toBufferOrReadable, ICreateFileOptions, IResourceEncodings, IResourceEncoding } from 'vs/platform/files/common/files';
1919
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
2020
import { Disposable } from 'vs/base/common/lifecycle';
2121
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
@@ -57,6 +57,12 @@ export class TextFileService extends Disposable implements ITextFileService {
5757
private _models: TextFileEditorModelManager;
5858
get models(): ITextFileEditorModelManager { return this._models; }
5959

60+
readonly encoding: IResourceEncodings = {
61+
getPreferredWriteEncoding(): IResourceEncoding {
62+
return { encoding: 'utf8', hasBOM: false };
63+
}
64+
};
65+
6066
private currentFilesAssociationConfig: { [key: string]: string; };
6167
private configuredAutoSaveDelay?: number;
6268
private configuredAutoSaveOnFocusChange: boolean;

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { URI } from 'vs/base/common/uri';
77
import { Event } from 'vs/base/common/event';
88
import { IDisposable } from 'vs/base/common/lifecycle';
99
import { IEncodingSupport, ConfirmResult, IRevertOptions } from 'vs/workbench/common/editor';
10-
import { IResolveContentOptions, ITextSnapshot, IBaseStatWithMetadata, IWriteTextFileOptions, IFileStatWithMetadata } from 'vs/platform/files/common/files';
10+
import { IResolveContentOptions, ITextSnapshot, IBaseStatWithMetadata, IWriteTextFileOptions, IFileStatWithMetadata, IResourceEncodings } from 'vs/platform/files/common/files';
1111
import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
1212
import { ITextEditorModel } from 'vs/editor/common/services/resolverService';
1313
import { ITextBufferFactory, ITextModel } from 'vs/editor/common/model';
@@ -274,7 +274,9 @@ export interface ITextFileService extends IDisposable {
274274
_serviceBrand: ServiceIdentifier<any>;
275275

276276
readonly onWillMove: Event<IWillMoveEvent>;
277+
277278
readonly onAutoSaveConfigurationChange: Event<IAutoSaveConfiguration>;
279+
278280
readonly onFilesAssociationChange: Event<void>;
279281

280282
readonly isHotExitEnabled: boolean;
@@ -284,6 +286,11 @@ export interface ITextFileService extends IDisposable {
284286
*/
285287
readonly models: ITextFileEditorModelManager;
286288

289+
/**
290+
* Helper to determine encoding for resources.
291+
*/
292+
readonly encoding: IResourceEncodings;
293+
287294
/**
288295
* A resource is dirty if it has unsaved changes or is an untitled file not yet saved.
289296
*

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { TextFileService } from 'vs/workbench/services/textfile/common/textFileS
99
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
1010
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
1111
import { URI } from 'vs/base/common/uri';
12-
import { ITextSnapshot, IWriteTextFileOptions, IFileStatWithMetadata, IResourceEncoding, IResolveContentOptions, stringToSnapshot, ICreateFileOptions, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files';
12+
import { ITextSnapshot, IWriteTextFileOptions, IFileStatWithMetadata, IResourceEncoding, IResolveContentOptions, stringToSnapshot, ICreateFileOptions, FileOperationError, FileOperationResult, IResourceEncodings } from 'vs/platform/files/common/files';
1313
import { Schemas } from 'vs/base/common/network';
1414
import { exists, stat, chmod, rimraf } from 'vs/base/node/pfs';
1515
import { join, dirname } from 'vs/base/common/path';
@@ -29,7 +29,7 @@ import { isUndefinedOrNull } from 'vs/base/common/types';
2929
export class NodeTextFileService extends TextFileService {
3030

3131
private _encoding: EncodingOracle;
32-
protected get encoding(): EncodingOracle {
32+
get encoding(): EncodingOracle {
3333
if (!this._encoding) {
3434
this._encoding = this._register(this.instantiationService.createInstance(EncodingOracle));
3535
}
@@ -246,7 +246,7 @@ export interface IEncodingOverride {
246246
encoding: string;
247247
}
248248

249-
export class EncodingOracle extends Disposable {
249+
export class EncodingOracle extends Disposable implements IResourceEncodings {
250250
protected encodingOverrides: IEncodingOverride[];
251251

252252
constructor(
@@ -285,7 +285,7 @@ export class EncodingOracle extends Disposable {
285285
}
286286

287287
async getWriteEncoding(resource: URI, options?: IWriteTextFileOptions): Promise<{ encoding: string, addBOM: boolean }> {
288-
const { encoding, hasBOM } = this.doGetWriteEncoding(resource, options ? options.encoding : undefined);
288+
const { encoding, hasBOM } = this.getPreferredWriteEncoding(resource, options ? options.encoding : undefined);
289289

290290
// Some encodings come with a BOM automatically
291291
if (hasBOM) {
@@ -302,7 +302,7 @@ export class EncodingOracle extends Disposable {
302302
return { encoding, addBOM: false };
303303
}
304304

305-
private doGetWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding {
305+
getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding {
306306
const resourceEncoding = this.getEncodingForResource(resource, preferredEncoding);
307307

308308
return {

src/vs/workbench/services/textfile/test/textFileService.io.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class ServiceAccessor {
4949
class TestNodeTextFileService extends NodeTextFileService {
5050

5151
private _testEncoding: TestEncodingOracle;
52-
protected get encoding(): TestEncodingOracle {
52+
get encoding(): TestEncodingOracle {
5353
if (!this._testEncoding) {
5454
this._testEncoding = this._register(this.instantiationService.createInstance(TestEncodingOracle));
5555
}

src/vs/workbench/test/workbenchTestServices.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchS
2626
import { ILifecycleService, BeforeShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase, WillShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle';
2727
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
2828
import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService';
29-
import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, IContent, IStreamContent, ICreateFileOptions, ITextSnapshot, IResourceEncodings, IResourceEncoding, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions } from 'vs/platform/files/common/files';
29+
import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, IContent, IStreamContent, ICreateFileOptions, ITextSnapshot, IResourceEncoding, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions } from 'vs/platform/files/common/files';
3030
import { IModelService } from 'vs/editor/common/services/modelService';
3131
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
3232
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
@@ -890,8 +890,6 @@ export class TestFileService implements IFileService {
890890

891891
public _serviceBrand: any;
892892

893-
public encoding: IResourceEncodings;
894-
895893
private readonly _onFileChanges: Emitter<FileChangesEvent>;
896894
private readonly _onAfterOperation: Emitter<FileOperationEvent>;
897895

0 commit comments

Comments
 (0)