diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java index 41f1661e2ed2..3d61aafb475b 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java @@ -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); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProviderImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProviderImpl.java index 0a98abe014e0..ba4463c1cea7 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProviderImpl.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProviderImpl.java @@ -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) { diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java index 97d869729a77..62dbd2e30511 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java @@ -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 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 { diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java index 61a8a95538b5..38efe067933b 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java @@ -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 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); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java index 6d55c11fcf70..37e6dd0d8472 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java @@ -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 toRemove, + @NotNull Module module, + @NotNull IdeModifiableModelsProvider modelsProvider) { + + // do not remove 'invalid' module dependencies on unloaded modules + List 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); + } }