// Copyright 2015 Pants project contributors (see CONTRIBUTORS.md). // Licensed under the Apache License, Version 2.0 (see LICENSE). package com.twitter.intellij.pants.service.project.modifier; import com.intellij.openapi.diagnostic.Logger; import com.twitter.intellij.pants.service.PantsCompileOptionsExecutor; import com.twitter.intellij.pants.service.project.PantsProjectInfoModifierExtension; import com.twitter.intellij.pants.service.project.model.ProjectInfo; import com.twitter.intellij.pants.service.project.model.ContentRoot; import com.twitter.intellij.pants.service.project.model.TargetInfo; import com.twitter.intellij.pants.util.PantsUtil; import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; public class PantsSourceRootCompressor implements PantsProjectInfoModifierExtension { @Override public void modify(@NotNull ProjectInfo projectInfo, @NotNull PantsCompileOptionsExecutor executor, @NotNull Logger log) { for (TargetInfo info : projectInfo.getTargets().values()) { info.setRoots(compressRootsIfPossible(info.getRoots())); } } @NotNull private Set<ContentRoot> compressRootsIfPossible(@NotNull Set<ContentRoot> roots) { final Set<String> packageRoots = roots.stream().map(ContentRoot::getPackageRoot).collect(Collectors.toSet()); if (packageRoots.size() != 1) { return roots; } final String packageRoot = packageRoots.iterator().next(); final Set<File> sourceRoots = roots.stream().map(ContentRoot::getRawSourceRoot).map(File::new).collect(Collectors.toSet()); if (folderContainsOnlyRoots(new File(packageRoot), sourceRoots)) { return Collections.singleton(new ContentRoot(packageRoot, "")); } return roots; } private boolean folderContainsOnlyRoots(@NotNull File root, Set<File> foldersWithSources) { final File[] files = root.listFiles(); if (files == null) { return false; } for (File file : files) { if (file.isFile() && !PantsUtil.isBUILDFileName(file.getName()) && !foldersWithSources.contains(root)) { return false; } if (file.isDirectory() && !folderContainsOnlyRoots(file, foldersWithSources)) { return false; } } return true; } }