Dispose newWithProfile before registering again

Fixes #129514
This commit is contained in:
Daniel Imms 2021-07-27 09:11:18 -07:00
parent 03d2d9cebf
commit 11d693fddf

View file

@ -9,6 +9,7 @@ import { Codicon } from 'vs/base/common/codicons';
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
import { Schemas } from 'vs/base/common/network';
import { isLinux, isWindows } from 'vs/base/common/platform';
import { IDisposable } from 'vs/base/common/lifecycle';
import { withNullAsUndefined } from 'vs/base/common/types';
import { URI } from 'vs/base/common/uri';
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
@ -131,109 +132,8 @@ export function registerTerminalActions() {
}
});
registerAction2(class extends Action2 {
constructor() {
super({
id: TerminalCommandId.NewWithProfile,
title: { value: localize('workbench.action.terminal.newWithProfile', "Create New Integrated Terminal (With Profile)"), original: 'Create New Integrated Terminal (With Profile)' },
f1: true,
category,
precondition: TerminalContextKeys.processSupported,
description: {
description: 'workbench.action.terminal.newWithProfile',
args: [{
name: 'args',
schema: {
type: 'object',
required: ['profileName'],
properties: {
profileName: {
description: localize('workbench.action.terminal.newWithProfile.profileName', "The name of the profile to create"),
type: 'string',
minLength: 1
}
}
}
}]
},
});
}
async run(accessor: ServicesAccessor, eventOrOptionsOrProfile: MouseEvent | ICreateTerminalOptions | ITerminalProfile | { profileName: string } | undefined, profile?: ITerminalProfile) {
const terminalService = accessor.get(ITerminalService);
const terminalGroupService = accessor.get(ITerminalGroupService);
const workspaceContextService = accessor.get(IWorkspaceContextService);
const commandService = accessor.get(ICommandService);
let event: MouseEvent | PointerEvent | KeyboardEvent | undefined;
let options: ICreateTerminalOptions | undefined;
if (typeof eventOrOptionsOrProfile === 'object' && eventOrOptionsOrProfile && ('profileName' in eventOrOptionsOrProfile || 'title' in eventOrOptionsOrProfile)) {
const config = terminalService.allProfiles?.find(profile => {
if (profile) {
if ('title' in profile) {
return profile.title === eventOrOptionsOrProfile.profileName;
} else if ('profileName' in profile) {
return profile.profileName === eventOrOptionsOrProfile.profileName;
} else {
return false;
}
}
return false;
});
if (!config) {
throw new Error(`Could not find terminal profile "${eventOrOptionsOrProfile.profileName}"`);
}
options = { config };
} else if (eventOrOptionsOrProfile instanceof MouseEvent || eventOrOptionsOrProfile instanceof PointerEvent || eventOrOptionsOrProfile instanceof KeyboardEvent) {
event = eventOrOptionsOrProfile;
options = profile ? { config: profile } : undefined;
} else {
options = convertOptionsOrProfileToOptions(eventOrOptionsOrProfile);
}
const folders = workspaceContextService.getWorkspace().folders;
if (event && (event.altKey || event.ctrlKey)) {
const activeInstance = terminalService.activeInstance;
if (activeInstance) {
const cwd = await getCwdForSplit(terminalService.configHelper, activeInstance);
await terminalService.splitInstance(activeInstance, options?.config, cwd);
return;
}
}
if (terminalService.isProcessSupportRegistered) {
let instance: ITerminalInstance | undefined;
let cwd: string | URI | undefined;
if (folders.length > 1) {
// multi-root workspace, create root picker
const options: IPickOptions<IQuickPickItem> = {
placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal")
};
const workspace = await commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]);
if (!workspace) {
// Don't create the instance if the workspace picker was canceled
return;
}
cwd = workspace.uri;
}
if (options) {
instance = await terminalService.createTerminal(options);
} else {
instance = await terminalService.showProfileQuickPick('createInstance', cwd);
}
if (instance) {
terminalService.setActiveInstance(instance);
if (instance.target === TerminalLocation.Editor) {
await instance.focusWhenReady(true);
} else {
await terminalGroupService.showPanel(true);
}
}
}
}
});
// Register new with profile command
refreshTerminalActions([]);
registerAction2(class extends Action2 {
constructor() {
@ -2069,10 +1969,13 @@ function convertOptionsOrProfileToOptions(optionsOrProfile?: ICreateTerminalOpti
return optionsOrProfile;
}
let newWithProfileAction: IDisposable;
export function refreshTerminalActions(detectedProfiles: ITerminalProfile[]) {
const profileEnum = createProfileSchemaEnums(detectedProfiles);
const category: ILocalizedString = { value: TERMINAL_ACTION_CATEGORY, original: 'Terminal' };
registerAction2(class extends Action2 {
newWithProfileAction?.dispose();
newWithProfileAction = registerAction2(class extends Action2 {
constructor() {
super({
id: TerminalCommandId.NewWithProfile,