307 lines
13 KiB
C#
307 lines
13 KiB
C#
using System.Collections.Immutable;
|
|
using System.Linq;
|
|
using Microsoft.CodeAnalysis.CSharp.Symbols;
|
|
using Roslyn.Utilities;
|
|
|
|
namespace Microsoft.CodeAnalysis.CSharp;
|
|
|
|
internal readonly struct MemberAnalysisResult
|
|
{
|
|
public readonly ImmutableArray<Conversion> ConversionsOpt;
|
|
|
|
public readonly BitVector BadArgumentsOpt;
|
|
|
|
public readonly ImmutableArray<int> ArgsToParamsOpt;
|
|
|
|
public readonly ImmutableArray<TypeParameterDiagnosticInfo> ConstraintFailureDiagnostics;
|
|
|
|
public readonly int BadParameter;
|
|
|
|
public readonly MemberResolutionKind Kind;
|
|
|
|
public readonly bool HasAnyRefOmittedArgument;
|
|
|
|
public int FirstBadArgument
|
|
{
|
|
get
|
|
{
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
|
BitVector badArgumentsOpt = BadArgumentsOpt;
|
|
return ((BitVector)(ref badArgumentsOpt)).TrueBits().First();
|
|
}
|
|
}
|
|
|
|
public bool IsApplicable
|
|
{
|
|
get
|
|
{
|
|
MemberResolutionKind kind = Kind;
|
|
if (kind - 1 <= MemberResolutionKind.ApplicableInNormalForm || kind - 22 <= MemberResolutionKind.ApplicableInNormalForm)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public bool IsValid
|
|
{
|
|
get
|
|
{
|
|
MemberResolutionKind kind = Kind;
|
|
if (kind - 1 <= MemberResolutionKind.ApplicableInNormalForm)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private MemberAnalysisResult(MemberResolutionKind kind, BitVector badArgumentsOpt = default(BitVector), ImmutableArray<int> argsToParamsOpt = default(ImmutableArray<int>), ImmutableArray<Conversion> conversionsOpt = default(ImmutableArray<Conversion>), int missingParameter = -1, bool hasAnyRefOmittedArgument = false, ImmutableArray<TypeParameterDiagnosticInfo> constraintFailureDiagnosticsOpt = default(ImmutableArray<TypeParameterDiagnosticInfo>))
|
|
{
|
|
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
|
Kind = kind;
|
|
BadArgumentsOpt = badArgumentsOpt;
|
|
ArgsToParamsOpt = argsToParamsOpt;
|
|
ConversionsOpt = conversionsOpt;
|
|
BadParameter = missingParameter;
|
|
HasAnyRefOmittedArgument = hasAnyRefOmittedArgument;
|
|
ConstraintFailureDiagnostics = ImmutableArrayExtensions.NullToEmpty<TypeParameterDiagnosticInfo>(constraintFailureDiagnosticsOpt);
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
throw ExceptionUtilities.Unreachable("/_/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/MemberAnalysisResult.cs", 63);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
throw ExceptionUtilities.Unreachable("/_/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/MemberAnalysisResult.cs", 68);
|
|
}
|
|
|
|
public Conversion ConversionForArg(int arg)
|
|
{
|
|
if (ConversionsOpt.IsDefault)
|
|
{
|
|
return Conversion.Identity;
|
|
}
|
|
return ConversionsOpt[arg];
|
|
}
|
|
|
|
public int ParameterFromArgument(int arg)
|
|
{
|
|
if (ArgsToParamsOpt.IsDefault)
|
|
{
|
|
return arg;
|
|
}
|
|
return ArgsToParamsOpt[arg];
|
|
}
|
|
|
|
internal bool HasUseSiteDiagnosticToReportFor(Symbol symbol)
|
|
{
|
|
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
|
|
if (!SuppressUseSiteDiagnosticsForKind(Kind) && (object)symbol != null)
|
|
{
|
|
return symbol.GetUseSiteInfo().DiagnosticInfo != null;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static bool SuppressUseSiteDiagnosticsForKind(MemberResolutionKind kind)
|
|
{
|
|
switch (kind)
|
|
{
|
|
case MemberResolutionKind.UnsupportedMetadata:
|
|
return true;
|
|
case MemberResolutionKind.NoCorrespondingParameter:
|
|
case MemberResolutionKind.NoCorrespondingNamedParameter:
|
|
case MemberResolutionKind.DuplicateNamedArgument:
|
|
case MemberResolutionKind.RequiredParameterMissing:
|
|
case MemberResolutionKind.NameUsedForPositional:
|
|
case MemberResolutionKind.LessDerived:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static MemberAnalysisResult ArgumentParameterMismatch(ArgumentAnalysisResult argAnalysis)
|
|
{
|
|
return argAnalysis.Kind switch
|
|
{
|
|
ArgumentAnalysisResultKind.NoCorrespondingParameter => NoCorrespondingParameter(argAnalysis.ArgumentPosition),
|
|
ArgumentAnalysisResultKind.NoCorrespondingNamedParameter => NoCorrespondingNamedParameter(argAnalysis.ArgumentPosition),
|
|
ArgumentAnalysisResultKind.DuplicateNamedArgument => DuplicateNamedArgument(argAnalysis.ArgumentPosition),
|
|
ArgumentAnalysisResultKind.RequiredParameterMissing => RequiredParameterMissing(argAnalysis.ParameterPosition),
|
|
ArgumentAnalysisResultKind.NameUsedForPositional => NameUsedForPositional(argAnalysis.ArgumentPosition),
|
|
ArgumentAnalysisResultKind.BadNonTrailingNamedArgument => BadNonTrailingNamedArgument(argAnalysis.ArgumentPosition),
|
|
_ => throw ExceptionUtilities.UnexpectedValue((object)argAnalysis.Kind),
|
|
};
|
|
}
|
|
|
|
public static MemberAnalysisResult NameUsedForPositional(int argumentPosition)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.NameUsedForPositional, CreateBadArgumentsWithPosition(argumentPosition));
|
|
}
|
|
|
|
public static MemberAnalysisResult BadNonTrailingNamedArgument(int argumentPosition)
|
|
{
|
|
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.BadNonTrailingNamedArgument, CreateBadArgumentsWithPosition(argumentPosition));
|
|
}
|
|
|
|
public static MemberAnalysisResult NoCorrespondingParameter(int argumentPosition)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.NoCorrespondingParameter, CreateBadArgumentsWithPosition(argumentPosition));
|
|
}
|
|
|
|
public static MemberAnalysisResult NoCorrespondingNamedParameter(int argumentPosition)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.NoCorrespondingNamedParameter, CreateBadArgumentsWithPosition(argumentPosition));
|
|
}
|
|
|
|
public static MemberAnalysisResult DuplicateNamedArgument(int argumentPosition)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.DuplicateNamedArgument, CreateBadArgumentsWithPosition(argumentPosition));
|
|
}
|
|
|
|
internal static BitVector CreateBadArgumentsWithPosition(int argumentPosition)
|
|
{
|
|
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
|
|
BitVector result = BitVector.Create(argumentPosition + 1);
|
|
((BitVector)(ref result))[argumentPosition] = true;
|
|
return result;
|
|
}
|
|
|
|
public static MemberAnalysisResult RequiredParameterMissing(int parameterPosition)
|
|
{
|
|
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.RequiredParameterMissing, default(BitVector), default(ImmutableArray<int>), default(ImmutableArray<Conversion>), parameterPosition);
|
|
}
|
|
|
|
public static MemberAnalysisResult UseSiteError()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.UseSiteError);
|
|
}
|
|
|
|
public static MemberAnalysisResult UnsupportedMetadata()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.UnsupportedMetadata);
|
|
}
|
|
|
|
public static MemberAnalysisResult BadArgumentConversions(ImmutableArray<int> argsToParamsOpt, BitVector badArguments, ImmutableArray<Conversion> conversions)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.BadArgumentConversion, badArguments, argsToParamsOpt, conversions);
|
|
}
|
|
|
|
public static MemberAnalysisResult InaccessibleTypeArgument()
|
|
{
|
|
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.InaccessibleTypeArgument);
|
|
}
|
|
|
|
public static MemberAnalysisResult TypeInferenceFailed()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.TypeInferenceFailed);
|
|
}
|
|
|
|
public static MemberAnalysisResult TypeInferenceExtensionInstanceArgumentFailed()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.TypeInferenceExtensionInstanceArgument);
|
|
}
|
|
|
|
public static MemberAnalysisResult StaticInstanceMismatch()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.StaticInstanceMismatch);
|
|
}
|
|
|
|
public static MemberAnalysisResult ConstructedParameterFailedConstraintsCheck(int parameterPosition)
|
|
{
|
|
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.ConstructedParameterFailedConstraintCheck, default(BitVector), default(ImmutableArray<int>), default(ImmutableArray<Conversion>), parameterPosition);
|
|
}
|
|
|
|
public static MemberAnalysisResult WrongRefKind()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.WrongRefKind);
|
|
}
|
|
|
|
public static MemberAnalysisResult WrongReturnType()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.WrongReturnType);
|
|
}
|
|
|
|
public static MemberAnalysisResult LessDerived()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.LessDerived);
|
|
}
|
|
|
|
public static MemberAnalysisResult NormalForm(ImmutableArray<int> argsToParamsOpt, ImmutableArray<Conversion> conversions, bool hasAnyRefOmittedArgument)
|
|
{
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.ApplicableInNormalForm, BitVector.Null, argsToParamsOpt, conversions, -1, hasAnyRefOmittedArgument);
|
|
}
|
|
|
|
public static MemberAnalysisResult ExpandedForm(ImmutableArray<int> argsToParamsOpt, ImmutableArray<Conversion> conversions, bool hasAnyRefOmittedArgument)
|
|
{
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.ApplicableInExpandedForm, BitVector.Null, argsToParamsOpt, conversions, -1, hasAnyRefOmittedArgument);
|
|
}
|
|
|
|
public static MemberAnalysisResult Worse()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.Worse);
|
|
}
|
|
|
|
public static MemberAnalysisResult Worst()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.Worst);
|
|
}
|
|
|
|
internal static MemberAnalysisResult ConstraintFailure(ImmutableArray<TypeParameterDiagnosticInfo> constraintFailureDiagnostics)
|
|
{
|
|
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.ConstraintFailure, default(BitVector), default(ImmutableArray<int>), default(ImmutableArray<Conversion>), -1, hasAnyRefOmittedArgument: false, constraintFailureDiagnostics);
|
|
}
|
|
|
|
internal static MemberAnalysisResult WrongCallingConvention()
|
|
{
|
|
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
|
return new MemberAnalysisResult(MemberResolutionKind.WrongCallingConvention);
|
|
}
|
|
}
|