File: ChangeSignature\CSharpChangeSignatureViewModelFactoryService.cs
Web Access
Project: src\src\VisualStudio\CSharp\Impl\Microsoft.VisualStudio.LanguageServices.CSharp_kvujzooq_wpftmp.csproj (Microsoft.VisualStudio.LanguageServices.CSharp)
// 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 Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.VisualStudio.LanguageServices.Implementation.ChangeSignature;
using static Microsoft.VisualStudio.LanguageServices.Implementation.ChangeSignature.ChangeSignatureDialogViewModel;
 
namespace Microsoft.VisualStudio.LanguageServices.CSharp.ChangeSignature;
 
[ExportLanguageService(typeof(IChangeSignatureViewModelFactoryService), LanguageNames.CSharp), Shared]
internal sealed class CSharpChangeSignatureViewModelFactoryService : ChangeSignatureViewModelFactoryService
{
    private static readonly CSharpParseOptions s_langVersionLatestParseOptions = new(LanguageVersion.Preview);
 
    [ImportingConstructor]
    [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
    public CSharpChangeSignatureViewModelFactoryService()
    {
    }
 
    public override SymbolDisplayPart[] GeneratePreviewDisplayParts(AddedParameterViewModel addedParameterViewModel)
    {
        var parts = new List<SymbolDisplayPart>();
 
        // TO-DO: We need to add proper colorization for added parameters:
        // https://github.com/dotnet/roslyn/issues/47986
        var isPredefinedType = SyntaxFactory.ParseExpression(addedParameterViewModel.Type).Kind() == SyntaxKind.PredefinedType;
        var typePartKind = isPredefinedType ? SymbolDisplayPartKind.Keyword : SymbolDisplayPartKind.ClassName;
 
        parts.Add(new SymbolDisplayPart(typePartKind, null, addedParameterViewModel.Type));
        parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " "));
        parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, null, addedParameterViewModel.ParameterName));
 
        if (!string.IsNullOrWhiteSpace(addedParameterViewModel.Default))
        {
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " "));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, "="));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " "));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Text, null, addedParameterViewModel.Default));
        }
 
        return [.. parts];
    }
 
    // Use LangVersion Preview to ensure that all types parse correctly. If the user types in a type only available
    // in a preview version, they'll get a diagnostic after everything is generated
    public override bool IsTypeNameValid(string typeName) => !SyntaxFactory.ParseTypeName(typeName, options: s_langVersionLatestParseOptions).ContainsDiagnostics;
 
    public override SyntaxNode GetTypeNode(string typeName) => SyntaxFactory.ParseTypeName(typeName);
}