File: ChangeSignature\ChangeSignatureDialogViewModel.ParameterViewModels.cs
Web Access
Project: src\src\VisualStudio\Core\Def\Microsoft.VisualStudio.LanguageServices_e5lazejx_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.
 
using System;
using System.Linq;
using System.Windows;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.ChangeSignature;
using Microsoft.CodeAnalysis.Shared.Extensions;
 
namespace Microsoft.VisualStudio.LanguageServices.Implementation.ChangeSignature;
 
internal partial class ChangeSignatureDialogViewModel
{
    public abstract class ParameterViewModel
    {
        protected ChangeSignatureDialogViewModel ChangeSignatureDialogViewModel { get; }
 
        public abstract Parameter Parameter { get; }
 
        public abstract string Type { get; }
        public abstract string ParameterName { get; }
        public abstract bool IsRemoved { get; set; }
        public abstract bool IsDisabled { get; }
        public abstract string CallSite { get; }
        public abstract bool IsRequired { get; }
        public abstract string DefaultValue { get; }
 
        public abstract string InitialIndex { get; }
        public abstract string Modifier { get; }
        public abstract string Default { get; }
 
        public string ModifierAutomationText => ValueOrNone(Modifier);
        public string DefaultAutomationText => ValueOrNone(Default);
        public string CallSiteAutomationText => ValueOrNone(CallSite);
 
        public ParameterViewModel(ChangeSignatureDialogViewModel changeSignatureDialogViewModel)
        {
            ChangeSignatureDialogViewModel = changeSignatureDialogViewModel;
        }
 
        private static string ValueOrNone(string value)
        {
            return !string.IsNullOrEmpty(value)
                ? value
                : ServicesVSResources.None;
        }
 
        public Visibility HasParameterNameConflict { get; set; }
 
        public virtual Visibility TypeWarningVisibility => Visibility.Collapsed;
 
        public string ShortAutomationText => $"{Type} {ParameterName}";
 
        public virtual string FullAutomationText
        {
            get
            {
                var text = $"{Modifier} {Type} {ParameterName}";
                if (!string.IsNullOrWhiteSpace(Default))
                {
                    text += $" = {Default}";
                }
 
                return text;
            }
        }
 
        public bool NeedsBottomBorder
        {
            get
            {
                if (this == ChangeSignatureDialogViewModel._thisParameter)
                {
                    return true;
                }
 
                if (this == ChangeSignatureDialogViewModel._parametersWithoutDefaultValues.LastOrDefault() &&
                    (ChangeSignatureDialogViewModel._parametersWithDefaultValues.Any() || ChangeSignatureDialogViewModel._paramsParameter != null))
                {
                    return true;
                }
 
                if (this == ChangeSignatureDialogViewModel._parametersWithDefaultValues.LastOrDefault() &&
                    ChangeSignatureDialogViewModel._paramsParameter != null)
                {
                    return true;
                }
 
                return false;
            }
        }
 
        public virtual string CallSiteValue => string.Empty;
    }
 
    public class AddedParameterViewModel : ParameterViewModel
    {
        public override Parameter Parameter => _addedParameter;
        private readonly AddedParameter _addedParameter;
 
        public AddedParameterViewModel(ChangeSignatureDialogViewModel changeSignatureDialogViewModel, AddedParameter addedParameter)
            : base(changeSignatureDialogViewModel)
        {
            _addedParameter = addedParameter;
        }
 
        public override string Type => _addedParameter.TypeName;
 
        public override Visibility TypeWarningVisibility => _addedParameter.TypeBinds ? Visibility.Collapsed : Visibility.Visible;
 
        public override string ParameterName => _addedParameter.Name;
 
        public override bool IsRemoved
        {
            get => false;
            set => throw new InvalidOperationException();
        }
 
        public override string FullAutomationText
        {
            get
            {
                var baseText = base.FullAutomationText;
                return ServicesVSResources.Added_Parameter + baseText + string.Format(ServicesVSResources.Inserting_call_site_value_0, CallSite);
            }
        }
 
