File: PreviewPane\PreviewPaneService.cs
Web Access
Project: src\src\VisualStudio\Core\Def\Microsoft.VisualStudio.LanguageServices_yayxzhyh_wpftmp.csproj (Microsoft.VisualStudio.LanguageServices)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System;
using System.Collections.Generic;
using System.Composition;
using System.Globalization;
using System.Windows.Controls;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.Host;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.VisualStudio.Imaging;
using Microsoft.VisualStudio.Imaging.Interop;
using Microsoft.VisualStudio.Shell;
using IVsUIShell = Microsoft.VisualStudio.Shell.Interop.IVsUIShell;
using SVsUIShell = Microsoft.VisualStudio.Shell.Interop.SVsUIShell;
 
namespace Microsoft.VisualStudio.LanguageServices.Implementation.PreviewPane;
 
[ExportWorkspaceServiceFactory(typeof(IPreviewPaneService), ServiceLayer.Host), Shared]
internal class PreviewPaneService : IPreviewPaneService, IWorkspaceServiceFactory
{
    private readonly IVsUIShell _uiShell;
 
    [ImportingConstructor]
    [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
    public PreviewPaneService(SVsServiceProvider serviceProvider)
    {
        _uiShell = serviceProvider.GetService(typeof(SVsUIShell)) as IVsUIShell;
    }
 
    IWorkspaceService IWorkspaceServiceFactory.CreateService(HostWorkspaceServices workspaceServices)
        => this;
 
    private static Image GetSeverityIconForDiagnostic(DiagnosticData diagnostic)
    {
        ImageMoniker? moniker = null;
        switch (diagnostic.Severity)
        {
            case DiagnosticSeverity.Error:
                moniker = KnownMonikers.StatusError;
                break;
            case DiagnosticSeverity.Warning:
                moniker = KnownMonikers.StatusWarning;
                break;
            case DiagnosticSeverity.Info:
                moniker = KnownMonikers.StatusInformation;
                break;
            case DiagnosticSeverity.Hidden:
                moniker = KnownMonikers.StatusHidden;
                break;
        }
 
        if (moniker.HasValue)
        {
            return new CrispImage
            {
                Moniker = moniker.Value
            };
        }
 
        return null;
    }
 
    object IPreviewPaneService.GetPreviewPane(DiagnosticData data, IReadOnlyList<object> previewContent)
    {
        var title = data?.Message;
 
        if (string.IsNullOrWhiteSpace(title))
        {
            if (previewContent == null)
            {
                // Bail out in cases where there is nothing to put in the header section
                // of the preview pane and no preview content (i.e. no diff view) either.
                return null;
            }
 
            return new PreviewPane(
                severityIcon: null, id: null, title: null, description: null, helpLink: null, helpLinkToolTipText: null,
                previewContent: previewContent, logIdVerbatimInTelemetry: false, uiShell: _uiShell);
        }
 
        Guid optionPageGuid = default;
        if (data.Properties.TryGetValue("OptionName", out var optionName))
        {
            data.Properties.TryGetValue("OptionLanguage", out var optionLanguage);
            optionPageGuid = GetOptionPageGuidForOptionName(optionName, optionLanguage);
        }
 
        var helpLinkUri = data.GetValidHelpLinkUri();
 
        return new PreviewPane(
            severityIcon: GetSeverityIconForDiagnostic(data),
            id: data.Id, title: title,
            description: data.Description.ToString(CultureInfo.CurrentUICulture),
            helpLink: helpLinkUri,
            helpLinkToolTipText: (helpLinkUri != null) ? string.Format(EditorFeaturesResources.Get_help_for_0, data.Id) : null,
            previewContent: previewContent,
            logIdVerbatimInTelemetry: data.CustomTags.Contains(WellKnownDiagnosticTags.Telemetry),
            uiShell: _uiShell,
            optionPageGuid: optionPageGuid);
    }
 
    private static Guid GetOptionPageGuidForOptionName(string optionName, string optionLanguage)
    {
        if (optionName == nameof(NamingStyleOptions.NamingPreferences))
        {
            if (optionLanguage == LanguageNames.CSharp)
            {
                return Guid.Parse(Guids.CSharpOptionPageNamingStyleIdString);
            }
            else if (optionLanguage == LanguageNames.VisualBasic)
            {
                return Guid.Parse(Guids.VisualBasicOptionPageNamingStyleIdString);
            }
        }
        else if (optionName == nameof(CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInDeclaration))
        {
            if (optionLanguage == LanguageNames.CSharp)
            {
                return Guid.Parse(Guids.CSharpOptionPageCodeStyleIdString);
            }
            else if (optionLanguage == LanguageNames.VisualBasic)
            {
                return Guid.Parse(Guids.VisualBasicOptionPageVBSpecificIdString);
            }
        }
 
        return default;
    }
}