package com.intellij.flex.build; import com.intellij.flex.FlexCommonUtils; import com.intellij.flex.model.bc.JpsFlexBuildConfiguration; import com.intellij.flex.model.bc.JpsFlexBuildConfigurationManager; import com.intellij.flex.model.bc.JpsFlexCompilerOptions; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.PathUtilRt; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.ProjectPaths; import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.cmdline.ProjectDescriptor; 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.JavaSourceRootType; import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration; import org.jetbrains.jps.model.module.JpsModuleSourceRoot; import org.jetbrains.jps.model.module.JpsTypedModule; import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; import java.io.PrintWriter; import java.util.*; public class FlexResourceBuildTarget extends ModuleBasedTarget<BuildRootDescriptor> { FlexResourceBuildTarget(final FlexResourceBuildTargetType type, @NotNull JpsTypedModule<JpsFlexBuildConfigurationManager> module) { super(type, module); } @Override public String getId() { return getModule().getName(); } @NotNull public JpsTypedModule<JpsFlexBuildConfigurationManager> getModule() { //noinspection unchecked return (JpsTypedModule<JpsFlexBuildConfigurationManager>)super.getModule(); } @Override public Collection<BuildTarget<?>> computeDependencies(BuildTargetRegistry targetRegistry, TargetOutputIndex outputIndex) { return Collections.emptyList(); } @NotNull @Override public List<BuildRootDescriptor> computeRootDescriptors(final JpsModel model, final ModuleExcludeIndex index, final IgnoredFileIndex ignoredFileIndex, final BuildDataPaths dataPaths) { final List<BuildRootDescriptor> result = new ArrayList<>(); final JavaSourceRootType rootType = getTargetType() == FlexResourceBuildTargetType.PRODUCTION ? JavaSourceRootType.SOURCE : JavaSourceRootType.TEST_SOURCE; for (JpsModuleSourceRoot sourceRoot : getModule().getSourceRoots(rootType)) { final File root = JpsPathUtil.urlToFile(sourceRoot.getUrl()); result.add(new FlexSourceRootDescriptor(this, root)); } return result; } public boolean isTests() { return ((FlexResourceBuildTargetType)getTargetType()).isTests(); } @Nullable @Override public BuildRootDescriptor findRootDescriptor(final String rootId, final BuildRootIndex rootIndex) { for (BuildRootDescriptor descriptor : rootIndex.getTargetRoots(this, null)) { if (descriptor.getRootId().equals(rootId)) { return descriptor; } } return null; } @NotNull @Override public String getPresentableName() { return getTargetType().getTypeId() + ":" + getModule().getName(); } @NotNull @Override public Collection<File> getOutputRoots(CompileContext context) { if (getTargetType() == FlexResourceBuildTargetType.TEST) { final File outputDir = ProjectPaths.getModuleOutputDir(getModule(), true); return outputDir == null ? Collections.emptyList() : Collections.singletonList(outputDir); } final Set<File> result = new THashSet<>(FileUtil.FILE_HASHING_STRATEGY); for (JpsFlexBuildConfiguration bc : getModule().getProperties().getBuildConfigurations()) { if (FlexCommonUtils.canHaveResourceFiles(bc.getNature())) { result.add(new File(PathUtilRt.getParentPath(bc.getActualOutputFilePath()))); } } return result; } @Override public void writeConfiguration(ProjectDescriptor pd, final PrintWriter out) { out.println("Module: " + getModule().getName()); for (JpsFlexBuildConfiguration bc : getModule().getProperties().getBuildConfigurations()) { if (!bc.isSkipCompile() && FlexCommonUtils.canHaveResourceFiles(bc.getNature()) && bc.getCompilerOptions().getResourceFilesMode() != JpsFlexCompilerOptions.ResourceFilesMode.None) { out.print("BC: " + bc.getName()); out.print(", output folder: " + PathUtilRt.getParentPath(bc.getActualOutputFilePath())); out.print(", mode: " + bc.getCompilerOptions().getResourceFilesMode()); if (bc.getCompilerOptions().getResourceFilesMode() == JpsFlexCompilerOptions.ResourceFilesMode.ResourcePatterns) { final JpsJavaCompilerConfiguration c = JpsJavaExtensionService.getInstance().getCompilerConfiguration(getModule().getProject()); if (c != null) { out.print(", patterns: " + StringUtil.join(c.getResourcePatterns(), " ")); } } out.println(); } } } }