System.Xml.Xsl.Qil.QilValidationVisitor.VisitChildren C# (CSharp) Method

VisitChildren() protected method

protected VisitChildren ( QilNode parent ) : QilNode
parent QilNode
return QilNode
        protected override QilNode VisitChildren(QilNode parent) {
            if (this.parents.Contains(parent)) {
                // We have already visited the node that starts the infinite loop, but don't visit its children
                SetError(parent, "Infinite loop");
            }
            else if (AddNode(parent)) {
                if (parent.XmlType == null) {
                    SetError(parent, "Type information missing");
                }
                else {
                    XmlQueryType type = this.typeCheck.Check(parent);

                    if (!type.IsSubtypeOf(parent.XmlType))
                        SetError(parent, "Type information was not correctly inferred");
                }

                this.parents.Add(parent, parent);

                for (int i = 0; i < parent.Count; i++) {
                    if (parent[i] == null) {
                        // Allow parameter name and default value to be null
                        if (parent.NodeType == QilNodeType.Parameter)
                            continue;
                        // Do not allow null anywhere else in the graph
                        else
                            SetError(parent, "Child " + i + " must not be null");
                    }

                    if (parent.NodeType == QilNodeType.GlobalVariableList ||
                        parent.NodeType == QilNodeType.GlobalParameterList ||
                        parent.NodeType == QilNodeType.FunctionList) {
                        if (((QilReference) parent[i]).DebugName == null)
                            SetError(parent[i], "DebugName must not be null");
                    }

                    // If child is a reference, then call VisitReference instead of Visit in order to avoid circular visits.
                    if (IsReference(parent, i))
                        VisitReference(parent[i]);
                    else
                        Visit(parent[i]);
                }

                this.parents.Remove(parent);
            }

            return parent;
        }