package com.haskforce.jps; /* * Based on the ErlangTarget at https://github.com/ignatov/intellij-erlang on * 7 May 2014. */ import com.haskforce.jps.model.JpsHaskellModuleType; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.builders.BuildRootIndex; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.builders.BuildTargetRegistry; import org.jetbrains.jps.builders.ModuleBasedTarget; import org.jetbrains.jps.builders.TargetOutputIndex; 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.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; /** * Various helper functions relating to targets. */ public class HaskellTarget extends ModuleBasedTarget<HaskellSourceRootDescriptor> { public HaskellTarget(@NotNull JpsModule module, HaskellTargetType targetType) { super(targetType, module); } @Override public String getId() { return myModule.getName(); } @Override public Collection<BuildTarget<?>> computeDependencies(BuildTargetRegistry buildTargetRegistry, TargetOutputIndex targetOutputIndex) { 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(JpsHaskellModuleType.INSTANCE)) { dependencies.add(new HaskellTarget(module, getHaskellTargetType())); } } if (isTests()) { dependencies.add(new HaskellTarget(myModule, HaskellTargetType.PRODUCTION)); } return dependencies; } @NotNull @Override public List<HaskellSourceRootDescriptor> computeRootDescriptors(JpsModel jpsModel, ModuleExcludeIndex moduleExcludeIndex, IgnoredFileIndex ignoredFileIndex, BuildDataPaths buildDataPaths) { List<HaskellSourceRootDescriptor> result = new ArrayList<HaskellSourceRootDescriptor>(); JavaSourceRootType type = isTests() ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; for (JpsTypedModuleSourceRoot<JavaSourceRootProperties> root : myModule.getSourceRoots(type)) { result.add(new HaskellSourceRootDescriptor(root.getFile(), this)); } return result; } @Nullable @Override public HaskellSourceRootDescriptor findRootDescriptor(String s, BuildRootIndex buildRootIndex) { return ContainerUtil.getFirstItem(buildRootIndex.getRootDescriptors(new File(s), Collections.singletonList(getHaskellTargetType()), null)); } @NotNull @Override public String getPresentableName() { return getId(); // TODO: Update to a proper name. } @NotNull @Override public Collection<File> getOutputRoots(CompileContext compileContext) { return ContainerUtil.createMaybeSingletonList(JpsJavaExtensionService.getInstance().getOutputDirectory(myModule, isTests())); } public HaskellTargetType getHaskellTargetType() { return (HaskellTargetType) getTargetType(); } @Override public boolean isTests() { return getHaskellTargetType().isTests(); } }