        public override bool IsDisabled => false;
 
        public override string CallSite
        {
            get
            {
                return _addedParameter.CallSiteKind == CallSiteKind.ValueWithName
                    ? _addedParameter.Name + ": " + _addedParameter.CallSiteValue
                    : _addedParameter.CallSiteValue;
            }
        }
 
        public override string CallSiteValue => _addedParameter.CallSiteValue;
 
        public override string InitialIndex => "+";
 
        // Newly added parameters cannot have modifiers yet
        public override string Modifier => string.Empty;
 
        public override string Default => _addedParameter.DefaultValue;
 
        public override bool IsRequired => _addedParameter.IsRequired;
        public override string DefaultValue => _addedParameter.DefaultValue;
    }
 
    public class ExistingParameterViewModel : ParameterViewModel
    {
        public IParameterSymbol ParameterSymbol => _existingParameter.Symbol;
 
        private readonly ExistingParameter _existingParameter;
 
        public override Parameter Parameter => _existingParameter;
 
        public ExistingParameterViewModel(ChangeSignatureDialogViewModel changeSignatureDialogViewModel, ExistingParameter existingParameter, int initialIndex)
            : base(changeSignatureDialogViewModel)
        {
            _existingParameter = existingParameter;
            InitialIndex = initialIndex.ToString();
        }
 
        public override string CallSite => string.Empty;
 
        public override string InitialIndex { get; }
 
        public override string Modifier
        {
            get
            {
                switch (ParameterSymbol.Language)
                {
                    case LanguageNames.CSharp:
                        return ModifierText("out", "ref", "ref readonly", "in", "params", "this");
                    case LanguageNames.VisualBasic:
                        return ModifierText(@out: null, "ByRef", refReadonly: null, @in: null, "ParamArray", "Me");
                    default:
                        return string.Empty;
                }
 
                string ModifierText(string? @out, string? @ref, string? refReadonly, string? @in, string? @params, string? @this)
                {
                    switch (ParameterSymbol.RefKind)
                    {
                        case RefKind.Out:
                            return @out ?? string.Empty;
                        case RefKind.Ref:
                            return @ref ?? string.Empty;
                        case RefKind.In:
                            return @in ?? string.Empty;
                        case RefKind.RefReadOnlyParameter:
                            return refReadonly ?? string.Empty;
                    }
 
                    if (ParameterSymbol.IsParams)
                    {
                        return @params ?? string.Empty;
                    }
 
                    if (ChangeSignatureDialogViewModel._thisParameter != null &&
                        ParameterSymbol == ChangeSignatureDialogViewModel._thisParameter.ParameterSymbol)
                    {
                        return @this ?? string.Empty;
                    }
 
                    return string.Empty;
                }
            }
        }
 
        public override string Type => ParameterSymbol.Type.ToDisplayString(s_parameterDisplayFormat);
 
        public override string ParameterName => ParameterSymbol.Name;
 
        public override string Default
        {
            get
            {
                if (!ParameterSymbol.HasExplicitDefaultValue)
                {
                    return string.Empty;
                }
 
                switch (ParameterSymbol.Language)
                {
                    case LanguageNames.CSharp:
                        return NullText("null", "default");
                    case LanguageNames.VisualBasic:
                        return NullText("Nothing", "Nothing");
                }
 
                return string.Empty;
 
                string NullText(string @null, string @default)
                {
                    return ParameterSymbol.ExplicitDefaultValue == null ? (ParameterSymbol.Type.IsReferenceType ? @null : @default) :
                           ParameterSymbol.ExplicitDefaultValue is string ? "\"" + ParameterSymbol.ExplicitDefaultValue.ToString() + "\"" :
                           ParameterSymbol.ExplicitDefaultValue.ToString();
                }
            }
        }
 
        public override bool IsDisabled => ChangeSignatureDialogViewModel.IsDisabled(this);
 
        public override bool IsRemoved { get; set; }
 
        public override bool IsRequired => !ParameterSymbol.HasExplicitDefaultValue;
        public override string DefaultValue => Default;
    }
}