Gradle: do not re-create new module if it was unloaded (IDEA-174640)

This commit is contained in:
Vladislav.Soroka
2017-06-20 13:40:21 +03:00
parent 089ff65959
commit a3b8cd2e3b
5 changed files with 56 additions and 10 deletions
@@ -17,11 +17,13 @@ package com.intellij.openapi.externalSystem.service.project;
import com.intellij.openapi.externalSystem.model.project.*;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.UnloadedModuleDescription;
import com.intellij.openapi.roots.ModuleOrderEntry;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -47,6 +49,10 @@ public interface IdeModelsProvider {
@Nullable
Module findIdeModule(@NotNull String ideModuleName);
@ApiStatus.Experimental
@Nullable
UnloadedModuleDescription getUnloadedModuleDescription(@NotNull ModuleData moduleData);
@Nullable
Library findIdeLibrary(@NotNull LibraryData libraryData);
@@ -16,10 +16,7 @@
package com.intellij.openapi.externalSystem.service.project;
import com.intellij.openapi.externalSystem.model.project.*;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleGrouperKt;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.module.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.libraries.Library;
@@ -125,6 +122,20 @@ public class IdeModelsProviderImpl implements IdeModelsProvider {
return ModuleManager.getInstance(myProject).findModuleByName(ideModuleName);
}
@Nullable
@Override
public UnloadedModuleDescription getUnloadedModuleDescription(@NotNull ModuleData moduleData) {
for (String moduleName : suggestModuleNameCandidates(moduleData)) {
UnloadedModuleDescription unloadedModuleDescription = ModuleManager.getInstance(myProject).getUnloadedModuleDescription(moduleName);
// TODO external system module options should be honored to handle duplicated module names issues
if(unloadedModuleDescription != null) {
return unloadedModuleDescription;
}
}
return null;
}
@Nullable
@Override
public Library findIdeLibrary(@NotNull LibraryData libraryData) {
@@ -37,7 +37,10 @@ import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Denis Zhdanov
@@ -96,10 +99,16 @@ public abstract class AbstractDependencyDataService<E extends AbstractDependency
for (DataNode<E> node : toImport) {
final AbstractDependencyData data = node.getData();
Module ownerModule = modelsProvider.findIdeModule(data.getOwnerModule());
if (ownerModule == null && modelsProvider.getUnloadedModuleDescription(data.getOwnerModule()) != null) {
continue;
}
assert ownerModule != null;
String depName;
if(data instanceof ModuleDependencyData) {
Module targetModule = modelsProvider.findIdeModule(((ModuleDependencyData)data).getTarget());
if (targetModule == null && modelsProvider.getUnloadedModuleDescription(((ModuleDependencyData)data).getTarget()) != null) {
continue;
}
assert targetModule != null;
depName = targetModule.getName();
} else {
@@ -34,6 +34,7 @@ import com.intellij.openapi.externalSystem.util.ExternalSystemBundle;
import com.intellij.openapi.externalSystem.util.ExternalSystemUiUtil;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.UnloadedModuleDescription;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.ui.DialogWrapper;
@@ -152,7 +153,10 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
ModuleData moduleData = node.getData();
Module module = modelsProvider.findIdeModule(moduleData);
if (module == null) {
result.add(node);
UnloadedModuleDescription unloadedModuleDescription = modelsProvider.getUnloadedModuleDescription(moduleData);
if (unloadedModuleDescription == null) {
result.add(node);
}
}
else {
node.putUserData(MODULE_KEY, module);
@@ -27,10 +27,8 @@ import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsPr
import com.intellij.openapi.externalSystem.util.ExternalSystemConstants;
import com.intellij.openapi.externalSystem.util.Order;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.DependencyScope;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleOrderEntry;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl;
import com.intellij.openapi.util.Pair;
import com.intellij.util.containers.ContainerUtil;
@@ -38,8 +36,10 @@ import com.intellij.util.containers.ContainerUtilRt;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author Denis Zhdanov
@@ -142,4 +142,20 @@ public class ModuleDependencyDataService extends AbstractDependencyDataService<M
return orderEntryDataMap;
}
@Override
protected void removeData(@NotNull Collection<? extends ExportableOrderEntry> toRemove,
@NotNull Module module,
@NotNull IdeModifiableModelsProvider modelsProvider) {
// do not remove 'invalid' module dependencies on unloaded modules
List<? extends ExportableOrderEntry> filteredList = toRemove.stream().filter(o -> {
if (o instanceof ModuleOrderEntry) {
String moduleName = ((ModuleOrderEntry)o).getModuleName();
return ModuleManager.getInstance(module.getProject()).getUnloadedModuleDescription(moduleName) == null;
}
return true;
}).collect(Collectors.toList());
super.removeData(filteredList, module, modelsProvider);
}
}