check whether target scope contains module-based targets only

This commit is contained in:
Eugene Zhuravlev
2013-02-17 18:27:09 +01:00
parent 2c730550c2
commit 22fca3dbd5
@@ -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<TargetTypeBuildScope> scopes) {
Map<String, BuildTargetType<?>> 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<String, BuildTargetType<?>>();
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 {