void (CompositeElement root) { if (root.rawFirstChild() == null) { if (root.rawLastChild() != null) { throw new IncorrectTreeStructureException(root, "firstChild == null, but lastChild != null"); } } else { for (ASTNode child = root.getFirstChildNode(); child != null; child = child.getTreeNext()) { if (child instanceof CompositeElement) { checkSubtree((CompositeElement)child); } if (child.getTreeParent() != root) { throw new IncorrectTreeStructureException(child, "child has wrong parent value"); } if (child == root.getFirstChildNode()) { if (child.getTreePrev() != null) { throw new IncorrectTreeStructureException(root, "firstChild.prev != null"); } } else { if (child.getTreePrev() == null) { throw new IncorrectTreeStructureException(child, "not first child has prev == null"); } if (child.getTreePrev().getTreeNext() != child) { throw new IncorrectTreeStructureException(child, "element.prev.next != element"); } } if (child.getTreeNext() == null) { if (root.getLastChildNode() != child) { throw new IncorrectTreeStructureException(child, "not last child has next == null"); } } } } }