internal static RefKind?GetArgumentRefKind(this HasDynamicArgumentsExpression dynamicOperation, int index) { if (dynamicOperation.Arguments.IsDefaultOrEmpty) { throw new InvalidOperationException(); } if (index < 0 || index >= dynamicOperation.Arguments.Length) { throw new ArgumentOutOfRangeException(nameof(index)); } var argumentRefKinds = dynamicOperation.ArgumentRefKinds; if (argumentRefKinds.IsDefault) { // VB case, arguments cannot have RefKind. return(null); } if (argumentRefKinds.IsEmpty) { // C# case where no explicit RefKind was specified for any argument, hence all arguments have RefKind.None. return(RefKind.None); } return(argumentRefKinds[index]); }
/// <summary> /// Get an optional argument name for a named argument to the given <paramref name="dynamicOperation"/> at the given <paramref name="index"/>. /// </summary> /// <param name="dynamicOperation">Dynamic or late bound operation.</param> /// <param name="index">Argument index.</param> internal static string GetArgumentName(this HasDynamicArgumentsExpression dynamicOperation, int index) { if (dynamicOperation.Arguments.IsDefaultOrEmpty) { throw new InvalidOperationException(); } if (index < 0 || index >= dynamicOperation.Arguments.Length) { throw new ArgumentOutOfRangeException(nameof(index)); } var argumentNames = dynamicOperation.ArgumentNames; return(argumentNames.IsDefaultOrEmpty ? null : argumentNames[index]); }
private static void TestCore(Func <ImmutableArray <IOperation>, ImmutableArray <string>, ImmutableArray <RefKind>, HasDynamicArgumentsExpression> createDynamicExpression) { // Empty arguments and default argument names/refkinds ImmutableArray <IOperation> arguments = ImmutableArray <IOperation> .Empty; ImmutableArray <string> argumentNames = default; ImmutableArray <RefKind> argumentRefKinds = default; HasDynamicArgumentsExpression dynamicExpression = createDynamicExpression(arguments, argumentNames, argumentRefKinds); Assert.Throws <InvalidOperationException>(() => dynamicExpression.GetArgumentName(0)); Assert.Throws <InvalidOperationException>(() => dynamicExpression.GetArgumentRefKind(0)); // Non-empty arguments and default argument names/refkinds arguments = ImmutableArray.Create((IOperation)null); argumentNames = default; argumentRefKinds = default; dynamicExpression = createDynamicExpression(arguments, argumentNames, argumentRefKinds); Assert.Equal(null, dynamicExpression.GetArgumentName(0)); Assert.Equal(null, dynamicExpression.GetArgumentRefKind(0)); // Non-empty arguments and empty argument names/refkinds arguments = ImmutableArray.Create((IOperation)null); argumentNames = ImmutableArray <string> .Empty; argumentRefKinds = ImmutableArray <RefKind> .Empty; dynamicExpression = createDynamicExpression(arguments, argumentNames, argumentRefKinds); Assert.Equal(null, dynamicExpression.GetArgumentName(0)); Assert.Equal(RefKind.None, dynamicExpression.GetArgumentRefKind(0)); // Non-empty arguments and non-empty argument names/refkinds string name = "first"; RefKind refKind = RefKind.Ref; arguments = ImmutableArray.Create((IOperation)null); argumentNames = ImmutableArray.Create(name); argumentRefKinds = ImmutableArray.Create(refKind); dynamicExpression = createDynamicExpression(arguments, argumentNames, argumentRefKinds); Assert.Equal(name, dynamicExpression.GetArgumentName(0)); Assert.Equal(refKind, dynamicExpression.GetArgumentRefKind(0)); // Index out of range: Negative index Assert.Throws <ArgumentOutOfRangeException>(() => dynamicExpression.GetArgumentName(-1)); Assert.Throws <ArgumentOutOfRangeException>(() => dynamicExpression.GetArgumentRefKind(-1)); // Index out of range: Index > Length Assert.Throws <ArgumentOutOfRangeException>(() => dynamicExpression.GetArgumentName(100)); Assert.Throws <ArgumentOutOfRangeException>(() => dynamicExpression.GetArgumentRefKind(100)); }
private void VisitDynamicArguments(HasDynamicArgumentsExpression operation) { var names = operation.ArgumentNames; var refKinds = operation.ArgumentRefKinds; }