|
// 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);
}
|