1. A computer-implemented method comprising: receiving a request to compute a set of software dependencies inbound to or outbound from a node or any descendant of the node in a hierarchy of software elements in a software project, wherein the hierarchy of software elements is a tree-structured directed graph having nodes and directed links, and wherein each node in the hierarchy of software elements represents a software element in the software project and each directed link in the hierarchy of software elements connects a corresponding pair of nodes and represents containment of a child software element represented by a first node of the corresponding pair of nodes by a parent software element represented by a second node of the corresponding pair of nodes; determining that the node in the hierarchy of software elements does not have a corresponding element in a disjoint-or tree, wherein one or more elements of the disjoint-or tree each cache a previously computed portion of a union of software dependencies over a corresponding node and any descendant of the corresponding node in the hierarchy of software elements, wherein each element of the disjoint-or tree that corresponds to a node in the hierarchy of software elements has a parent element that corresponds to a parent node of the corresponding node in the hierarchy of software elements, unless the corresponding node in the hierarchy of software elements is a root of the hierarchy of software elements in which case the element is a root of the disjoint-or-tree, and wherein each set of software dependencies associated with an element of the disjoint-or tree is a union of one or more sets of software dependencies associated with the element and any descendant of the element in the disjoint-or tree; determining that the node in the hierarchy of software elements is important enough to cache in the disjoint-or tree; in response to determining that the node in the hierarchy of software elements is important enough to cache in the disjoint-or tree, generating a new element in the disjoint-or tree corresponding to the node in the hierarchy of software elements; computing a set of software dependencies for the new element in the disjoint-or tree as a union of one or more sets of software dependencies associated with the node in the hierarchy of software elements and any descendants of the node in the hierarchy of software elements; associating the computed set of software dependencies with the new element in the disjoint-or tree corresponding to the node in the hierarchy of software elements; receiving a subsequent request to compute the set of software dependencies inbound to or outbound from the node in the hierarchy of software elements and any descendant of the node in the hierarchy of software elements; determining that the node in the hierarchy of software elements has the corresponding element in the disjoint-or tree; and providing the computed set of software dependencies for the new element in the disjoint-or tree associated with the corresponding element in the disjoint-or tree.