File: src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateConversionService.State.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// 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.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.GenerateMember.GenerateParameterizedMember;
 
internal abstract partial class AbstractGenerateConversionService<TService, TSimpleNameSyntax, TExpressionSyntax, TInvocationExpressionSyntax>
{
    protected new class State : AbstractGenerateParameterizedMemberService<TService, TSimpleNameSyntax, TExpressionSyntax, TInvocationExpressionSyntax>.State
    {
        public static async Task<State> GenerateConversionStateAsync(
           TService service,
           SemanticDocument document,
           SyntaxNode interfaceNode,
           CancellationToken cancellationToken)
        {
            var state = new State();
            if (!await state.TryInitializeConversionAsync(service, document, interfaceNode, cancellationToken).ConfigureAwait(false))
            {
                return null;
            }
 
            return state;
        }
 
        private Task<bool> TryInitializeConversionAsync(
            TService service,
            SemanticDocument document,
            SyntaxNode node,
            CancellationToken cancellationToken)
        {
            if (service.IsImplicitConversionGeneration(node))
            {
                if (!TryInitializeImplicitConversion(service, document, node, cancellationToken))
                {
                    return SpecializedTasks.False;
                }
            }
            else if (service.IsExplicitConversionGeneration(node))
            {
                if (!TryInitializeExplicitConversion(service, document, node, cancellationToken))
                {
                    return SpecializedTasks.False;
                }
            }
 
            return TryFinishInitializingStateAsync(service, document, cancellationToken);
        }
 
        private bool TryInitializeExplicitConversion(TService service, SemanticDocument document, SyntaxNode node, CancellationToken cancellationToken)
        {
            MethodKind = MethodKind.Conversion;
            if (!service.TryInitializeExplicitConversionState(
                document, node, ClassInterfaceModuleStructTypes, cancellationToken,
                out var identifierToken, out var methodSymbol, out var typeToGenerateIn))
            {
                return false;
            }
 
            ContainingType = document.SemanticModel.GetEnclosingNamedType(node.SpanStart, cancellationToken);
            if (ContainingType == null)
            {
                return false;
            }
 
            IdentifierToken = identifierToken;
            TypeToGenerateIn = typeToGenerateIn;
            SignatureInfo = new MethodSignatureInfo(document, this, methodSymbol);
            location = node.GetLocation();
            MethodGenerationKind = MethodGenerationKind.ExplicitConversion;
            return true;
        }
 
        private bool TryInitializeImplicitConversion(TService service, SemanticDocument document, SyntaxNode node, CancellationToken cancellationToken)
        {
            MethodKind = MethodKind.Conversion;
            if (!service.TryInitializeImplicitConversionState(
                document, node, ClassInterfaceModuleStructTypes, cancellationToken,
                out var identifierToken, out var methodSymbol, out var typeToGenerateIn))
            {
                return false;
            }
 
            ContainingType = document.SemanticModel.GetEnclosingNamedType(node.SpanStart, cancellationToken);
            if (ContainingType == null)
            {
                return false;
            }
 
            IdentifierToken = identifierToken;
            TypeToGenerateIn = typeToGenerateIn;
            SignatureInfo = new MethodSignatureInfo(document, this, methodSymbol);
            MethodGenerationKind = MethodGenerationKind.ImplicitConversion;
            return true;
        }
    }
}