From 5608d82666ad4e8e738e540e1fc39c5ee3da4290 Mon Sep 17 00:00:00 2001 From: adripo <26493496+adripo@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:39:09 +0200 Subject: [PATCH] feat: getAllDependents & getAllDependencies --- .../ballerina/projects/DependencyGraph.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/DependencyGraph.java b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/DependencyGraph.java index 784ec17c2697..9bfe85bf9466 100644 --- a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/DependencyGraph.java +++ b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/DependencyGraph.java @@ -129,6 +129,22 @@ public T getRoot() { return rootNode; } + // Returns all direct and indirect dependents of the node T + public Collection getAllDependents(T node) { + Set allDependents = new HashSet<>(); + Set visited = new HashSet<>(); + getAllDependentsRecursive(node, allDependents, visited); + return allDependents; + } + + // Returns all direct and indirect dependencies of node T + public Collection getAllDependencies(T node) { + Set allDependencies = new HashSet<>(); + Set visited = new HashSet<>(); + getAllDependenciesRecursive(node, allDependencies, visited); + return allDependencies; + } + public boolean contains(T node) { return dependencies.containsKey(node); } @@ -192,6 +208,30 @@ private void sortTopologically(T vertex, List visited, List ancestors, Lis ancestors.remove(vertex); } + private void getAllDependentsRecursive(T node, Set allDependents, Set visited) { + visited.add(node); + Collection directDependents = getDirectDependents(node); + allDependents.addAll(directDependents); + + for (T dependent : directDependents) { + if (!visited.contains(dependent)) { + getAllDependentsRecursive(dependent, allDependents, visited); + } + } + } + + private void getAllDependenciesRecursive(T node, Set allDependencies, Set visited) { + visited.add(node); + Collection directDependencies = getDirectDependencies(node); + allDependencies.addAll(directDependencies); + + for (T dependency : directDependencies) { + if (!visited.contains(dependency)) { + getAllDependenciesRecursive(dependency, allDependencies, visited); + } + } + } + /** * Builds a {@code DependencyGraph}. *