コード例 #1
0
        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]);
        }
コード例 #2
0
        /// <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]);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
 private void VisitDynamicArguments(HasDynamicArgumentsExpression operation)
 {
     var names    = operation.ArgumentNames;
     var refKinds = operation.ArgumentRefKinds;
 }