예제 #1
0
        /// <summary>
        /// Implements the visitor pattern to modify the discriminator when a master alias is
        /// used.
        /// </summary>
        private void MasterVisitor(DynamicNode host, DynamicNode node)
        {
            if (node is DynamicNode.GetMember)
            {
                if (node.Host is DynamicNode.Argument)
                {
                    node.ChangeHost(host);
                }
                else
                {
                    MasterVisitor(host, node.Host);
                }
                return;
            }
            if (node is DynamicNode.SetMember)
            {
                var temp = (DynamicNode.SetMember)node;

                if (temp.Value is DynamicNode)
                {
                    MasterVisitor(host, (DynamicNode)temp.Value);
                }

                if (node.Host is DynamicNode.Argument)
                {
                    node.ChangeHost(host);
                }
                else
                {
                    MasterVisitor(host, node.Host);
                }
                return;
            }
            if (node is DynamicNode.GetIndexed)
            {
                var temp = (DynamicNode.GetIndexed)node;

                if (temp.Indexes != null)
                {
                    foreach (var obj in temp.Indexes)
                    {
                        if (obj is DynamicNode)
                        {
                            MasterVisitor(host, (DynamicNode)obj);
                        }
                    }
                }

                if (node.Host is DynamicNode.Argument)
                {
                    node.ChangeHost(host);
                }
                else
                {
                    MasterVisitor(host, node.Host);
                }
                return;
            }
            if (node is DynamicNode.SetIndexed)
            {
                var temp = (DynamicNode.SetIndexed)node;

                if (temp.Value is DynamicNode)
                {
                    MasterVisitor(host, (DynamicNode)temp.Value);
                }

                if (temp.Indexes != null)
                {
                    foreach (var obj in temp.Indexes)
                    {
                        if (obj is DynamicNode)
                        {
                            MasterVisitor(host, (DynamicNode)obj);
                        }
                    }
                }

                if (node.Host is DynamicNode.Argument)
                {
                    node.ChangeHost(host);
                }
                else
                {
                    MasterVisitor(host, node.Host);
                }
                return;
            }
            if (node is DynamicNode.Method)
            {
                var temp = (DynamicNode.Method)node;

                if (temp.Arguments != null)
                {
                    foreach (var obj in temp.Arguments)
                    {
                        if (obj is DynamicNode)
                        {
                            MasterVisitor(host, (DynamicNode)obj);
                        }
                    }
                }

                if (node.Host is DynamicNode.Argument)
                {
                    node.ChangeHost(host);
                }
                else
                {
                    MasterVisitor(host, node.Host);
                }
                return;
            }
            if (node is DynamicNode.Invoke)
            {
                var temp = (DynamicNode.Invoke)node;

                if (temp.Arguments != null)
                {
                    foreach (var obj in temp.Arguments)
                    {
                        if (obj is DynamicNode)
                        {
                            MasterVisitor(host, (DynamicNode)obj);
                        }
                    }
                }

                if (node.Host is DynamicNode.Argument)
                {
                    node.ChangeHost(host);
                }
                else
                {
                    MasterVisitor(host, node.Host);
                }
                return;
            }
            if (node is DynamicNode.Binary)
            {
                var temp = (DynamicNode.Binary)node;

                MasterVisitor(host, temp.Left);
                if (temp.Right is DynamicNode)
                {
                    MasterVisitor(host, (DynamicNode)temp.Right);
                }

                return;
            }
            if (node is DynamicNode.Unary)
            {
                var temp = (DynamicNode.Unary)node;

                MasterVisitor(host, temp.Target);
                return;
            }
            if (node is DynamicNode.Convert)
            {
                var temp = (DynamicNode.Convert)node;

                MasterVisitor(host, temp.Target);
                return;
            }
        }