mirror of
https://github.com/coder/code-server.git
synced 2026-05-09 05:47:26 +02:00
chore(vscode): update to 1.56.0
This commit is contained in:
@@ -4,22 +4,19 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { localize } from 'vs/nls';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { EditorInput } from 'vs/workbench/common/editor';
|
||||
import { EditorInput, EditorResourceAccessor, IEditorInput, EditorExtensions, SideBySideEditor } from 'vs/workbench/common/editor';
|
||||
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane';
|
||||
import { IConstructorSignature0, IInstantiationService, BrandedService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IConstructorSignature0, IInstantiationService, BrandedService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { insert } from 'vs/base/common/arrays';
|
||||
import { IDisposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||
import { IJSONSchema } from 'vs/base/common/jsonSchema';
|
||||
import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration';
|
||||
import { Extensions as ConfigurationExtensions, IConfigurationNode, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry';
|
||||
|
||||
export const Extensions = {
|
||||
Editors: 'workbench.contributions.editors',
|
||||
Associations: 'workbench.editors.associations'
|
||||
};
|
||||
import { Promises } from 'vs/base/common/async';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity';
|
||||
import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService';
|
||||
import { URI } from 'vs/workbench/workbench.web.api';
|
||||
import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService';
|
||||
|
||||
//#region Editors Registry
|
||||
|
||||
@@ -161,7 +158,7 @@ class EditorRegistry implements IEditorRegistry {
|
||||
if (descriptors.length > 0) {
|
||||
|
||||
// Ask the input for its preferred Editor
|
||||
const preferredEditorId = input.getPreferredEditorId(descriptors.map(d => d.getId()));
|
||||
const preferredEditorId = input.getPreferredEditorId(descriptors.map(descriptor => descriptor.getId()));
|
||||
if (preferredEditorId) {
|
||||
return this.getEditorById(preferredEditorId);
|
||||
}
|
||||
@@ -194,137 +191,91 @@ class EditorRegistry implements IEditorRegistry {
|
||||
}
|
||||
}
|
||||
|
||||
Registry.add(Extensions.Editors, new EditorRegistry());
|
||||
Registry.add(EditorExtensions.Editors, new EditorRegistry());
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region Editor Close Tracker
|
||||
|
||||
//#region Editor Associations
|
||||
export function whenEditorClosed(accessor: ServicesAccessor, resources: URI[]): Promise<void> {
|
||||
const editorService = accessor.get(IEditorService);
|
||||
const uriIdentityService = accessor.get(IUriIdentityService);
|
||||
const workingCopyService = accessor.get(IWorkingCopyService);
|
||||
|
||||
export const editorsAssociationsSettingId = 'workbench.editorAssociations';
|
||||
return new Promise(resolve => {
|
||||
let remainingResources = [...resources];
|
||||
|
||||
export const DEFAULT_EDITOR_ASSOCIATION: IEditorType = {
|
||||
id: 'default',
|
||||
displayName: localize('promptOpenWith.defaultEditor.displayName', "Text Editor"),
|
||||
providerDisplayName: localize('builtinProviderDisplayName', "Built-in")
|
||||
};
|
||||
// Observe any editor closing from this moment on
|
||||
const listener = editorService.onDidCloseEditor(async event => {
|
||||
const primaryResource = EditorResourceAccessor.getOriginalUri(event.editor, { supportSideBySide: SideBySideEditor.PRIMARY });
|
||||
const secondaryResource = EditorResourceAccessor.getOriginalUri(event.editor, { supportSideBySide: SideBySideEditor.SECONDARY });
|
||||
|
||||
export type EditorAssociation = {
|
||||
readonly viewType: string;
|
||||
readonly filenamePattern?: string;
|
||||
};
|
||||
|
||||
export type EditorsAssociations = readonly EditorAssociation[];
|
||||
|
||||
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
|
||||
|
||||
const editorTypeSchemaAddition: IJSONSchema = {
|
||||
type: 'string',
|
||||
enum: []
|
||||
};
|
||||
|
||||
const editorAssociationsConfigurationNode: IConfigurationNode = {
|
||||
...workbenchConfigurationNodeBase,
|
||||
properties: {
|
||||
'workbench.editorAssociations': {
|
||||
type: 'array',
|
||||
markdownDescription: localize('editor.editorAssociations', "Configure which editor to use for specific file types."),
|
||||
items: {
|
||||
type: 'object',
|
||||
defaultSnippets: [{
|
||||
body: {
|
||||
'viewType': '$1',
|
||||
'filenamePattern': '$2'
|
||||
}
|
||||
}],
|
||||
properties: {
|
||||
'viewType': {
|
||||
anyOf: [
|
||||
{
|
||||
type: 'string',
|
||||
description: localize('editor.editorAssociations.viewType', "The unique id of the editor to use."),
|
||||
},
|
||||
editorTypeSchemaAddition
|
||||
]
|
||||
},
|
||||
'filenamePattern': {
|
||||
type: 'string',
|
||||
description: localize('editor.editorAssociations.filenamePattern', "Glob pattern specifying which files the editor should be used for."),
|
||||
}
|
||||
// Remove from resources to wait for being closed based on the
|
||||
// resources from editors that got closed
|
||||
remainingResources = remainingResources.filter(resource => {
|
||||
if (uriIdentityService.extUri.isEqual(resource, primaryResource) || uriIdentityService.extUri.isEqual(resource, secondaryResource)) {
|
||||
return false; // remove - the closing editor matches this resource
|
||||
}
|
||||
|
||||
return true; // keep - not yet closed
|
||||
});
|
||||
|
||||
// All resources to wait for being closed are closed
|
||||
if (remainingResources.length === 0) {
|
||||
|
||||
// If auto save is configured with the default delay (1s) it is possible
|
||||
// to close the editor while the save still continues in the background. As such
|
||||
// we have to also check if the editors to track for are dirty and if so wait
|
||||
// for them to get saved.
|
||||
const dirtyResources = resources.filter(resource => workingCopyService.isDirty(resource));
|
||||
if (dirtyResources.length > 0) {
|
||||
await Promises.settled(dirtyResources.map(async resource => await new Promise<void>(resolve => {
|
||||
if (!workingCopyService.isDirty(resource)) {
|
||||
return resolve(); // return early if resource is not dirty
|
||||
}
|
||||
|
||||
// Otherwise resolve promise when resource is saved
|
||||
const listener = workingCopyService.onDidChangeDirty(workingCopy => {
|
||||
if (!workingCopy.isDirty() && uriIdentityService.extUri.isEqual(resource, workingCopy.resource)) {
|
||||
listener.dispose();
|
||||
|
||||
return resolve();
|
||||
}
|
||||
});
|
||||
})));
|
||||
}
|
||||
|
||||
listener.dispose();
|
||||
|
||||
return resolve();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export interface IEditorType {
|
||||
readonly id: string;
|
||||
readonly displayName: string;
|
||||
readonly providerDisplayName: string;
|
||||
}
|
||||
|
||||
export interface IEditorTypesHandler {
|
||||
readonly onDidChangeEditorTypes: Event<void>;
|
||||
|
||||
getEditorTypes(): IEditorType[];
|
||||
}
|
||||
|
||||
export interface IEditorAssociationsRegistry {
|
||||
|
||||
/**
|
||||
* Register handlers for editor types
|
||||
*/
|
||||
registerEditorTypesHandler(id: string, handler: IEditorTypesHandler): IDisposable;
|
||||
}
|
||||
|
||||
class EditorAssociationsRegistry implements IEditorAssociationsRegistry {
|
||||
|
||||
private readonly editorTypesHandlers = new Map<string, IEditorTypesHandler>();
|
||||
|
||||
registerEditorTypesHandler(id: string, handler: IEditorTypesHandler): IDisposable {
|
||||
if (this.editorTypesHandlers.has(id)) {
|
||||
throw new Error(`An editor type handler with ${id} was already registered.`);
|
||||
}
|
||||
|
||||
this.editorTypesHandlers.set(id, handler);
|
||||
this.updateEditorAssociationsSchema();
|
||||
|
||||
const editorTypeChangeEvent = handler.onDidChangeEditorTypes(() => {
|
||||
this.updateEditorAssociationsSchema();
|
||||
});
|
||||
|
||||
return {
|
||||
dispose: () => {
|
||||
editorTypeChangeEvent.dispose();
|
||||
this.editorTypesHandlers.delete(id);
|
||||
this.updateEditorAssociationsSchema();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private updateEditorAssociationsSchema() {
|
||||
const enumValues: string[] = [];
|
||||
const enumDescriptions: string[] = [];
|
||||
|
||||
const editorTypes: IEditorType[] = [DEFAULT_EDITOR_ASSOCIATION];
|
||||
|
||||
for (const [, handler] of this.editorTypesHandlers) {
|
||||
editorTypes.push(...handler.getEditorTypes());
|
||||
}
|
||||
|
||||
for (const { id, providerDisplayName } of editorTypes) {
|
||||
enumValues.push(id);
|
||||
enumDescriptions.push(localize('editorAssociations.viewType.sourceDescription', "Source: {0}", providerDisplayName));
|
||||
}
|
||||
|
||||
editorTypeSchemaAddition.enum = enumValues;
|
||||
editorTypeSchemaAddition.enumDescriptions = enumDescriptions;
|
||||
|
||||
configurationRegistry.notifyConfigurationSchemaUpdated(editorAssociationsConfigurationNode);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
|
||||
//#region ARIA
|
||||
|
||||
export function computeEditorAriaLabel(input: IEditorInput, index: number | undefined, group: IEditorGroup | undefined, groupCount: number): string {
|
||||
let ariaLabel = input.getAriaLabel();
|
||||
if (group && !group.isPinned(input)) {
|
||||
ariaLabel = localize('preview', "{0}, preview", ariaLabel);
|
||||
}
|
||||
|
||||
if (group?.isSticky(index ?? input)) {
|
||||
ariaLabel = localize('pinned', "{0}, pinned", ariaLabel);
|
||||
}
|
||||
|
||||
// Apply group information to help identify in
|
||||
// which group we are (only if more than one group
|
||||
// is actually opened)
|
||||
if (group && groupCount > 1) {
|
||||
ariaLabel = `${ariaLabel}, ${group.ariaLabel}`;
|
||||
}
|
||||
|
||||
return ariaLabel;
|
||||
}
|
||||
|
||||
Registry.add(Extensions.Associations, new EditorAssociationsRegistry());
|
||||
configurationRegistry.registerConfiguration(editorAssociationsConfigurationNode);
|
||||
|
||||
//#endregion
|
||||
|
||||
Reference in New Issue
Block a user