code: private static void tc(Map<M, Set<M>> index) {
          final Map<String, Object[]> warnings = new HashMap<>();
  
          for (Entry<M, Set<M>> entry: index.entrySet()) {
              final M src = entry.getKey();
              final Set<M> dependents = entry.getValue();
              final Queue<M> queue = new LinkedList<M>(dependents);
  
              while (!queue.isEmpty()) {
                  final M key = queue.poll();
                  if (!index.containsKey(key)) {
                      continue;
                  }
  
                  for (M addition: index.get(key)) {
                      if (!dependents.contains(addition)) {
                          dependents.add(addition);
                          queue.add(addition);
                          warnings.put(src + "|" + addition + "|" + key, new Object[] {src, addition, key});
                      }
                  }
              }
          }
  
          for (final Object[] args: warnings.values()) {
              StructuredLog.ImpliedTransitiveDependency.warn(log, args);
          }
      }
docs: Compute the transitive closure of the dependencies
  
  @param index