예제 #1
0
        private IExpression Index(IAstNode operand, AstNodeCollection arguments)
        {
            var resolvedArguments = ResolveArguments(arguments);

            var resolvedOperand = operand.Accept(this);

            if (resolvedOperand.Type.IsArray)
            {
                if (resolvedArguments.Length != resolvedOperand.Type.GetArrayRank())
                {
                    throw new ExpressionsException(
                              "Invalid array index rank",
                              ExpressionsExceptionType.TypeMismatch
                              );
                }

                foreach (var argument in resolvedArguments)
                {
                    if (!TypeUtil.IsCastAllowed(argument.Type, typeof(int)))
                    {
                        throw new ExpressionsException(
                                  "Argument of array index must be convertable to integer",
                                  ExpressionsExceptionType.TypeMismatch
                                  );
                    }
                }

                if (resolvedArguments.Length == 1)
                {
                    return(new Expressions.Index(resolvedOperand, resolvedArguments[0], resolvedOperand.Type.GetElementType()));
                }
                else
                {
                    return(_resolver.ResolveMethod(resolvedOperand, "Get", resolvedArguments));
                }
            }

            var defaultMemberAttributes = resolvedOperand.Type.GetCustomAttributes(typeof(DefaultMemberAttribute), true);

            if (defaultMemberAttributes.Length != 1)
            {
                throw new ExpressionsException(
                          "Operand does not support indexing",
                          ExpressionsExceptionType.TypeMismatch
                          );
            }

            var result = _resolver.ResolveMethod(resolvedOperand, "get_" + ((DefaultMemberAttribute)defaultMemberAttributes[0]).MemberName, resolvedArguments);

            if (result == null)
            {
                throw new ExpressionsException(
                          "Unresolved index method",
                          ExpressionsExceptionType.UnresolvedMethod
                          );
            }

            return(result);
        }