File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\SymbolKey\SymbolKeyResolution.cs
Web Access
Project: src\src\CodeStyle\Core\Analyzers\Microsoft.CodeAnalysis.CodeStyle.csproj (Microsoft.CodeAnalysis.CodeStyle)
// 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.Collections.Immutable;
 
namespace Microsoft.CodeAnalysis;
 
/// <summary>
/// The result of <see cref="SymbolKey.Resolve"/>. If the <see cref="SymbolKey"/> could be uniquely mapped to a
/// single <see cref="ISymbol"/> then that will be returned in <see cref="Symbol"/>.  Otherwise, if the key resolves
/// to multiple symbols (which can happen in error scenarios), then <see cref="CandidateSymbols"/> and <see
/// cref="CandidateReason"/> will be returned.
/// 
/// If no symbol can be found <see cref="Symbol"/> will be <c>null</c> and <see cref="CandidateSymbols"/>
/// will be empty.
/// </summary>
internal readonly partial struct SymbolKeyResolution
{
    private readonly ImmutableArray<ISymbol> _candidateSymbols;
 
    internal SymbolKeyResolution(ISymbol? symbol)
    {
        Symbol = symbol;
        _candidateSymbols = default;
        CandidateReason = CandidateReason.None;
    }
 
    internal SymbolKeyResolution(ImmutableArray<ISymbol> candidateSymbols, CandidateReason candidateReason)
    {
        Symbol = null;
        _candidateSymbols = candidateSymbols;
        CandidateReason = candidateReason;
    }
 
    internal int SymbolCount => Symbol != null ? 1 : CandidateSymbols.Length;
 
    public ISymbol? Symbol { get; }
    public CandidateReason CandidateReason { get; }
    public ImmutableArray<ISymbol> CandidateSymbols => _candidateSymbols.NullToEmpty();
 
    public Enumerator<ISymbol> GetEnumerator()
        => new(this);
 
    internal Enumerable<TSymbol> OfType<TSymbol>() where TSymbol : ISymbol
        => new(this);
}