// 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); } }