public virtual void AddLocals(IEnumerable<ParameterDeclaration> declarations, AstNode statement)
        {
            declarations.ToList().ForEach(item =>
            {
                var name = this.Emitter.GetEntityName(item);
                var vName = this.AddLocal(item.Name, item.Type);

                if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref)
                {
                    this.Emitter.LocalsMap[item.Name] = name + ".v";
                }
                else
                {
                    this.Emitter.LocalsMap[item.Name] = name;
                }
            });

            var visitor = new ReferenceArgumentVisitor();
            statement.AcceptVisitor(visitor);

            foreach (var expr in visitor.DirectionExpression)
            {
                var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter);

                if (rr is LocalResolveResult && expr is IdentifierExpression)
                {
                    var ie = (IdentifierExpression)expr;
                    this.Emitter.LocalsMap[ie.Identifier] = ie.Identifier + ".v";
                }
                else
                {
                    throw new EmitterException(expr, "Only local variables can be passed by reference");
                }
            }
        }
        public virtual void AddLocals(IEnumerable <ParameterDeclaration> declarations, AstNode statement)
        {
            declarations.ToList().ForEach(item =>
            {
                var vName = this.AddLocal(item.Name, item.Type);

                if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref)
                {
                    this.Emitter.LocalsMap[item.Name] = vName + ".v";
                }
                else
                {
                    this.Emitter.LocalsMap[item.Name] = vName;
                }
            });

            var visitor = new ReferenceArgumentVisitor();

            statement.AcceptVisitor(visitor);

            foreach (var expr in visitor.DirectionExpression)
            {
                var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter);

                if (rr is LocalResolveResult && expr is IdentifierExpression)
                {
                    var ie = (IdentifierExpression)expr;
                    this.Emitter.LocalsMap[ie.Identifier] = ie.Identifier + ".v";
                }
                else
                {
                    throw new Exception("Only local variables can be passed by reference");
                }
            }
        }
        public virtual void AddLocals(IEnumerable <ParameterDeclaration> declarations, AstNode statement)
        {
            var visitor = new ReferenceArgumentVisitor(this.Emitter);

            statement.AcceptVisitor(visitor);

            declarations.ToList().ForEach(item =>
            {
                var rr    = item.Parent != null ? (LocalResolveResult)this.Emitter.Resolver.ResolveNode(item, this.Emitter) : null;
                var name  = this.Emitter.GetParameterName(item);
                var vName = this.AddLocal(item.Name, item, item.Type, name);

                if (item.Parent == null && item.Name == "value" && visitor.DirectionExpression.Any(expr => expr is IdentifierExpression && ((IdentifierExpression)expr).Identifier == "value"))
                {
                    return;
                }

                if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref)
                {
                    this.Emitter.LocalsMap[rr != null ? rr.Variable : new DefaultVariable(ReflectionHelper.FindType(this.Emitter.Resolver.Compilation, TypeCode.Object), name)] = vName + ".v";
                }
                else
                {
                    this.Emitter.LocalsMap[rr != null ? rr.Variable : new DefaultVariable(ReflectionHelper.FindType(this.Emitter.Resolver.Compilation, TypeCode.Object), name)] = vName;
                }
            });

            foreach (var expr in visitor.DirectionExpression)
            {
                var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter);

                IdentifierExpression identifierExpression;
                var lrr = rr as LocalResolveResult;
                if (lrr != null && ((identifierExpression = expr as IdentifierExpression) != null))
                {
                    var name = identifierExpression.Identifier;
                    if (Helpers.IsReservedWord(this.Emitter, name))
                    {
                        name = Helpers.ChangeReservedWord(name);
                    }
                    this.Emitter.LocalsMap[lrr.Variable] = name + ".v";
                }
            }

            foreach (var variable in visitor.DirectionVariables)
            {
                var name = variable.Name;

                if (Helpers.IsReservedWord(this.Emitter, name))
                {
                    name = Helpers.ChangeReservedWord(name);
                }
                this.Emitter.LocalsMap[variable] = name + ".v";
            }
        }
        public virtual void AddLocals(IEnumerable <ParameterDeclaration> declarations, AstNode statement)
        {
            declarations.ToList().ForEach(item =>
            {
                var name  = this.Emitter.GetEntityName(item);
                var vName = this.AddLocal(item.Name, item.Type, name);

                if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref)
                {
                    this.Emitter.LocalsMap[item.Name] = vName + ".v";
                }
                else
                {
                    this.Emitter.LocalsMap[item.Name] = vName;
                }
            });

            var visitor = new ReferenceArgumentVisitor();

            statement.AcceptVisitor(visitor);

            foreach (var expr in visitor.DirectionExpression)
            {
                var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter);

                IdentifierExpression identifierExpression;

                if (rr is LocalResolveResult && ((identifierExpression = expr as IdentifierExpression) != null))
                {
                    var name = identifierExpression.Identifier;
                    if (Helpers.IsReservedWord(name))
                    {
                        name = Helpers.ChangeReservedWord(name);
                    }
                    this.Emitter.LocalsMap[identifierExpression.Identifier] = name + ".v";
                }
                else
                {
                    throw new EmitterException(expr, "Only local variables can be passed by reference");
                }
            }
        }