File: CallHierarchy\CallHierarchyItemId.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.
 
using System.Diagnostics.CodeAnalysis;
using System.Threading;
using System.Threading.Tasks;
 
namespace Microsoft.CodeAnalysis.CallHierarchy;
 
internal sealed record CallHierarchyItemId(string SymbolKeyData, ProjectId ProjectId)
{
    public static CallHierarchyItemId Create(ISymbol symbol, Project project, CancellationToken cancellationToken)
        => new(SymbolKey.CreateString(symbol, cancellationToken), project.Id);
 
    public static bool TryCreate(
        ISymbol symbol,
        Project project,
        CancellationToken cancellationToken,
        [NotNullWhen(true)]
        out CallHierarchyItemId? itemId)
    {
        if (!SymbolKey.CanCreate(symbol, cancellationToken))
        {
            itemId = null;
            return false;
        }
 
        itemId = Create(symbol, project, cancellationToken);
        return true;
    }
 
    public async Task<(ISymbol Symbol, Project Project)?> TryResolveAsync(Solution solution, CancellationToken cancellationToken)
    {
        var project = solution.GetProject(ProjectId);
        if (project == null)
            return null;
 
        var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);
        if (compilation == null)
            return null;
 
        var symbol = SymbolKey.ResolveString(SymbolKeyData, compilation, cancellationToken: cancellationToken).GetAnySymbol();
        return symbol == null ? null : (symbol, project);
    }
}