package com.intellij.flex.build;
import com.intellij.flex.FlexCommonUtils;
import com.intellij.flex.model.bc.BuildConfigurationNature;
import com.intellij.flex.model.bc.JpsFlexBuildConfiguration;
import com.intellij.flex.model.bc.JpsFlexBuildConfigurationManager;
import com.intellij.flex.model.module.JpsFlexModuleType;
import com.intellij.flex.model.run.JpsFlashRunConfigurationType;
import com.intellij.flex.model.run.JpsFlashRunnerParameters;
import com.intellij.flex.model.run.JpsFlexUnitRunConfigurationType;
import com.intellij.flex.model.run.JpsFlexUnitRunnerParameters;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Trinity;
import com.intellij.util.containers.ContainerUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.builders.BuildTargetLoader;
import org.jetbrains.jps.builders.BuildTargetType;
import org.jetbrains.jps.model.JpsModel;
import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.module.JpsTypedModule;
import org.jetbrains.jps.model.runConfiguration.JpsTypedRunConfiguration;
import java.util.ArrayList;
import java.util.List;
public class FlexBuildTargetType extends BuildTargetType<FlexBuildTarget> {
public static final FlexBuildTargetType INSTANCE = new FlexBuildTargetType();
private FlexBuildTargetType() {
super("flex");
}
@NotNull
public List<FlexBuildTarget> computeAllTargets(@NotNull final JpsModel model) {
final List<FlexBuildTarget> result = new ArrayList<>();
final JpsProject project = model.getProject();
for (JpsTypedRunConfiguration<JpsFlashRunnerParameters> runConfig : project.getRunConfigurations(JpsFlashRunConfigurationType
.INSTANCE)) {
ContainerUtilRt.addIfNotNull(result, FlexBuildTarget.create(project, runConfig.getType(), runConfig.getName()));
}
for (JpsTypedRunConfiguration<JpsFlexUnitRunnerParameters> runConfig : project.getRunConfigurations(JpsFlexUnitRunConfigurationType
.INSTANCE)) {
ContainerUtilRt.addIfNotNull(result, FlexBuildTarget.create(project, runConfig.getType(), runConfig.getName()));
}
for (JpsTypedModule<JpsFlexBuildConfigurationManager> module : project.getModules(JpsFlexModuleType.INSTANCE)) {
for (JpsFlexBuildConfiguration bc : module.getProperties().getBuildConfigurations()) {
result.add(FlexBuildTarget.create(bc, null));
final BuildConfigurationNature nature = bc.getNature();
if (nature.isApp() && (nature.isDesktopPlatform() || nature.isMobilePlatform())) {
result.add(FlexBuildTarget.create(bc, Boolean.TRUE));
result.add(FlexBuildTarget.create(bc, Boolean.FALSE));
}
}
}
return result;
}
@NotNull
public BuildTargetLoader<FlexBuildTarget> createLoader(@NotNull final JpsModel model) {
return new FlexBuildTargetLoader(model);
}
private static class FlexBuildTargetLoader extends BuildTargetLoader<FlexBuildTarget> {
private final JpsModel myModel;
public FlexBuildTargetLoader(final JpsModel model) {
myModel = model;
}
@Nullable
public FlexBuildTarget createTarget(@NotNull final String buildTargetId) {
final JpsProject project = myModel.getProject();
final Pair<String, String> runConfigTypeIdAndName = FlexCommonUtils.getRunConfigTypeIdAndNameByBuildTargetId(buildTargetId);
if (runConfigTypeIdAndName != null) {
final String runConfigTypeId = runConfigTypeIdAndName.first;
final String runConfigName = runConfigTypeIdAndName.second;
if (JpsFlashRunConfigurationType.ID.equals(runConfigTypeId)) {
return FlexBuildTarget.create(project, JpsFlashRunConfigurationType.INSTANCE, runConfigName);
}
else if (JpsFlexUnitRunConfigurationType.ID.equals(runConfigTypeId)) {
return FlexBuildTarget.create(project, JpsFlexUnitRunConfigurationType.INSTANCE, runConfigName);
}
}
else {
final Trinity<String, String, Boolean> moduleAndBCNameAndForcedDebugStatus =
FlexCommonUtils.getModuleAndBCNameAndForcedDebugStatusByBuildTargetId(buildTargetId);
if (moduleAndBCNameAndForcedDebugStatus != null) {
final String moduleName = moduleAndBCNameAndForcedDebugStatus.first;
final String bcName = moduleAndBCNameAndForcedDebugStatus.second;
final Boolean forcedDebugStatus = moduleAndBCNameAndForcedDebugStatus.third;
for (JpsTypedModule<JpsFlexBuildConfigurationManager> module : project.getModules(JpsFlexModuleType.INSTANCE)) {
if (module.getName().equals(moduleName)) {
final JpsFlexBuildConfiguration bc = module.getProperties().findConfigurationByName(bcName);
return bc != null ? FlexBuildTarget.create(bc, forcedDebugStatus) : null;
}
}
}
}
return null;
}
}
}