// 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.resolver;
import com.intellij.openapi.externalSystem.model.DataNode;
import com.intellij.openapi.externalSystem.model.ProjectKeys;
import com.intellij.openapi.externalSystem.model.project.ModuleData;
import com.intellij.openapi.externalSystem.model.project.ModuleDependencyData;
import com.intellij.openapi.externalSystem.model.project.ProjectData;
import com.twitter.intellij.pants.service.PantsCompileOptionsExecutor;
import com.twitter.intellij.pants.service.project.model.graph.BuildGraph;
import com.twitter.intellij.pants.service.project.PantsResolverExtension;
import com.twitter.intellij.pants.service.project.model.ProjectInfo;
import com.twitter.intellij.pants.service.project.model.TargetInfo;
import com.twitter.intellij.pants.util.PantsUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class PantsModuleDependenciesExtension implements PantsResolverExtension {
@Override
public void resolve(
@NotNull ProjectInfo projectInfo,
@NotNull PantsCompileOptionsExecutor executor,
@NotNull DataNode<ProjectData> projectDataNode,
@NotNull Map<String, DataNode<ModuleData>> modules,
@NotNull Optional<BuildGraph> buildGraph
) {
for (Map.Entry<String, TargetInfo> entry : projectInfo.getSortedTargets()) {
final String mainTarget = entry.getKey();
final TargetInfo targetInfo = entry.getValue();
if (!modules.containsKey(mainTarget)) {
continue;
}
final DataNode<ModuleData> moduleDataNode = modules.get(mainTarget);
for (String target : targetInfo.getTargets()) {
if (!modules.containsKey(target)) {
continue;
}
addModuleDependency(moduleDataNode, modules.get(target), true);
}
}
}
private void addModuleDependency(DataNode<ModuleData> moduleDataNode, DataNode<ModuleData> submoduleDataNode, boolean exported) {
final List<ModuleDependencyData> subModuleDeps = PantsUtil.findChildren(submoduleDataNode, ProjectKeys.MODULE_DEPENDENCY);
for (ModuleDependencyData dep : subModuleDeps) {
if (dep.getTarget().equals(moduleDataNode.getData())) {
return;
}
}
final ModuleDependencyData moduleDependencyData = new ModuleDependencyData(
moduleDataNode.getData(),
submoduleDataNode.getData()
);
moduleDependencyData.setExported(exported);
moduleDataNode.createChild(ProjectKeys.MODULE_DEPENDENCY, moduleDependencyData);
}
}