package org.elixir_lang.jps.builder; import com.intellij.util.containers.ContainerUtil; import org.elixir_lang.jps.model.JpsElixirModuleType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.indices.IgnoredFileIndex; import org.jetbrains.jps.indices.ModuleExcludeIndex; import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.java.JavaSourceRootProperties; import org.jetbrains.jps.model.java.JavaSourceRootType; import org.jetbrains.jps.model.java.JpsJavaClasspathKind; import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsTypedModuleSourceRoot; import java.io.File; import java.util.*; /** * Created by zyuyou on 15/7/10. */ public class ElixirTarget extends ModuleBasedTarget<ElixirSourceRootDescriptor> { public ElixirTarget(ElixirTargetType targetType, @NotNull JpsModule module) { super(targetType, module); } @Override public String getId() { return myModule.getName(); } @Override public Collection<BuildTarget<?>> computeDependencies(BuildTargetRegistry targetRegistry, TargetOutputIndex outputIndex) { return computeDependencies(); } public Collection<BuildTarget<?>> computeDependencies(){ List<BuildTarget<?>> dependencies = new ArrayList<BuildTarget<?>>(); Set<JpsModule> modules = JpsJavaExtensionService.dependencies(myModule).includedIn(JpsJavaClasspathKind.compile(isTests())).getModules(); for (JpsModule module : modules){ if(module.getModuleType().equals(JpsElixirModuleType.INSTANCE)){ dependencies.add(new ElixirTarget(getElixirTargetType(), module)); } } if(isTests()){ dependencies.add(new ElixirTarget(ElixirTargetType.PRODUCTION, myModule)); } return dependencies; } @NotNull @Override public List<ElixirSourceRootDescriptor> computeRootDescriptors(JpsModel model, ModuleExcludeIndex index, IgnoredFileIndex ignoredFileIndex, BuildDataPaths dataPaths) { List<ElixirSourceRootDescriptor> result = new ArrayList<ElixirSourceRootDescriptor>(); JavaSourceRootType type = isTests() ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; for(JpsTypedModuleSourceRoot<JavaSourceRootProperties> root : myModule.getSourceRoots(type)){ result.add(new ElixirSourceRootDescriptor(root.getFile(), this)); } return result; } @Nullable @Override public ElixirSourceRootDescriptor findRootDescriptor(String rootId, BuildRootIndex rootIndex) { return ContainerUtil.getFirstItem(rootIndex.getRootDescriptors(new File(rootId), Collections.singletonList(getElixirTargetType()), null)); } @NotNull @Override public String getPresentableName() { return "Elixir '" + myModule.getName() + "' " + (isTests() ? "test" : "production"); } @NotNull @Override public Collection<File> getOutputRoots(CompileContext context) { return ContainerUtil.createMaybeSingletonList(JpsJavaExtensionService.getInstance().getOutputDirectory(myModule, isTests())); } @Override public boolean isTests() { return getElixirTargetType().isTests(); } public ElixirTargetType getElixirTargetType(){ return (ElixirTargetType)getTargetType(); } }