未验证 提交 eca0690b 编写于 作者: M Matt Bierner 提交者: GitHub

Allow issue reporter to work on built-in extensions (#92040)

Fixes #91029
上级 bab248b5
......@@ -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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册