void (Set<? extends BuildTargetType<?>> targetTypes, Set<BuildTarget<?>> targets, Set<? super BuildTargetType<?>> targetTypesToForceBuild, ProjectDescriptor descriptor) { //todo get rid of CompileContext parameter for BuildTargetIndex.getDependencies() and use it here TargetOutputIndex dummyIndex = new TargetOutputIndex() { @Override public Collection<BuildTarget<?>> getTargetsByOutputFile(@NotNull File file) { return Collections.emptyList(); } }; List<BuildTarget<?>> current = new ArrayList<>(targets); while (!current.isEmpty()) { List<BuildTarget<?>> next = new ArrayList<>(); for (BuildTarget<?> target : current) { for (BuildTarget<?> depTarget : target.computeDependencies(descriptor.getBuildTargetIndex(), dummyIndex)) { if (!targets.contains(depTarget) && !targetTypes.contains(depTarget.getTargetType())) { next.add(depTarget); if (targetTypesToForceBuild.contains(target.getTargetType())) { targetTypesToForceBuild.add(depTarget.getTargetType()); } } } } targets.addAll(next); current = next; } }