Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vscode.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/vs/workbench/services')
-rw-r--r--src/vs/workbench/services/configuration/test/browser/configurationService.test.ts4
-rw-r--r--src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts2
-rw-r--r--src/vs/workbench/services/extensions/common/extensionsApiProposals.ts1
-rw-r--r--src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts2
-rw-r--r--src/vs/workbench/services/search/common/ignoreFile.ts8
-rw-r--r--src/vs/workbench/services/textfile/common/textFileEditorModel.ts9
-rw-r--r--src/vs/workbench/services/textfile/common/textfiles.ts2
-rw-r--r--src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts4
-rw-r--r--src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts14
-rw-r--r--src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts50
-rw-r--r--src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts2
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;
}