File: ChangeSignature\AddedParameterOrExistingIndex.cs
Web Access
Project: src\src\EditorFeatures\TestUtilities\Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities.csproj (Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities)
// 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.Threading;
using Microsoft.CodeAnalysis.ChangeSignature;
using Microsoft.CodeAnalysis.Shared.Extensions;
 
namespace Microsoft.CodeAnalysis.Test.Utilities.ChangeSignature;
 
internal sealed class AddedParameterOrExistingIndex
{
    public bool IsExisting { get; }
 
    public int? OldIndex { get; }
 
    private readonly AddedParameter? _addedParameterWithoutTypeSymbol;
    private readonly string? _addedParameterFullyQualifiedTypeName;
 
    public AddedParameterOrExistingIndex(int index)
    {
        OldIndex = index;
        IsExisting = true;
        _addedParameterWithoutTypeSymbol = null;
        _addedParameterFullyQualifiedTypeName = null;
    }
 
    public AddedParameterOrExistingIndex(AddedParameter addedParameterWithoutTypeSymbol, string addedParameterFullyQualifiedTypeName)
    {
        OldIndex = null;
        IsExisting = false;
        _addedParameterWithoutTypeSymbol = addedParameterWithoutTypeSymbol;
        _addedParameterFullyQualifiedTypeName = addedParameterFullyQualifiedTypeName;
    }
 
    internal static AddedParameterOrExistingIndex CreateAdded(
        string fullTypeName,
        string parameterName,
        CallSiteKind callSiteKind,
        string callSiteValue = "",
        bool isRequired = true,
        string defaultValue = "",
        bool typeBinds = true)
    {
        var parameter = new AddedParameter(
            type: null!, // Filled in later based on the fullTypeName
            typeName: null!, // Not needed for engine testing
            parameterName,
            callSiteKind,
            callSiteValue,
            isRequired,
            defaultValue,
            typeBinds);
 
        return new AddedParameterOrExistingIndex(parameter, fullTypeName);
    }
 
    public override string ToString()
        => IsExisting ? OldIndex.ToString() : (_addedParameterWithoutTypeSymbol?.ToString() ?? string.Empty);
 
    internal AddedParameter GetAddedParameter(Document document)
    {
        var semanticModel = document.GetRequiredSemanticModelAsync(CancellationToken.None).AsTask().Result;
 
        var type = document.Project.Language switch
        {
            LanguageNames.CSharp => semanticModel.GetSpeculativeTypeInfo(0, CSharp.SyntaxFactory.ParseTypeName(_addedParameterFullyQualifiedTypeName!), SpeculativeBindingOption.BindAsTypeOrNamespace).Type,
            LanguageNames.VisualBasic => semanticModel.GetSpeculativeTypeInfo(0, VisualBasic.SyntaxFactory.ParseTypeName(_addedParameterFullyQualifiedTypeName!), SpeculativeBindingOption.BindAsTypeOrNamespace).Type,
            _ => throw new ArgumentException("Unsupported language")
        };
 
        if (type == null)
        {
            throw new ArgumentException($"Could not bind type {_addedParameterFullyQualifiedTypeName}", nameof(_addedParameterFullyQualifiedTypeName));
        }
 
        return new AddedParameter(
            type,
            _addedParameterWithoutTypeSymbol!.TypeName,
            _addedParameterWithoutTypeSymbol.Name,
            _addedParameterWithoutTypeSymbol.CallSiteKind,
            _addedParameterWithoutTypeSymbol.CallSiteValue,
            _addedParameterWithoutTypeSymbol.IsRequired,
            _addedParameterWithoutTypeSymbol.DefaultValue);
    }
}