/// <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; } }