package com.siberika.idea.pascal.jps.builder; import com.intellij.util.containers.ContainerUtil; import com.siberika.idea.pascal.jps.model.JpsPascalModuleType; 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; public class PascalTarget extends ModuleBasedTarget<PascalSourceRootDescriptor> { public PascalTarget(@NotNull JpsModule module, PascalTargetType targetType) { 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 (JpsPascalModuleType.INSTANCE.equals(module.getModuleType())) { dependencies.add(new PascalTarget(module, getPascalTargetType())); } } if (isTests()) { dependencies.add(new PascalTarget(myModule, PascalTargetType.PRODUCTION)); } return dependencies; } @NotNull @Override public List<PascalSourceRootDescriptor> computeRootDescriptors(JpsModel model, ModuleExcludeIndex index, IgnoredFileIndex ignoredFileIndex, BuildDataPaths dataPaths) { List<PascalSourceRootDescriptor> result = new ArrayList<PascalSourceRootDescriptor>(); JavaSourceRootType type = isTests() ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; for (JpsTypedModuleSourceRoot<JavaSourceRootProperties> root : myModule.getSourceRoots(type)) { result.add(new PascalSourceRootDescriptor(root.getFile(), this)); } return result; } @Nullable @Override public PascalSourceRootDescriptor findRootDescriptor(String rootId, BuildRootIndex rootIndex) { return ContainerUtil.getFirstItem(rootIndex.getRootDescriptors(new File(rootId), Collections.singletonList(getPascalTargetType()), null)); } @NotNull @Override public String getPresentableName() { return "Pascal '" + myModule.getName() + "' " + (isTests() ? "tests" : "production"); } @NotNull @Override public Collection<File> getOutputRoots(CompileContext context) { return ContainerUtil.createMaybeSingletonList(JpsJavaExtensionService.getInstance().getOutputDirectory(myModule, isTests())); } @Override public boolean isTests() { return getPascalTargetType().isTests(); } public PascalTargetType getPascalTargetType() { return (PascalTargetType) getTargetType(); } }