From 22fca3dbd5dd8d1a7b557c78426527a6f73cba29 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sun, 17 Feb 2013 18:26:06 +0100 Subject: [PATCH] check whether target scope contains module-based targets only --- .../jetbrains/jps/cmdline/BuildSession.java | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index 630fd1969ccd..8e244ccad98a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -24,16 +24,15 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.concurrency.SequentialTaskExecutor; import com.intellij.util.io.DataOutputStream; +import gnu.trove.THashMap; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.Channels; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.api.*; -import org.jetbrains.jps.builders.BuildRootDescriptor; -import org.jetbrains.jps.builders.BuildTargetIndex; -import org.jetbrains.jps.builders.BuildTargetRegistry; -import org.jetbrains.jps.builders.ModuleBasedTarget; +import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.builders.java.dependencyView.Callbacks; +import org.jetbrains.jps.incremental.BuilderService; import org.jetbrains.jps.incremental.MessageHandler; import org.jetbrains.jps.incremental.Utils; import org.jetbrains.jps.incremental.fs.BuildFSState; @@ -41,9 +40,12 @@ import org.jetbrains.jps.incremental.fs.FSState; import org.jetbrains.jps.incremental.messages.*; import org.jetbrains.jps.incremental.storage.Timestamps; import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.service.JpsServiceManager; import org.jetbrains.jps.service.SharedThreadPool; import java.io.*; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -229,15 +231,52 @@ final class BuildSession implements Runnable, CanceledStatus { } private static boolean scopeContainsModulesOnly(List scopes) { + Map> allTypes = null; for (TargetTypeBuildScope scope : scopes) { - String typeId = scope.getTypeId(); - if (!typeId.equals(JavaModuleBuildTargetType.PRODUCTION.getTypeId()) && !typeId.equals(JavaModuleBuildTargetType.TEST.getTypeId())) { + final String typeId = scope.getTypeId(); + if (isJavaModuleBuildType(typeId)) { // fast check + continue; + } + if (allTypes == null) { + // lazy init + allTypes = new THashMap>(); + for (BuilderService builderService : JpsServiceManager.getInstance().getExtensions(BuilderService.class)) { + for (BuildTargetType targetType : builderService.getTargetTypes()) { + allTypes.put(targetType.getTypeId(), targetType); + } + } + } + final BuildTargetType targetType = allTypes.get(typeId); + if (targetType != null && !isModuleBasedTargetType(targetType)) { return false; } } return true; } + private static boolean isJavaModuleBuildType(String typeId) { + for (JavaModuleBuildTargetType moduleBuildTargetType : JavaModuleBuildTargetType.ALL_TYPES) { + if (moduleBuildTargetType.getTypeId().equals(typeId)) { + return true; + } + } + return false; + } + + private static boolean isModuleBasedTargetType(final BuildTargetType targetType) { + Class aClass = targetType.getClass(); + while (!BuildTargetType.class.equals(aClass.getSuperclass())) { + aClass = aClass.getSuperclass(); + } + final ParameterizedType generic = (ParameterizedType)aClass.getGenericSuperclass(); + for (Type type : generic.getActualTypeArguments()) { + if (type instanceof Class && ModuleBasedTarget.class.isAssignableFrom((Class)type)) { + return true; + } + } + return false; + } + private void saveData(final BuildFSState fsState, File dataStorageRoot) { final boolean wasInterrupted = Thread.interrupted(); try {