From 409e61c5cadcbd0347b23e3102ae3ebb5258b8f9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 15 Oct 2018 15:12:50 +0200 Subject: [PATCH] Fix #60955 --- .../common/services/modelServiceImpl.ts | 32 +++++++++++-------- .../common/services/resourceConfiguration.ts | 12 +++++++ .../test/tokenSelectionSupport.test.ts | 27 +++++++++++++++- .../standalone/browser/simpleServices.ts | 24 ++++++++++++-- .../standalone/browser/standaloneServices.ts | 8 +++-- .../test/common/services/modelService.test.ts | 24 +++++++++++++- src/vs/workbench/electron-browser/shell.ts | 9 ++++-- src/vs/workbench/parts/debug/node/debugger.ts | 6 +++- .../parts/debug/test/node/debugger.test.ts | 2 +- .../electron-browser/files.contribution.ts | 8 +++-- .../preferences/browser/preferencesService.ts | 4 +-- .../textResourcePropertiesService.ts | 27 ++++++++++++++++ .../api/mainThreadDocumentsAndEditors.test.ts | 4 +-- .../api/mainThreadEditors.test.ts | 4 +-- .../quickopen.perf.integrationTest.ts | 7 ++-- .../textsearch.perf.integrationTest.ts | 7 ++-- .../workbench/test/workbenchTestServices.ts | 24 +++++++++++++- 17 files changed, 190 insertions(+), 39 deletions(-) create mode 100644 src/vs/workbench/services/textfile/electron-browser/textResourcePropertiesService.ts diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 4770468891653..3dbdbcde9c69c 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -27,6 +27,7 @@ import { ITextModel, IModelDeltaDecoration, IModelDecorationOptions, TrackedRang import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { basename } from 'vs/base/common/paths'; import { isThenable } from 'vs/base/common/async'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; function MODEL_ID(resource: URI): string { return resource.toString(); @@ -206,18 +207,18 @@ class ModelMarkerHandler { } } +interface IRawEditorConfig { + tabSize?: any; + insertSpaces?: any; + detectIndentation?: any; + trimAutoWhitespace?: any; + creationOptions?: any; + largeFileOptimizations?: any; +} + interface IRawConfig { - files?: { - eol?: any; - }; - editor?: { - tabSize?: any; - insertSpaces?: any; - detectIndentation?: any; - trimAutoWhitespace?: any; - creationOptions?: any; - largeFileOptimizations?: any; - }; + eol?: any; + editor?: IRawEditorConfig; } const DEFAULT_EOL = (platform.isLinux || platform.isMacintosh) ? DefaultEndOfLine.LF : DefaultEndOfLine.CRLF; @@ -229,6 +230,7 @@ export class ModelServiceImpl extends Disposable implements IModelService { private _markerServiceSubscription: IDisposable; private _configurationService: IConfigurationService; private _configurationServiceSubscription: IDisposable; + private _resourcePropertiesService: ITextResourcePropertiesService; private readonly _onModelAdded: Emitter = this._register(new Emitter()); public readonly onModelAdded: Event = this._onModelAdded.event; @@ -251,10 +253,12 @@ export class ModelServiceImpl extends Disposable implements IModelService { constructor( @IMarkerService markerService: IMarkerService, @IConfigurationService configurationService: IConfigurationService, + @ITextResourcePropertiesService resourcePropertiesService: ITextResourcePropertiesService, ) { super(); this._markerService = markerService; this._configurationService = configurationService; + this._resourcePropertiesService = resourcePropertiesService; this._models = {}; this._modelCreationOptionsByLanguageAndResource = Object.create(null); @@ -284,7 +288,7 @@ export class ModelServiceImpl extends Disposable implements IModelService { } let newDefaultEOL = DEFAULT_EOL; - const eol = config.files && config.files.eol; + const eol = config.eol; if (eol === '\r\n') { newDefaultEOL = DefaultEndOfLine.CRLF; } else if (eol === '\n') { @@ -320,7 +324,9 @@ export class ModelServiceImpl extends Disposable implements IModelService { public getCreationOptions(language: string, resource: URI, isForSimpleWidget: boolean): ITextModelCreationOptions { let creationOptions = this._modelCreationOptionsByLanguageAndResource[language + resource]; if (!creationOptions) { - creationOptions = ModelServiceImpl._readModelOptions(this._configurationService.getValue({ overrideIdentifier: language, resource }), isForSimpleWidget); + const editor = this._configurationService.getValue('editor', { overrideIdentifier: language, resource }); + const eol = this._resourcePropertiesService.getEOL(resource); + creationOptions = ModelServiceImpl._readModelOptions({ editor, eol }, isForSimpleWidget); this._modelCreationOptionsByLanguageAndResource[language + resource] = creationOptions; } return creationOptions; diff --git a/src/vs/editor/common/services/resourceConfiguration.ts b/src/vs/editor/common/services/resourceConfiguration.ts index 8d4a738eb9b32..6ebd9523dfd62 100644 --- a/src/vs/editor/common/services/resourceConfiguration.ts +++ b/src/vs/editor/common/services/resourceConfiguration.ts @@ -32,4 +32,16 @@ export interface ITextResourceConfigurationService { getValue(resource: URI, section?: string): T; getValue(resource: URI, position?: IPosition, section?: string): T; +} + +export const ITextResourcePropertiesService = createDecorator('textResourcePropertiesService'); + +export interface ITextResourcePropertiesService { + + _serviceBrand: any; + + /** + * Returns the End of Line characters for the given resource + */ + getEOL(resource: URI): string; } \ No newline at end of file diff --git a/src/vs/editor/contrib/smartSelect/test/tokenSelectionSupport.test.ts b/src/vs/editor/contrib/smartSelect/test/tokenSelectionSupport.test.ts index 54f7e4601b952..633ce50319239 100644 --- a/src/vs/editor/contrib/smartSelect/test/tokenSelectionSupport.test.ts +++ b/src/vs/editor/contrib/smartSelect/test/tokenSelectionSupport.test.ts @@ -13,6 +13,9 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/javascriptOnEnterRules'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { isLinux, isMacintosh } from 'vs/base/common/platform'; class MockJSMode extends MockMode { @@ -40,7 +43,8 @@ suite('TokenSelectionSupport', () => { let mode: MockJSMode | null = null; setup(() => { - modelService = new ModelServiceImpl(null, new TestConfigurationService()); + const configurationService = new TestConfigurationService(); + modelService = new ModelServiceImpl(null, configurationService, new TestTextResourcePropertiesService(configurationService)); tokenSelectionSupport = new TokenSelectionSupport(modelService); mode = new MockJSMode(); }); @@ -161,3 +165,24 @@ suite('TokenSelectionSupport', () => { ]); }); }); + +class TestTextResourcePropertiesService implements ITextResourcePropertiesService { + + _serviceBrand: any; + + constructor( + @IConfigurationService private configurationService: IConfigurationService, + ) { + } + + getEOL(resource: URI): string { + const filesConfiguration = this.configurationService.getValue<{ eol: string }>('files'); + if (filesConfiguration && filesConfiguration.eol) { + if (filesConfiguration.eol !== 'auto') { + return filesConfiguration.eol; + } + } + return (isLinux || isMacintosh) ? '\n' : '\r\n'; + } +} + diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 186a6affe82db..04e9f46303c13 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -21,7 +21,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Configuration, DefaultConfigurationModel, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IProgressService, IProgressRunner } from 'vs/platform/progress/common/progress'; -import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; +import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; import { ITextModelService, ITextModelContentProvider, ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { IDisposable, IReference, ImmortalReference, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle'; import * as dom from 'vs/base/browser/dom'; @@ -32,7 +32,7 @@ import { Menu } from 'vs/platform/actions/common/menu'; import { ITelemetryService, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { ResolvedKeybinding, Keybinding, createKeybinding, SimpleKeybinding } from 'vs/base/common/keyCodes'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; -import { OS } from 'vs/base/common/platform'; +import { OS, isLinux, isMacintosh } from 'vs/base/common/platform'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; import { INotificationService, INotification, INotificationHandle, NoOpNotification, IPromptChoice, IPromptOptions } from 'vs/platform/notification/common/notification'; @@ -459,6 +459,26 @@ export class SimpleResourceConfigurationService implements ITextResourceConfigur } } +export class SimpleResourcePropertiesService implements ITextResourcePropertiesService { + + _serviceBrand: any; + + constructor( + @IConfigurationService private configurationService: IConfigurationService, + ) { + } + + getEOL(resource: URI): string { + const filesConfiguration = this.configurationService.getValue<{ eol: string }>('files'); + if (filesConfiguration && filesConfiguration.eol) { + if (filesConfiguration.eol !== 'auto') { + return filesConfiguration.eol; + } + } + return (isLinux || isMacintosh) ? '\n' : '\r\n'; + } +} + export class SimpleMenuService implements IMenuService { _serviceBrand: any; diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index ea773d814907d..6546e1e605335 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -23,7 +23,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { EditorWorkerServiceImpl } from 'vs/editor/common/services/editorWorkerServiceImpl'; -import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; +import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; @@ -32,7 +32,7 @@ import { StandaloneCodeEditorServiceImpl } from 'vs/editor/standalone/browser/st import { SimpleConfigurationService, SimpleResourceConfigurationService, SimpleMenuService, SimpleProgressService, StandaloneCommandService, StandaloneKeybindingService, SimpleNotificationService, - StandaloneTelemetryService, SimpleWorkspaceContextService, SimpleDialogService, SimpleBulkEditService, SimpleUriLabelService + StandaloneTelemetryService, SimpleWorkspaceContextService, SimpleDialogService, SimpleBulkEditService, SimpleUriLabelService, SimpleResourcePropertiesService } from 'vs/editor/standalone/browser/simpleServices'; import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyService'; import { IMenuService } from 'vs/platform/actions/common/actions'; @@ -120,6 +120,8 @@ export module StaticServices { export const resourceConfigurationService = define(ITextResourceConfigurationService, () => new SimpleResourceConfigurationService(configurationServiceImpl)); + export const resourcePropertiesService = define(ITextResourcePropertiesService, () => new SimpleResourcePropertiesService(configurationServiceImpl)); + export const contextService = define(IWorkspaceContextService, () => new SimpleWorkspaceContextService()); export const labelService = define(ILabelService, () => new SimpleUriLabelService()); @@ -134,7 +136,7 @@ export module StaticServices { export const modeService = define(IModeService, (o) => new ModeServiceImpl()); - export const modelService = define(IModelService, (o) => new ModelServiceImpl(markerService.get(o), configurationService.get(o))); + export const modelService = define(IModelService, (o) => new ModelServiceImpl(markerService.get(o), configurationService.get(o), resourcePropertiesService.get(o))); export const editorWorkerService = define(IEditorWorkerService, (o) => new EditorWorkerServiceImpl(modelService.get(o), resourceConfigurationService.get(o))); diff --git a/src/vs/editor/test/common/services/modelService.test.ts b/src/vs/editor/test/common/services/modelService.test.ts index 02ca191ae158b..ad609f63fd8b5 100644 --- a/src/vs/editor/test/common/services/modelService.test.ts +++ b/src/vs/editor/test/common/services/modelService.test.ts @@ -13,6 +13,8 @@ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { CharCode } from 'vs/base/common/charCode'; import { createStringBuilder } from 'vs/editor/common/core/stringBuilder'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; const GENERATE_TESTS = false; @@ -24,7 +26,7 @@ suite('ModelService', () => { configService.setUserConfiguration('files', { 'eol': '\n' }); configService.setUserConfiguration('files', { 'eol': '\r\n' }, URI.file(platform.isWindows ? 'c:\\myroot' : '/myroot')); - modelService = new ModelServiceImpl(null, configService); + modelService = new ModelServiceImpl(null, configService, new TestTextResourcePropertiesService(configService)); }); teardown(() => { @@ -361,3 +363,23 @@ assertComputeEdits(file1, file2); } } } + +class TestTextResourcePropertiesService implements ITextResourcePropertiesService { + + _serviceBrand: any; + + constructor( + @IConfigurationService private configurationService: IConfigurationService, + ) { + } + + getEOL(resource: URI): string { + const filesConfiguration = this.configurationService.getValue<{ eol: string }>('files'); + if (filesConfiguration && filesConfiguration.eol) { + if (filesConfiguration.eol !== 'auto') { + return filesConfiguration.eol; + } + } + return (platform.isLinux || platform.isMacintosh) ? '\n' : '\r\n'; + } +} diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 70312c08939e7..abb21c99f7024 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -65,7 +65,7 @@ import { restoreFontInfo, readFontInfo, saveFontInfo } from 'vs/editor/browser/c import * as browser from 'vs/base/browser/browser'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; -import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; +import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; import { TextResourceConfigurationService } from 'vs/editor/common/services/resourceConfigurationImpl'; import { registerThemingParticipant, ITheme, ICssStyleCollector, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground, inputPlaceholderForeground } from 'vs/platform/theme/common/colorRegistry'; @@ -98,6 +98,7 @@ import { ILabelService, LabelService } from 'vs/platform/label/common/label'; import { IDownloadService } from 'vs/platform/download/common/download'; import { DownloadService } from 'vs/platform/download/node/downloadService'; import { runWhenIdle } from 'vs/base/common/async'; +import { TextResourcePropertiesService } from 'vs/workbench/services/textfile/electron-browser/textResourcePropertiesService'; /** * Services that we require for the Shell @@ -368,10 +369,12 @@ export class WorkbenchShell extends Disposable { serviceCollection.set(IModeService, new SyncDescriptor(WorkbenchModeServiceImpl)); - serviceCollection.set(IModelService, new SyncDescriptor(ModelServiceImpl)); - serviceCollection.set(ITextResourceConfigurationService, new SyncDescriptor(TextResourceConfigurationService)); + serviceCollection.set(ITextResourcePropertiesService, new SyncDescriptor(TextResourcePropertiesService)); + + serviceCollection.set(IModelService, new SyncDescriptor(ModelServiceImpl)); + serviceCollection.set(IEditorWorkerService, new SyncDescriptor(EditorWorkerServiceImpl)); serviceCollection.set(IUntitledEditorService, new SyncDescriptor(UntitledEditorService)); diff --git a/src/vs/workbench/parts/debug/node/debugger.ts b/src/vs/workbench/parts/debug/node/debugger.ts index 1aee3831c934e..644722c03e4e6 100644 --- a/src/vs/workbench/parts/debug/node/debugger.ts +++ b/src/vs/workbench/parts/debug/node/debugger.ts @@ -23,6 +23,9 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { memoize } from 'vs/base/common/decorators'; import { TaskDefinitionRegistry } from 'vs/workbench/parts/tasks/common/taskDefinitionRegistry'; import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; +import { URI } from 'vs/base/common/uri'; +import { Schemas } from 'vs/base/common/network'; export class Debugger implements IDebugger { @@ -30,6 +33,7 @@ export class Debugger implements IDebugger { constructor(private configurationManager: IConfigurationManager, private debuggerContribution: IDebuggerContribution, public extensionDescription: IExtensionDescription, @IConfigurationService private configurationService: IConfigurationService, + @ITextResourcePropertiesService private resourcePropertiesService: ITextResourcePropertiesService, @ICommandService private commandService: ICommandService, @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService, @ITelemetryService private telemetryService: ITelemetryService, @@ -153,7 +157,7 @@ export class Debugger implements IDebugger { initialConfigurations = initialConfigurations.concat(initialConfigs); } - const eol = this.configurationService.getValue('files.eol') === '\r\n' ? '\r\n' : '\n'; + const eol = this.resourcePropertiesService.getEOL(URI.from({ scheme: Schemas.untitled, path: '1' })) === '\r\n' ? '\r\n' : '\n'; const configs = JSON.stringify(initialConfigurations, null, '\t').split('\n').map(line => '\t' + line).join(eol).trim(); const comment1 = nls.localize('launch.config.comment1', "Use IntelliSense to learn about possible attributes."); const comment2 = nls.localize('launch.config.comment2', "Hover to view descriptions of existing attributes."); diff --git a/src/vs/workbench/parts/debug/test/node/debugger.test.ts b/src/vs/workbench/parts/debug/test/node/debugger.test.ts index adbe2e72b65f1..47e7b38aaea07 100644 --- a/src/vs/workbench/parts/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/parts/debug/test/node/debugger.test.ts @@ -123,7 +123,7 @@ suite('Debug - Debugger', () => { }; setup(() => { - _debugger = new Debugger(configurationManager, debuggerContribution, extensionDescriptor0, new TestConfigurationService(), undefined, undefined, undefined); + _debugger = new Debugger(configurationManager, debuggerContribution, extensionDescriptor0, new TestConfigurationService(), undefined, undefined, undefined, undefined); }); teardown(() => { diff --git a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts b/src/vs/workbench/parts/files/electron-browser/files.contribution.ts index 58f4e4fbd482a..b6a14d0f08774 100644 --- a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/electron-browser/files.contribution.ts @@ -238,13 +238,15 @@ configurationRegistry.registerConfiguration({ 'type': 'string', 'enum': [ '\n', - '\r\n' + '\r\n', + 'auto' ], 'enumDescriptions': [ nls.localize('eol.LF', "LF"), - nls.localize('eol.CRLF', "CRLF") + nls.localize('eol.CRLF', "CRLF"), + nls.localize('eol.auto', "Uses operating system specific end of line character.") ], - 'default': (platform.isLinux || platform.isMacintosh) ? '\n' : '\r\n', + 'default': 'auto', 'description': nls.localize('eol', "The default end of line character."), 'scope': ConfigurationScope.RESOURCE }, diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 3cb58c9e65d99..820b9377bec7c 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -531,8 +531,8 @@ export class PreferencesService extends Disposable implements IPreferencesServic const languageKey = `[${language}]`; let setting = settingsModel.getPreference(languageKey); const model = codeEditor.getModel(); - const configuration = this.configurationService.getValue<{ editor: { tabSize: number; insertSpaces: boolean }, files: { eol: string } }>(); - const eol = configuration.files && configuration.files.eol; + const configuration = this.configurationService.getValue<{ editor: { tabSize: number; insertSpaces: boolean } }>(); + const eol = model.getEOL(); if (setting) { if (setting.overrides.length) { const lastSetting = setting.overrides[setting.overrides.length - 1]; diff --git a/src/vs/workbench/services/textfile/electron-browser/textResourcePropertiesService.ts b/src/vs/workbench/services/textfile/electron-browser/textResourcePropertiesService.ts new file mode 100644 index 0000000000000..8b1927e9a7ac3 --- /dev/null +++ b/src/vs/workbench/services/textfile/electron-browser/textResourcePropertiesService.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { URI } from 'vs/base/common/uri'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; +import { OperatingSystem, OS } from 'vs/base/common/platform'; + +export class TextResourcePropertiesService implements ITextResourcePropertiesService { + + _serviceBrand: any; + + constructor( + @IConfigurationService private configurationService: IConfigurationService + ) { } + + getEOL(resource: URI): string { + const filesConfiguration = this.configurationService.getValue<{ eol: string }>('files'); + if (filesConfiguration && filesConfiguration.eol && filesConfiguration.eol !== 'auto') { + return filesConfiguration.eol; + } + return OS === OperatingSystem.Linux || OS === OperatingSystem.Macintosh ? '\n' : '\r\n'; + } + +} \ No newline at end of file diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index 3e908dcd45146..db354cb993b6e 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -13,7 +13,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/node/extHost.protocol'; import { createTestCodeEditor, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; -import { TestEditorService, TestEditorGroupsService } from 'vs/workbench/test/workbenchTestServices'; +import { TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; import { Event } from 'vs/base/common/event'; import { ITextModel } from 'vs/editor/common/model'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -42,7 +42,7 @@ suite('MainThreadDocumentsAndEditors', () => { deltas.length = 0; const configService = new TestConfigurationService(); configService.setUserConfiguration('editor', { 'detectIndentation': false }); - modelService = new ModelServiceImpl(null, configService); + modelService = new ModelServiceImpl(null, configService, new TestTextResourcePropertiesService(configService)); codeEditorService = new TestCodeEditorService(); textFileService = new class extends mock() { isDirty() { return false; } diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts index cf788499027e6..562d2163336af 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts @@ -19,7 +19,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Position } from 'vs/editor/common/core/position'; import { IModelService } from 'vs/editor/common/services/modelService'; import { EditOperation } from 'vs/editor/common/core/editOperation'; -import { TestFileService, TestEditorService, TestEditorGroupsService, TestEnvironmentService, TestContextService } from 'vs/workbench/test/workbenchTestServices'; +import { TestFileService, TestEditorService, TestEditorGroupsService, TestEnvironmentService, TestContextService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; import { TPromise } from 'vs/base/common/winjs.base'; import { ResourceTextEdit } from 'vs/editor/common/modes'; import { BulkEditService } from 'vs/workbench/services/bulkEdit/electron-browser/bulkEditService'; @@ -42,7 +42,7 @@ suite('MainThreadEditors', () => { setup(() => { const configService = new TestConfigurationService(); - modelService = new ModelServiceImpl(null, configService); + modelService = new ModelServiceImpl(null, configService, new TestTextResourcePropertiesService(configService)); const codeEditorService = new TestCodeEditorService(); movedResources.clear(); diff --git a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts index a993c4f4cf122..4400ca84c96dd 100644 --- a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts @@ -18,7 +18,7 @@ import { IQuickOpenRegistry, Extensions } from 'vs/workbench/browser/quickopen'; import { Registry } from 'vs/platform/registry/common/platform'; import { SearchService } from 'vs/workbench/services/search/node/searchService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { TestEnvironmentService, TestContextService, TestEditorService, TestEditorGroupsService } from 'vs/workbench/test/workbenchTestServices'; +import { TestEnvironmentService, TestContextService, TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { TPromise } from 'vs/base/common/winjs.base'; import { URI } from 'vs/base/common/uri'; @@ -29,6 +29,7 @@ import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; namespace Timer { export interface ITimerEvent { @@ -67,10 +68,12 @@ suite.skip('QuickOpen performance (integration)', () => { const telemetryService = new TestTelemetryService(); const configurationService = new TestConfigurationService(); + const textResourcePropertiesService = new TestTextResourcePropertiesService(configurationService); const instantiationService = new InstantiationService(new ServiceCollection( [ITelemetryService, telemetryService], [IConfigurationService, configurationService], - [IModelService, new ModelServiceImpl(null, configurationService)], + [ITextResourcePropertiesService, textResourcePropertiesService], + [IModelService, new ModelServiceImpl(null, configurationService, textResourcePropertiesService)], [IWorkspaceContextService, new TestContextService(testWorkspace(URI.file(testWorkspacePath)))], [IEditorService, new TestEditorService()], [IEditorGroupsService, new TestEditorGroupsService()], diff --git a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts index 5a7bff38337e0..b763fdf321e1f 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts @@ -17,7 +17,7 @@ import * as minimist from 'minimist'; import * as path from 'path'; import { SearchService } from 'vs/workbench/services/search/node/searchService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { TestEnvironmentService, TestContextService, TestEditorService, TestEditorGroupsService } from 'vs/workbench/test/workbenchTestServices'; +import { TestEnvironmentService, TestContextService, TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { TPromise } from 'vs/base/common/winjs.base'; import { URI } from 'vs/base/common/uri'; @@ -33,6 +33,7 @@ import { QueryBuilder } from 'vs/workbench/parts/search/common/queryBuilder'; import * as event from 'vs/base/common/event'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { NullLogService, ILogService } from 'vs/platform/log/common/log'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; declare var __dirname: string; @@ -57,10 +58,12 @@ suite.skip('TextSearch performance (integration)', () => { const telemetryService = new TestTelemetryService(); const configurationService = new TestConfigurationService(); + const textResourcePropertiesService = new TestTextResourcePropertiesService(configurationService); const instantiationService = new InstantiationService(new ServiceCollection( [ITelemetryService, telemetryService], [IConfigurationService, configurationService], - [IModelService, new ModelServiceImpl(null, configurationService)], + [ITextResourcePropertiesService, textResourcePropertiesService], + [IModelService, new ModelServiceImpl(null, configurationService, textResourcePropertiesService)], [IWorkspaceContextService, new TestContextService(testWorkspace(URI.file(testWorkspacePath)))], [IEditorService, new TestEditorService()], [IEditorGroupsService, new TestEditorGroupsService()], diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 6f33698591384..3df42108442e3 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -47,7 +47,7 @@ import { generateUuid } from 'vs/base/common/uuid'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened } from 'vs/platform/history/common/history'; -import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; +import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; import { IPosition, Position as EditorPosition } from 'vs/editor/common/core/position'; import { IMenuService, MenuId, IMenu, ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; @@ -79,6 +79,7 @@ import { IViewlet } from 'vs/workbench/common/viewlet'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { StorageService } from 'vs/platform/storage/electron-browser/storageService'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { isLinux, isMacintosh } from 'vs/base/common/platform'; export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, void 0); @@ -1394,6 +1395,27 @@ export class TestTextResourceConfigurationService implements ITextResourceConfig } } +export class TestTextResourcePropertiesService implements ITextResourcePropertiesService { + + _serviceBrand: any; + + constructor( + @IConfigurationService private configurationService: IConfigurationService, + ) { + } + + getEOL(resource: URI): string { + const filesConfiguration = this.configurationService.getValue<{ eol: string }>('files'); + if (filesConfiguration && filesConfiguration.eol) { + if (filesConfiguration.eol !== 'auto') { + return filesConfiguration.eol; + } + } + return (isLinux || isMacintosh) ? '\n' : '\r\n'; + } +} + + export class TestHashService implements IHashService { _serviceBrand: any;