| File: Binder\Semantics\OverloadResolution\ArgumentAnalysisResult.cs | Web Access |
| Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp) |
// 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.Collections.Immutable; using System.Diagnostics; namespace Microsoft.CodeAnalysis.CSharp { internal readonly struct ArgumentAnalysisResult { public readonly ImmutableArray<int> ArgsToParamsOpt; public readonly int ArgumentPosition; public readonly int ParameterPosition; public readonly ArgumentAnalysisResultKind Kind; public int ParameterFromArgument(int arg) { Debug.Assert(arg >= 0); if (ArgsToParamsOpt.IsDefault) { return arg; } Debug.Assert(arg < ArgsToParamsOpt.Length); return ArgsToParamsOpt[arg]; } private ArgumentAnalysisResult(ArgumentAnalysisResultKind kind, int argumentPosition, int parameterPosition, ImmutableArray<int> argsToParamsOpt) { this.Kind = kind; this.ArgumentPosition = argumentPosition; this.ParameterPosition = parameterPosition; this.ArgsToParamsOpt = argsToParamsOpt; } public bool IsValid { get { return this.Kind < ArgumentAnalysisResultKind.FirstInvalid; } } public static ArgumentAnalysisResult NameUsedForPositional(int argumentPosition) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.NameUsedForPositional, argumentPosition, 0, default(ImmutableArray<int>)); } public static ArgumentAnalysisResult NoCorrespondingParameter(int argumentPosition) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.NoCorrespondingParameter, argumentPosition, 0, default(ImmutableArray<int>)); } public static ArgumentAnalysisResult NoCorrespondingNamedParameter(int argumentPosition) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.NoCorrespondingNamedParameter, argumentPosition, 0, default(ImmutableArray<int>)); } public static ArgumentAnalysisResult DuplicateNamedArgument(int argumentPosition) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.DuplicateNamedArgument, argumentPosition, 0, default(ImmutableArray<int>)); } public static ArgumentAnalysisResult RequiredParameterMissing(int parameterPosition) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.RequiredParameterMissing, 0, parameterPosition, default(ImmutableArray<int>)); } public static ArgumentAnalysisResult BadNonTrailingNamedArgument(int argumentPosition) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.BadNonTrailingNamedArgument, argumentPosition, 0, default(ImmutableArray<int>)); } public static ArgumentAnalysisResult NormalForm(ImmutableArray<int> argsToParamsOpt) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.Normal, 0, 0, argsToParamsOpt); } public static ArgumentAnalysisResult ExpandedForm(ImmutableArray<int> argsToParamsOpt) { return new ArgumentAnalysisResult(ArgumentAnalysisResultKind.Expanded, 0, 0, argsToParamsOpt); } #if DEBUG #pragma warning disable IDE0051 // Remove unused private members private string Dump() #pragma warning restore IDE0051 // Remove unused private members { string s = ""; switch (Kind) { case ArgumentAnalysisResultKind.Normal: s += "Valid in normal form."; break; case ArgumentAnalysisResultKind.Expanded: s += "Valid in expanded form."; break; case ArgumentAnalysisResultKind.NameUsedForPositional: s += "Invalid because argument " + ArgumentPosition + " had a name."; break; case ArgumentAnalysisResultKind.DuplicateNamedArgument: s += "Invalid because named argument " + ArgumentPosition + " was specified twice."; break; case ArgumentAnalysisResultKind.NoCorrespondingParameter: s += "Invalid because argument " + ArgumentPosition + " has no corresponding parameter."; break; case ArgumentAnalysisResultKind.NoCorrespondingNamedParameter: s += "Invalid because named argument " + ArgumentPosition + " has no corresponding parameter."; break; case ArgumentAnalysisResultKind.RequiredParameterMissing: s += "Invalid because parameter " + ParameterPosition + " has no corresponding argument."; break; case ArgumentAnalysisResultKind.BadNonTrailingNamedArgument: s += "Invalid because named argument " + ParameterPosition + " is used out of position but some following argument(s) are not named."; break; } if (!ArgsToParamsOpt.IsDefault) { for (int i = 0; i < ArgsToParamsOpt.Length; ++i) { s += "\nArgument " + i + " corresponds to parameter " + ArgsToParamsOpt[i]; } } return s; } #endif } }