Esempio n. 1
0
        private List <Expression> VisitParameters(AngularParser.FunctionCallContext context)
        {
            var parameterExpressions = new List <Expression>();
            var parameterElements    = context.assignment();

            _actualScope.Push(new ScopeInfo(_scopeParameter));
            foreach (var parameterElement in parameterElements)
            {
                var parameterExpression = Visit(parameterElement);
                parameterExpressions.Add(parameterExpression);
            }
            _actualScope.Pop();
            return(parameterExpressions);
        }
Esempio n. 2
0
        public override Expression VisitFunctionCall(AngularParser.FunctionCallContext context)
        {
            var callingContext = _actualScope.Peek();
            var functionName   = context.identifier().GetText();

            MethodCallExpression callExpression;

            if (callingContext.ScopeExpression.Type == typeof(JavascriptObject) || callingContext.ScopeExpression.Type == typeof(object))
            {
                var delegateExpression = Expression.Call(_helperParameter, JavascriptObjectHelper.SelectFunctionInfo, callingContext.ScopeExpression,
                                                         Expression.Constant(null, typeof(object)), Expression.Constant(functionName));
                List <Expression> parameterExpressions = VisitParameters(context);
                CastAllParameter(parameterExpressions, typeof(object));
                var variables = Expression.NewArrayInit(typeof(object), parameterExpressions);
                callExpression = Expression.Call(delegateExpression, DynamicInvoke, variables);
            }
            else
            {
                var functionDelegate = callingContext.ScopeExpression.Type.GetMethod(functionName);
                if (functionDelegate == null)
                {
                    throw new AngularException($"Unknown method: {callingContext.ScopeExpression.Type.Name}.{functionName}");
                }
                List <Expression> parameterExpressions = VisitParameters(context);
                var requiredParameters = functionDelegate.GetParameters();
                if (!TryMatchParameters(parameterExpressions, requiredParameters))
                {
                    throw new AngularException($"Parameterrs not matching the provided parameters for {callingContext.ScopeExpression.Type.Name}.{functionName} Parameters: {string.Join(", ", parameterExpressions.Select(e => e.Type.Name))}");
                }
                callExpression = Expression.Call(callingContext.ScopeExpression, functionDelegate, parameterExpressions);
            }
            var variable     = Expression.Variable(callExpression.Type);
            var varibaleInit = Expression.Assign(variable, callExpression);

            _tryGetInfos.Add(new TryGetInfo
            {
                Variable     = variable,
                VariableInit = varibaleInit
            });
            return(variable);
        }