Esempio n. 1
0
        /// <summary>
        /// Adds named expression to registry.
        /// </summary>
        /// <param name="namedExpression">Named expression to add.</param>
        /// <param name="parameters">Parameters of the expression.</param>
        public void Add(NamedExpression namedExpression, ICollection <string> parameters)
        {
            if (namedExpression == null)
            {
                throw new ArgumentNullException(nameof(namedExpression));
            }

            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            foreach (var parameter in parameters)
            {
                if (!ParametersExpressionsDependencies.ContainsKey(parameter))
                {
                    ParametersExpressionsDependencies[parameter] = new List <Expression>();
                }

                ParametersExpressionsDependencies[parameter].RemoveAll(r => r is NamedExpression n && n.Name == namedExpression.Name);
                ParametersExpressionsDependencies[parameter].Add(namedExpression);
            }

            if (NamedExpressions.ContainsKey(namedExpression.Name))
            {
                NamedExpressions.Remove(namedExpression.Name);
            }

            NamedExpressions.Add(namedExpression.Name, namedExpression);
        }
Esempio n. 2
0
        public ArgumentsInfo(IEmitter emitter, InvocationExpression invocationExpression, IMethod method = null)
        {
            Emitter    = emitter;
            Expression = invocationExpression;

            var arguments = invocationExpression.Arguments.ToList();
            var rr        = emitter.Resolver.ResolveNode(invocationExpression);

            ResolveResult = rr as InvocationResolveResult;

            if (ResolveResult == null && rr is DynamicInvocationResolveResult drr)
            {
                BuildDynamicArgumentsList(drr, arguments);
            }
            else
            {
                BuildArgumentsList(arguments);
            }

            if (ResolveResult != null)
            {
                HasTypeArguments = ((IMethod)ResolveResult.Member).TypeArguments.Count > 0;
                BuildTypedArguments(invocationExpression.Target);
            }

            if (method != null && method.Parameters.Count > 0)
            {
                ThisArgument = invocationExpression;
                var name = method.Parameters[0].Name;

                if (!ArgumentsNames.Contains(name))
                {
                    var list = ArgumentsNames.ToList();
                    list.Add(name);
                    ArgumentsNames = list.ToArray();

                    var expr = ArgumentsExpressions.ToList();
                    expr.Insert(0, invocationExpression);
                    ArgumentsExpressions = expr.ToArray();

                    var namedExpr = NamedExpressions.ToList();
                    namedExpr.Insert(0, new NamedParamExpression(name, invocationExpression));
                    NamedExpressions = namedExpr.ToArray();
                }
            }
        }
Esempio n. 3
0
        public ArgumentsInfo(IEmitter emitter, ObjectCreateExpression objectCreateExpression, IMethod method = null)
        {
            Emitter    = emitter;
            Expression = objectCreateExpression;

            var arguments = objectCreateExpression.Arguments.ToList();
            var rr        = emitter.Resolver.ResolveNode(objectCreateExpression);

            if (rr is DynamicInvocationResolveResult drr)
            {
                if (drr.Target is MethodGroupResolveResult group && group.Methods.Count() > 1)
                {
                    throw new EmitterException(objectCreateExpression, Constants.Messages.Exceptions.DYNAMIC_INVOCATION_TOO_MANY_OVERLOADS);
                }
            }

            ResolveResult = rr as InvocationResolveResult;
            BuildArgumentsList(arguments);
            BuildTypedArguments(objectCreateExpression.Type);

            if (method != null && method.Parameters.Count > 0)
            {
                ThisArgument = objectCreateExpression;
                var name = method.Parameters[0].Name;

                if (!ArgumentsNames.Contains(name))
                {
                    var list = ArgumentsNames.ToList();
                    list.Add(name);
                    ArgumentsNames = list.ToArray();

                    var expr = ArgumentsExpressions.ToList();
                    expr.Add(objectCreateExpression);
                    ArgumentsExpressions = expr.ToArray();

                    var namedExpr = NamedExpressions.ToList();
                    namedExpr.Add(new NamedParamExpression(name, objectCreateExpression));
                    NamedExpressions = namedExpr.ToArray();
                }
            }
        }