protected internal override Node VisitVariableTarget(VariableTarget node)
            {
                node = (VariableTarget)base.VisitVariableTarget(node);

                this.data.SetFactoryExpression(node, Evaluator.CreateDataTarget(Expression.Convert(this.data.ConvertToLinqExpression(new VariableSqlExpression(node.Variable)), typeof(IDataTarget))));

                return(node);
            }
Exemple #2
0
        protected internal override Node VisitVariableTarget(VariableTarget node)
        {
            node = this.ValidateChildren(node);

            var variableType = this.Scope.GetVariableType(node.Variable);

            if (variableType == null)
            {
                this.AddError(node, $"Undeclared variable '{node.Variable}'.");
            }
            else if (!variableType.Interfaces.Contains(typeof(IDataTarget)))
            {
                this.AddError(node, $"Variable {node.Variable} is not a data target.");
            }

            this.Data.SetType(node, variableType);
            this.Data.SetScope(node, NodeScope.Constant);

            return(node);
        }
        private void ProcessParameters(IEnumerable <ParameterAst> parameters)
        {
            foreach (var parameter in parameters)
            {
                var  variablePath        = parameter.Name.VariablePath;
                bool isSwitchOrMandatory = false;
                Type type = null;
                foreach (var paramAst in parameter.Attributes)
                {
                    if (paramAst is TypeConstraintAst)
                    {
                        if (type == null)
                        {
                            type = paramAst.TypeName.GetReflectionType();
                        }

                        if (String.Equals(paramAst.TypeName.FullName, "switch", StringComparison.OrdinalIgnoreCase))
                        {
                            isSwitchOrMandatory = true;
                        }
                    }
                    else if (paramAst is AttributeAst)
                    {
                        var args = (paramAst as AttributeAst).NamedArguments;
                        if (args != null)
                        {
                            foreach (NamedAttributeArgumentAst arg in args)
                            {
                                if (String.Equals(arg.ArgumentName, "mandatory", StringComparison.OrdinalIgnoreCase) &&
                                    String.Equals(arg.Argument.Extent.Text, "$true", StringComparison.OrdinalIgnoreCase))
                                {
                                    isSwitchOrMandatory = true;
                                }
                            }
                        }
                    }
                }

                var varName = AssignmentTarget.GetUnaliasedVariableName(variablePath);
                var details = _variables[varName];
                details.Type = type ?? details.Type ?? typeof(object);

                if (parameter.DefaultValue != null)
                {
                    var assignTarget = new AssignmentTarget(varName, type);

                    if (parameter.DefaultValue is ConstantExpressionAst)
                    {
                        assignTarget.Constant = (parameter.DefaultValue as ConstantExpressionAst).Value;
                        assignTarget.Type     = assignTarget.Constant == null ? typeof(object) : assignTarget.Constant.GetType();
                    }

                    Entry.AddAst(assignTarget);
                }
                else if (isSwitchOrMandatory)
                {
                    // Consider switch or mandatory parameter as already initialized
                    Entry.AddAst(new AssignmentTarget(varName, type));
                }
                else
                {
                    VariableTarget varTarget = new VariableTarget(parameter.Name);
                    varTarget.Type = details.Type;
                    Entry.AddAst(varTarget);
                }
            }
        }
Exemple #4
0
 /// <summary>
 /// Visits a <see cref="VariableTarget"/>.
 /// </summary>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <returns>
 /// The node, or a new version of the node.
 /// </returns>
 protected internal virtual Node VisitVariableTarget([NotNull] VariableTarget node)
 {
     return(node.VisitChildren(this));
 }
 /// <summary>
 /// Visits a <see cref="VariableTarget"/>.
 /// </summary>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <returns>
 /// The node, or a new version of the node.
 /// </returns>
 protected internal override Node VisitVariableTarget(VariableTarget node)
 {
     return(this.VisitImplementation(node) ?? base.VisitVariableTarget(node));
 }