public IExpression MethodCall(Ast.MethodCall methodCall)
        {
            var arguments = ResolveArguments(methodCall.Arguments);

            if (methodCall.Operand is IdentifierAccess identifierAccess)
            {
                var result = ResolveGlobalMethod(identifierAccess.Name, arguments);

                if (result != null)
                    return result;

                throw new ExpressionsException(
                    String.Format("Cannot resolve symbol '{0}'", identifierAccess.Name),
                    ExpressionsExceptionType.UndefinedName
                );
            }

            if (methodCall.Operand is MemberAccess memberAccess)
            {
                var operand = memberAccess.Operand.Accept(this);

                if (operand is ImportAccess)
                {
                    foreach (var import in ((ImportAccess)operand).Import.Imports)
                    {
                        if (import.Type != null)
                        {
                            var result = _resolver.ResolveMethod(
                                new TypeAccess(import.Type), memberAccess.Member, arguments
                            );

                            if (result != null)
                                return result;
                        }
                    }
                }
                else
                {
                    var result = _resolver.ResolveMethod(operand, memberAccess.Member, arguments);

                    if (result != null)
                        return result;
                }
            }

            throw new ExpressionsException("Cannot resolve symbol", ExpressionsExceptionType.UndefinedName);
        }
Beispiel #2
0
        public IExpression MethodCall(Ast.MethodCall methodCall)
        {
            var arguments = ResolveArguments(methodCall.Arguments);

            var identifierAccess = methodCall.Operand as IdentifierAccess;

            if (identifierAccess != null)
            {
                var result = ResolveGlobalMethod(identifierAccess.Name, arguments);

                if (result != null)
                {
                    return(result);
                }

                if (_resolver.DynamicExpression.Language == ExpressionLanguage.VisualBasic)
                {
                    return(Index(methodCall.Operand, methodCall.Arguments));
                }

                throw new ExpressionsException(
                          String.Format("Cannot resolve symbol '{0}'", identifierAccess.Name),
                          ExpressionsExceptionType.UndefinedName
                          );
            }

            var memberAccess = methodCall.Operand as MemberAccess;

            if (memberAccess != null)
            {
                var operand = memberAccess.Operand.Accept(this);

                if (operand is ImportAccess)
                {
                    foreach (var import in ((ImportAccess)operand).Import.Imports)
                    {
                        if (import.Type != null)
                        {
                            var result = _resolver.ResolveMethod(
                                new TypeAccess(import.Type), memberAccess.Member, arguments
                                );

                            if (result != null)
                            {
                                return(result);
                            }
                        }
                    }
                }
                else
                {
                    var result = _resolver.ResolveMethod(operand, memberAccess.Member, arguments);

                    if (result != null)
                    {
                        return(result);
                    }
                }
            }

            if (_resolver.DynamicExpression.Language == ExpressionLanguage.VisualBasic)
            {
                return(Index(methodCall.Operand, methodCall.Arguments));
            }

            throw new ExpressionsException("Cannot resolve symbol", ExpressionsExceptionType.UndefinedName);
        }