Change:
Feature Request The command takes an extension argument so that extensions can open an issue reporter for that extension. I'd like to use this for the built-in JS/TS extension as well but cannot at the moment: It'd be nice if for VS Code builtin extensions, we automatically changed the field to
<!-- -96bd-47a8-a0e8- --This feature request is now a candidate for our backlog. The community has 60 days to upvote the issue. If it receives 20 upvotes we will move it to our backlog. If not, we will close it. To learn more about how we handle feature requests, please see our . Happy Coding!

Discussion:
} } <del> function getReportIssueArgsForError(error: TypeScriptServerError): { issueTitle: string, issueBody: string } | undefined { </del> <ins> function getReportIssueArgsForError(error: TypeScriptServerError): { extensionId: string, issueTitle: string, issueBody: string } | undefined { </ins> if (!error.serverStack || !error.serverMessage) { return undefined; }

// Note these strings are intentionally not localized // as we want users to file issues in english return { <ins> extensionId: 'vscode.typescript-language-features', </ins> issueTitle: `TS Server fatal error:  ${error.serverMessage}`, issueBody: `**TypeScript Version:** ${error.version.apiVersion?.fullVersionString}

this.initServices(configuration); const isSnap = process.platform === 'linux' && process.env.SNAP && process.env.SNAP_REVISION; <ins> const targetExtension = configuration.data.extensionId ? configuration.data.enabledExtensions.find(extension => extension.id === configuration.data.extensionId) : undefined; </ins> this.issueReporterModel = new IssueReporterModel({ issueType: configuration.data.issueType || IssueType.Bug, versionInfo: {

os: `${os.type()} ${os.arch()} ${os.release()}${isSnap ? ' snap' : ''}` }, extensionsDisabled: !!this.environmentService.disableExtensions, <del> fileOnExtension: configuration.data.extensionId ? true : undefined, selectedExtension: configuration.data.extensionId ? configuration.data.enabledExtensions.filter(extension => extension.id === configuration.data.extensionId)[0] : undefined </del> <ins> fileOnExtension: configuration.data.extensionId ? !targetExtension?.isBuiltin : undefined, selectedExtension: targetExtension, </ins> }); const issueReporterElement = this.getElementById('issue-reporter');

} private handleExtensionData(extensions: IssueReporterExtensionData[]) { <del> const { nonThemes, themes } = collections.groupBy(extensions, ext => { </del> <ins> const installedExtensions = extensions.filter(x => !x.isBuiltin); const { nonThemes, themes } = collections.groupBy(installedExtensions, ext => { </ins> return ext.isTheme ? 'themes' : 'nonThemes'; }); const numberOfThemeExtesions = themes && themes.length; <del> this.issueReporterModel.update({ numberOfThemeExtesions, enabledNonThemeExtesions: nonThemes, allExtensions: extensions }); </del> <ins> this.issueReporterModel.update({ numberOfThemeExtesions, enabledNonThemeExtesions: nonThemes, allExtensions: installedExtensions }); </ins> this.updateExtensionTable(nonThemes, numberOfThemeExtesions); <del> if (this.environmentService.disableExtensions || extensions.length === 0) { </del> <ins> if (this.environmentService.disableExtensions || installedExtensions.length === 0) { </ins> (<HTMLButtonElement>this.getElementById('disableExtensions')).disabled = true; } <del> this.updateExtensionSelector(extensions); </del> <ins> this.updateExtensionSelector(installedExtensions); </ins> } private handleSettingsSearchData(data: ISettingsSearchIssueReporterData): void {

private setSourceOptions(): void { const sourceSelect = this.getElementById('issue-source')! as HTMLSelectElement; <del> const { issueType, fileOnExtension } = this.issueReporterModel.getData(); </del> <ins> const { issueType, fileOnExtension, selectedExtension } = this.issueReporterModel.getData(); </ins> let selected = sourceSelect.selectedIndex; <del> if (selected === -1 && fileOnExtension !== undefined) { selected = fileOnExtension ? 2 : 1; </del> <ins> if (selected === -1) { if (fileOnExtension !== undefined) { selected = fileOnExtension ? 2 : 1; } else if (selectedExtension?.isBuiltin) { selected = 1; } </ins> } sourceSelect.innerHTML = '';

version: string; id: string; isTheme: boolean; <ins> isBuiltin: boolean; </ins> displayName: string | undefined; repositoryUrl: string | undefined; bugsUrl: string | undefined;

import { webFrame } from 'electron'; import { assign } from 'vs/base/common/objects'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; <del> import { ExtensionType } from 'vs/platform/extensions/common/extensions'; </del> import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; <ins> import { ExtensionType } from 'vs/platform/extensions/common/extensions'; </ins> export class WorkbenchIssueService implements IWorkbenchIssueService { _serviceBrand: undefined;

) { } async openReporter(dataOverrides: Partial<IssueReporterData> = {}): Promise<void> { <del> const extensions = await this.extensionManagementService.getInstalled(ExtensionType.User); </del> <ins> const extensions = await this.extensionManagementService.getInstalled(); </ins> const enabledExtensions = extensions.filter(extension => this.extensionEnablementService.isEnabled(extension)); <del> const extensionData: IssueReporterExtensionData[] = enabledExtensions.map(extension => { </del> <ins> const extensionData = enabledExtensions.map((extension): IssueReporterExtensionData => { </ins> const { manifest } = extension; const manifestKeys = manifest.contributes ? Object.keys(manifest.contributes) : []; const isTheme = !manifest.activationEvents && manifestKeys.length === 1 && manifestKeys[0] === 'themes'; <ins> const isBuiltin = extension.type === ExtensionType.System; </ins> return { name: manifest.name, publisher: manifest.publisher,

bugsUrl: manifest.bugs && manifest.bugs.url, displayName: manifest.displayName, id: extension.identifier.id, <del> isTheme: isTheme </del> <ins> isTheme, isBuiltin, </ins> }; }); const theme = this.themeService.getColorTheme(); const issueReporterData: IssueReporterData = assign({ styles: getIssueReporterStyles(theme), zoomLevel: webFrame.getZoomLevel(), <del> enabledExtensions: extensionData </del> <ins> enabledExtensions: extensionData, </ins> }, dataOverrides); return this.issueService.openReporter(issueReporterData); }