in patched-vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts [574:706]
private getHoverMarkdown(): MarkdownString | undefined {
if (!this.extension) {
return undefined;
}
const markdown = new MarkdownString('', { isTrusted: true, supportThemeIcons: true });
markdown.appendMarkdown(`**${this.extension.displayName}**`);
if (semver.valid(this.extension.version)) {
markdown.appendMarkdown(` <span style="background-color:#8080802B;">** _v${this.extension.version}${(this.extension.isPreReleaseVersion ? ' (pre-release)' : '')}_** </span>`);
}
markdown.appendText(`\n`);
if (this.extension.state === ExtensionState.Installed) {
let addSeparator = false;
const installLabel = InstallCountWidget.getInstallLabel(this.extension, true);
if (installLabel) {
if (addSeparator) {
markdown.appendText(` | `);
}
markdown.appendMarkdown(`$(${installCountIcon.id}) ${installLabel}`);
addSeparator = true;
}
if (this.extension.rating) {
if (addSeparator) {
markdown.appendText(` | `);
}
const rating = Math.round(this.extension.rating * 2) / 2;
markdown.appendMarkdown(`$(${starFullIcon.id}) [${rating}](${this.extension.url}&ssr=false#review-details)`);
addSeparator = true;
}
if (this.extension.publisherSponsorLink) {
if (addSeparator) {
markdown.appendText(` | `);
}
markdown.appendMarkdown(`$(${sponsorIcon.id}) [${localize('sponsor', "Sponsor")}](${this.extension.publisherSponsorLink})`);
addSeparator = true;
}
if (addSeparator) {
markdown.appendText(`\n`);
}
}
const location = this.extension.resourceExtension?.location ?? (this.extension.local?.source === 'resource' ? this.extension.local?.location : undefined);
if (location) {
if (this.extension.isWorkspaceScoped && this.contextService.isInsideWorkspace(location)) {
markdown.appendMarkdown(localize('workspace extension', "Workspace Extension"));
} else {
markdown.appendMarkdown(localize('local extension', "Local Extension"));
}
markdown.appendText(`\n`);
}
if (this.extension.description) {
markdown.appendMarkdown(`${this.extension.description}`);
markdown.appendText(`\n`);
}
if (this.extension.publisherDomain?.verified) {
const bgColor = this.themeService.getColorTheme().getColor(extensionVerifiedPublisherIconColor);
const publisherVerifiedTooltip = localize('publisher verified tooltip', "This publisher has verified ownership of {0}", `[${URI.parse(this.extension.publisherDomain.link).authority}](${this.extension.publisherDomain.link})`);
markdown.appendMarkdown(`<span style="color:${bgColor ? Color.Format.CSS.formatHex(bgColor) : '#ffffff'};">$(${verifiedPublisherIcon.id})</span> ${publisherVerifiedTooltip}`);
markdown.appendText(`\n`);
}
if (this.extension.outdated) {
markdown.appendMarkdown(localize('updateRequired', "Latest version:"));
markdown.appendMarkdown(` <span style="background-color:#8080802B;">** _v${this.extension.latestVersion}_** </span>`);
markdown.appendText(`\n`);
}
const preReleaseMessage = ExtensionHoverWidget.getPreReleaseMessage(this.extension);
const extensionRuntimeStatus = this.extensionsWorkbenchService.getExtensionStatus(this.extension);
const extensionStatus = this.extensionStatusAction.status;
const runtimeState = this.extension.runtimeState;
const recommendationMessage = this.getRecommendationMessage(this.extension);
if (extensionRuntimeStatus || extensionStatus || runtimeState || recommendationMessage || preReleaseMessage) {
markdown.appendMarkdown(`---`);
markdown.appendText(`\n`);
if (extensionRuntimeStatus) {
if (extensionRuntimeStatus.activationTimes) {
const activationTime = extensionRuntimeStatus.activationTimes.codeLoadingTime + extensionRuntimeStatus.activationTimes.activateCallTime;
markdown.appendMarkdown(`${localize('activation', "Activation time")}${extensionRuntimeStatus.activationTimes.activationReason.startup ? ` (${localize('startup', "Startup")})` : ''}: \`${activationTime}ms\``);
markdown.appendText(`\n`);
}
if (extensionRuntimeStatus.runtimeErrors.length || extensionRuntimeStatus.messages.length) {
const hasErrors = extensionRuntimeStatus.runtimeErrors.length || extensionRuntimeStatus.messages.some(message => message.type === Severity.Error);
const hasWarnings = extensionRuntimeStatus.messages.some(message => message.type === Severity.Warning);
const errorsLink = extensionRuntimeStatus.runtimeErrors.length ? `[${extensionRuntimeStatus.runtimeErrors.length === 1 ? localize('uncaught error', '1 uncaught error') : localize('uncaught errors', '{0} uncaught errors', extensionRuntimeStatus.runtimeErrors.length)}](${URI.parse(`command:extension.open?${encodeURIComponent(JSON.stringify([this.extension.identifier.id, ExtensionEditorTab.Features]))}`)})` : undefined;
const messageLink = extensionRuntimeStatus.messages.length ? `[${extensionRuntimeStatus.messages.length === 1 ? localize('message', '1 message') : localize('messages', '{0} messages', extensionRuntimeStatus.messages.length)}](${URI.parse(`command:extension.open?${encodeURIComponent(JSON.stringify([this.extension.identifier.id, ExtensionEditorTab.Features]))}`)})` : undefined;
markdown.appendMarkdown(`$(${hasErrors ? errorIcon.id : hasWarnings ? warningIcon.id : infoIcon.id}) This extension has reported `);
if (errorsLink && messageLink) {
markdown.appendMarkdown(`${errorsLink} and ${messageLink}`);
} else {
markdown.appendMarkdown(`${errorsLink || messageLink}`);
}
markdown.appendText(`\n`);
}
}
if (extensionStatus) {
if (extensionStatus.icon) {
markdown.appendMarkdown(`$(${extensionStatus.icon.id}) `);
}
markdown.appendMarkdown(extensionStatus.message.value);
if (this.extension.enablementState === EnablementState.DisabledByExtensionDependency && this.extension.local) {
markdown.appendMarkdown(` [${localize('dependencies', "Show Dependencies")}](${URI.parse(`command:extension.open?${encodeURIComponent(JSON.stringify([this.extension.identifier.id, ExtensionEditorTab.Dependencies]))}`)})`);
}
markdown.appendText(`\n`);
}
if (runtimeState) {
markdown.appendMarkdown(`$(${infoIcon.id}) `);
markdown.appendMarkdown(`${runtimeState.reason}`);
markdown.appendText(`\n`);
}
if (preReleaseMessage) {
const extensionPreReleaseIcon = this.themeService.getColorTheme().getColor(extensionPreReleaseIconColor);
markdown.appendMarkdown(`<span style="color:${extensionPreReleaseIcon ? Color.Format.CSS.formatHex(extensionPreReleaseIcon) : '#ffffff'};">$(${preReleaseIcon.id})</span> ${preReleaseMessage}`);
markdown.appendText(`\n`);
}
if (recommendationMessage) {
markdown.appendMarkdown(recommendationMessage);
markdown.appendText(`\n`);
}
}
return markdown;
}