diff options
Diffstat (limited to 'src/vs/workbench/services')
11 files changed, 81 insertions, 17 deletions
diff --git a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts index 16385a9895a..8d694700fd9 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts @@ -1435,7 +1435,7 @@ suite('WorkspaceConfigurationService - Profiles', () => { fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, new NullLogService()))); const uriIdentityService = new UriIdentityService(fileService); const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)); - userDataProfileService = instantiationService.stub(IUserDataProfileService, new UserDataProfileService(toUserDataProfile('custom', joinPath(environmentService.userRoamingDataHome, 'profiles', 'temp')), userDataProfilesService)); + userDataProfileService = instantiationService.stub(IUserDataProfileService, new UserDataProfileService(toUserDataProfile('custom', 'custom', joinPath(environmentService.userRoamingDataHome, 'profiles', 'temp')), userDataProfilesService)); workspaceService = testObject = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, userDataProfileService, userDataProfilesService, fileService, remoteAgentService, uriIdentityService, new NullLogService(), new FilePolicyService(environmentService.policyFile, fileService, logService))); instantiationService.stub(IFileService, fileService); instantiationService.stub(IWorkspaceContextService, testObject); @@ -1531,7 +1531,7 @@ suite('WorkspaceConfigurationService - Profiles', () => { await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "profileValue", "configurationService.profiles.testSetting": "profileValue" }')); await testObject.reloadConfiguration(); - const profile = toUserDataProfile('custom2', joinPath(environmentService.userRoamingDataHome, 'profiles', 'custom2')); + const profile = toUserDataProfile('custom2', 'custom2', joinPath(environmentService.userRoamingDataHome, 'profiles', 'custom2')); await fileService.writeFile(profile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "profileValue2", "configurationService.profiles.testSetting": "profileValue2" }')); const promise = Event.toPromise(testObject.onDidChangeConfiguration); await userDataProfileService.updateCurrentProfile(profile, false); diff --git a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts index 8ff9cecf63b..fabbda76cb7 100644 --- a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts @@ -167,7 +167,7 @@ export abstract class AbstractFileDialogService implements IFileDialogService { } protected async pickFileFolderAndOpenSimplified(schema: string, options: IPickAndOpenOptions, preferNewWindow: boolean): Promise<void> { - const title = nls.localize('openFileOrFolder.title', 'Open File Or Folder'); + const title = nls.localize('openFileOrFolder.title', 'Open File or Folder'); const availableFileSystems = this.addFileSchemaIfNeeded(schema); const uri = await this.pickResource({ canSelectFiles: true, canSelectFolders: true, canSelectMany: false, defaultUri: options.defaultUri, title, availableFileSystems }); diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index e6b24f4013c..3c8446b2b12 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -52,7 +52,6 @@ export const allApiProposals = Object.freeze({ scmActionButton: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmActionButton.d.ts', scmSelectedProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts', scmValidation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmValidation.d.ts', - snippetWorkspaceEdit: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts', tabInputTextMerge: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tabInputTextMerge.d.ts', taskPresentationGroup: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.taskPresentationGroup.d.ts', telemetry: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.telemetry.d.ts', diff --git a/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts b/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts index 36ffefdd42c..d036cb033b1 100644 --- a/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts +++ b/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts @@ -8,6 +8,8 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const ILanguageDetectionService = createDecorator<ILanguageDetectionService>('ILanguageDetectionService'); +export const LanguageDetectionLanguageEventSource = 'languageDetection'; + export interface ILanguageDetectionService { readonly _serviceBrand: undefined; diff --git a/src/vs/workbench/services/search/common/ignoreFile.ts b/src/vs/workbench/services/search/common/ignoreFile.ts index 769c8aa8273..9de868fdeff 100644 --- a/src/vs/workbench/services/search/common/ignoreFile.ts +++ b/src/vs/workbench/services/search/common/ignoreFile.ts @@ -133,7 +133,13 @@ export class IgnoreFile { line = '**/' + line; } else { if (firstSep === 0) { - line = line.slice(1); + if (dirPath.slice(-1) === '/') { + line = line.slice(1); + } + } else { + if (dirPath.slice(-1) !== '/') { + line = '/' + line; + } } line = dirPath + line; } diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 6672a7126d3..6dc44f932c3 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -197,8 +197,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil this.modelService.setMode(this.textEditorModel, languageSelection); } - override setLanguageId(languageId: string): void { - super.setLanguageId(languageId); + override setLanguageId(languageId: string, source?: string): void { + super.setLanguageId(languageId, source); this.preferredLanguageId = languageId; } @@ -556,15 +556,16 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } } - private installModelListeners(model: ITextModel): void { + protected override installModelListeners(model: ITextModel): void { // See https://github.com/microsoft/vscode/issues/30189 // This code has been extracted to a different method because it caused a memory leak // where `value` was captured in the content change listener closure scope. - // Listen to text model events this._register(model.onDidChangeContent(e => this.onModelContentChanged(model, e.isUndoing || e.isRedoing))); this._register(model.onDidChangeLanguage(() => this.onMaybeShouldChangeEncoding())); // detect possible encoding change via language specific settings + + super.installModelListeners(model); } private onModelContentChanged(model: ITextModel, isUndoingOrRedoing: boolean): void { diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index 8cb717b2fca..e961ed75e2f 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -468,7 +468,7 @@ export interface ILanguageSupport { /** * Sets the language id of the object. */ - setLanguageId(languageId: string, setExplicitly?: boolean): void; + setLanguageId(languageId: string, source?: string): void; } export interface ITextFileEditorModelSaveEvent extends IWorkingCopySaveEvent { diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts index 326624d3ae0..c3d68a86cf7 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts @@ -108,8 +108,8 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp return this.model.setEncoding(encoding); } - setLanguageId(languageId: string): void { - this.model.setLanguageId(languageId); + setLanguageId(languageId: string, source?: string): void { + this.model.setLanguageId(languageId, source); } getLanguageId(): string | undefined { diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts index 5d3e956cadb..1d3657cf103 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts @@ -190,14 +190,14 @@ export class UntitledTextEditorModel extends BaseTextEditorModel implements IUnt //#region Language - override setLanguageId(languageId: string): void { + override setLanguageId(languageId: string, source?: string): void { const actualLanguage: string | undefined = languageId === UntitledTextEditorModel.ACTIVE_EDITOR_LANGUAGE_ID ? this.editorService.activeTextEditorLanguageId : languageId; this.preferredLanguageId = actualLanguage; if (actualLanguage) { - super.setLanguageId(actualLanguage); + super.setLanguageId(actualLanguage, source); } } @@ -333,8 +333,7 @@ export class UntitledTextEditorModel extends BaseTextEditorModel implements IUnt // Listen to text model events const textEditorModel = assertIsDefined(this.textEditorModel); - this._register(textEditorModel.onDidChangeContent(e => this.onModelContentChanged(textEditorModel, e))); - this._register(textEditorModel.onDidChangeLanguage(() => this.onConfigurationChange(true))); // language change can have impact on config + this.installModelListeners(textEditorModel); // Only adjust name and dirty state etc. if we // actually created the untitled model @@ -358,6 +357,13 @@ export class UntitledTextEditorModel extends BaseTextEditorModel implements IUnt return super.resolve(); } + protected override installModelListeners(model: ITextModel): void { + this._register(model.onDidChangeContent(e => this.onModelContentChanged(model, e))); + this._register(model.onDidChangeLanguage(() => this.onConfigurationChange(true))); // language change can have impact on config + + super.installModelListeners(model); + } + private onModelContentChanged(textEditorModel: ITextModel, e: IModelContentChangedEvent): void { // mark the untitled text editor as non-dirty once its content becomes empty and we do diff --git a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts index 2ab69b9299f..b9bd7078da9 100644 --- a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts +++ b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts @@ -20,6 +20,7 @@ import { EditorInputCapabilities } from 'vs/workbench/common/editor'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { isReadable, isReadableStream } from 'vs/base/common/stream'; import { readableToBuffer, streamToBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; +import { LanguageDetectionLanguageEventSource } from 'vs/workbench/services/languageDetection/common/languageDetectionWorkerService'; suite('Untitled text editors', () => { @@ -334,6 +335,55 @@ suite('Untitled text editors', () => { registration.dispose(); }); + // Issue #159202 + test('remembers that language was set explicitly if set by another source (i.e. ModelService)', async () => { + const language = 'untitled-input-test'; + + const registration = accessor.languageService.registerLanguage({ + id: language, + }); + + const service = accessor.untitledTextEditorService; + const model = service.create(); + const input = instantiationService.createInstance(UntitledTextEditorInput, model); + await input.resolve(); + + assert.ok(!input.model.hasLanguageSetExplicitly); + accessor.modelService.setMode(model.textEditorModel!, accessor.languageService.createById(language)); + assert.ok(input.model.hasLanguageSetExplicitly); + + assert.strictEqual(model.getLanguageId(), language); + + model.dispose(); + registration.dispose(); + }); + + test('Language is not set explicitly if set by language detection source', async () => { + const language = 'untitled-input-test'; + + const registration = accessor.languageService.registerLanguage({ + id: language, + }); + + const service = accessor.untitledTextEditorService; + const model = service.create(); + const input = instantiationService.createInstance(UntitledTextEditorInput, model); + await input.resolve(); + + assert.ok(!input.model.hasLanguageSetExplicitly); + accessor.modelService.setMode( + model.textEditorModel!, + accessor.languageService.createById(language), + // This is really what this is testing + LanguageDetectionLanguageEventSource); + assert.ok(!input.model.hasLanguageSetExplicitly); + + assert.strictEqual(model.getLanguageId(), language); + + model.dispose(); + registration.dispose(); + }); + test('service#onDidChangeEncoding', async () => { const service = accessor.untitledTextEditorService; const input = instantiationService.createInstance(UntitledTextEditorInput, service.create()); diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts index e9cd97c1bc0..1e8af9e7fb7 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts @@ -53,7 +53,7 @@ export class UserDataProfileManagementService extends Disposable implements IUse } async createAndEnterProfile(name: string, useDefaultFlags?: UseDefaultProfileFlags, fromExisting?: boolean): Promise<IUserDataProfile> { - const profile = await this.userDataProfilesService.createProfile(name, useDefaultFlags, this.getWorkspaceIdentifier()); + const profile = await this.userDataProfilesService.createNamedProfile(name, useDefaultFlags, this.getWorkspaceIdentifier()); await this.enterProfile(profile, !!fromExisting); return profile; } |