Allow issue reporter to work on built-in extensions (#92040)
Fixes #91029
This commit is contained in:
parent
bab248b543
commit
eca0690ba0
|
@ -872,7 +872,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType
|
|||
}
|
||||
}
|
||||
|
||||
function getReportIssueArgsForError(error: TypeScriptServerError): { issueTitle: string, issueBody: string } | undefined {
|
||||
function getReportIssueArgsForError(error: TypeScriptServerError): { extensionId: string, issueTitle: string, issueBody: string } | undefined {
|
||||
if (!error.serverStack || !error.serverMessage) {
|
||||
return undefined;
|
||||
}
|
||||
|
@ -880,6 +880,7 @@ function getReportIssueArgsForError(error: TypeScriptServerError): { issueTitle:
|
|||
// Note these strings are intentionally not localized
|
||||
// as we want users to file issues in english
|
||||
return {
|
||||
extensionId: 'vscode.typescript-language-features',
|
||||
issueTitle: `TS Server fatal error: ${error.serverMessage}`,
|
||||
|
||||
issueBody: `**TypeScript Version:** ${error.version.apiVersion?.fullVersionString}
|
||||
|
|
|
@ -81,6 +81,8 @@ export class IssueReporter extends Disposable {
|
|||
this.initServices(configuration);
|
||||
|
||||
const isSnap = process.platform === 'linux' && process.env.SNAP && process.env.SNAP_REVISION;
|
||||
|
||||
const targetExtension = configuration.data.extensionId ? configuration.data.enabledExtensions.find(extension => extension.id === configuration.data.extensionId) : undefined;
|
||||
this.issueReporterModel = new IssueReporterModel({
|
||||
issueType: configuration.data.issueType || IssueType.Bug,
|
||||
versionInfo: {
|
||||
|
@ -88,8 +90,8 @@ export class IssueReporter extends Disposable {
|
|||
os: `${os.type()} ${os.arch()} ${os.release()}${isSnap ? ' snap' : ''}`
|
||||
},
|
||||
extensionsDisabled: !!this.environmentService.disableExtensions,
|
||||
fileOnExtension: configuration.data.extensionId ? true : undefined,
|
||||
selectedExtension: configuration.data.extensionId ? configuration.data.enabledExtensions.filter(extension => extension.id === configuration.data.extensionId)[0] : undefined
|
||||
fileOnExtension: configuration.data.extensionId ? !targetExtension?.isBuiltin : undefined,
|
||||
selectedExtension: targetExtension,
|
||||
});
|
||||
|
||||
const issueReporterElement = this.getElementById('issue-reporter');
|
||||
|
@ -260,19 +262,20 @@ export class IssueReporter extends Disposable {
|
|||
}
|
||||
|
||||
private handleExtensionData(extensions: IssueReporterExtensionData[]) {
|
||||
const { nonThemes, themes } = collections.groupBy(extensions, ext => {
|
||||
const installedExtensions = extensions.filter(x => !x.isBuiltin);
|
||||
const { nonThemes, themes } = collections.groupBy(installedExtensions, ext => {
|
||||
return ext.isTheme ? 'themes' : 'nonThemes';
|
||||
});
|
||||
|
||||
const numberOfThemeExtesions = themes && themes.length;
|
||||
this.issueReporterModel.update({ numberOfThemeExtesions, enabledNonThemeExtesions: nonThemes, allExtensions: extensions });
|
||||
this.issueReporterModel.update({ numberOfThemeExtesions, enabledNonThemeExtesions: nonThemes, allExtensions: installedExtensions });
|
||||
this.updateExtensionTable(nonThemes, numberOfThemeExtesions);
|
||||
|
||||
if (this.environmentService.disableExtensions || extensions.length === 0) {
|
||||
if (this.environmentService.disableExtensions || installedExtensions.length === 0) {
|
||||
(<HTMLButtonElement>this.getElementById('disableExtensions')).disabled = true;
|
||||
}
|
||||
|
||||
this.updateExtensionSelector(extensions);
|
||||
this.updateExtensionSelector(installedExtensions);
|
||||
}
|
||||
|
||||
private handleSettingsSearchData(data: ISettingsSearchIssueReporterData): void {
|
||||
|
@ -748,10 +751,14 @@ export class IssueReporter extends Disposable {
|
|||
|
||||
private setSourceOptions(): void {
|
||||
const sourceSelect = this.getElementById('issue-source')! as HTMLSelectElement;
|
||||
const { issueType, fileOnExtension } = this.issueReporterModel.getData();
|
||||
const { issueType, fileOnExtension, selectedExtension } = this.issueReporterModel.getData();
|
||||
let selected = sourceSelect.selectedIndex;
|
||||
if (selected === -1 && fileOnExtension !== undefined) {
|
||||
selected = fileOnExtension ? 2 : 1;
|
||||
if (selected === -1) {
|
||||
if (fileOnExtension !== undefined) {
|
||||
selected = fileOnExtension ? 2 : 1;
|
||||
} else if (selectedExtension?.isBuiltin) {
|
||||
selected = 1;
|
||||
}
|
||||
}
|
||||
|
||||
sourceSelect.innerHTML = '';
|
||||
|
|
|
@ -49,6 +49,7 @@ export interface IssueReporterExtensionData {
|
|||
version: string;
|
||||
id: string;
|
||||
isTheme: boolean;
|
||||
isBuiltin: boolean;
|
||||
displayName: string | undefined;
|
||||
repositoryUrl: string | undefined;
|
||||
bugsUrl: string | undefined;
|
||||
|
|
|
@ -12,9 +12,9 @@ import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/exte
|
|||
import { webFrame } from 'electron';
|
||||
import { assign } from 'vs/base/common/objects';
|
||||
import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue';
|
||||
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
|
||||
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
|
||||
import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService';
|
||||
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
|
||||
|
||||
export class WorkbenchIssueService implements IWorkbenchIssueService {
|
||||
_serviceBrand: undefined;
|
||||
|
@ -28,12 +28,13 @@ export class WorkbenchIssueService implements IWorkbenchIssueService {
|
|||
) { }
|
||||
|
||||
async openReporter(dataOverrides: Partial<IssueReporterData> = {}): Promise<void> {
|
||||
const extensions = await this.extensionManagementService.getInstalled(ExtensionType.User);
|
||||
const extensions = await this.extensionManagementService.getInstalled();
|
||||
const enabledExtensions = extensions.filter(extension => this.extensionEnablementService.isEnabled(extension));
|
||||
const extensionData: IssueReporterExtensionData[] = enabledExtensions.map(extension => {
|
||||
const extensionData = enabledExtensions.map((extension): IssueReporterExtensionData => {
|
||||
const { manifest } = extension;
|
||||
const manifestKeys = manifest.contributes ? Object.keys(manifest.contributes) : [];
|
||||
const isTheme = !manifest.activationEvents && manifestKeys.length === 1 && manifestKeys[0] === 'themes';
|
||||
const isBuiltin = extension.type === ExtensionType.System;
|
||||
return {
|
||||
name: manifest.name,
|
||||
publisher: manifest.publisher,
|
||||
|
@ -42,14 +43,15 @@ export class WorkbenchIssueService implements IWorkbenchIssueService {
|
|||
bugsUrl: manifest.bugs && manifest.bugs.url,
|
||||
displayName: manifest.displayName,
|
||||
id: extension.identifier.id,
|
||||
isTheme: isTheme
|
||||
isTheme,
|
||||
isBuiltin,
|
||||
};
|
||||
});
|
||||
const theme = this.themeService.getColorTheme();
|
||||
const issueReporterData: IssueReporterData = assign({
|
||||
styles: getIssueReporterStyles(theme),
|
||||
zoomLevel: webFrame.getZoomLevel(),
|
||||
enabledExtensions: extensionData
|
||||
enabledExtensions: extensionData,
|
||||
}, dataOverrides);
|
||||
return this.issueService.openReporter(issueReporterData);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue