diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java index b975789e5064..74d74e25ceba 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java @@ -76,6 +76,8 @@ public abstract class AbstractExternalSystemLocalSettings { private final AtomicReference myExternalProjectsViewState = new AtomicReference<>( new ExternalProjectsViewState() ); + private final AtomicReference> myProjectSyncType = + new AtomicReference<>(ContainerUtilRt.newHashMap()); @NotNull private final ProjectSystemId myExternalSystemId; @NotNull private final Project myProject; @@ -129,6 +131,15 @@ public abstract class AbstractExternalSystemLocalSettings { } } + for (Iterator> it = myProjectSyncType.get().entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); + if (linkedProjectPathsToForget.contains(entry.getKey()) + || linkedProjectPathsToForget.contains(ExternalSystemApiUtil.getRootProjectPath(entry.getKey(), myExternalSystemId, myProject))) + { + it.remove(); + } + } + Map modificationStamps = myExternalConfigModificationStamps.get(); for (String path : linkedProjectPathsToForget) { modificationStamps.remove(path); @@ -200,6 +211,16 @@ public abstract class AbstractExternalSystemLocalSettings { myExternalProjectsViewState.set(externalProjectsViewState); } + @NotNull + public Map getProjectSyncType() { + return myProjectSyncType.get(); + } + + @SuppressWarnings("UnusedDeclaration") + public void setProjectSyncType(@NotNull Map projectSyncType) { + // Required for IJ serialization. + myProjectSyncType.set(projectSyncType); + } public void fillState(@NotNull State state) { if (PRESERVE_EXPAND_STATE) { state.tasksExpandState = myExpandStates.get(); @@ -213,6 +234,7 @@ public abstract class AbstractExternalSystemLocalSettings { state.modificationStamps = myExternalConfigModificationStamps.get(); state.projectBuildClasspath = myProjectBuildClasspath.get(); state.externalProjectsViewState = myExternalProjectsViewState.get(); + state.projectSyncType = myProjectSyncType.get(); } public void loadState(@NotNull State state) { @@ -221,6 +243,7 @@ public abstract class AbstractExternalSystemLocalSettings { setIfNotNull(myAvailableTasks, state.availableTasks); setIfNotNull(myExternalConfigModificationStamps, state.modificationStamps); setIfNotNull(myProjectBuildClasspath, state.projectBuildClasspath); + setIfNotNull(myProjectSyncType, state.projectSyncType); myExternalProjectsViewState.set(state.externalProjectsViewState); if (state.recentTasks != null) { List recentTasks = myRecentTasks.get(); @@ -281,5 +304,10 @@ public abstract class AbstractExternalSystemLocalSettings { = ContainerUtilRt.newHashMap(); public Map projectBuildClasspath = ContainerUtilRt.newHashMap(); public ExternalProjectsViewState externalProjectsViewState; + public Map projectSyncType = ContainerUtilRt.newHashMap(); + } + + public enum SyncType { + PREVIEW, IMPORT, RE_IMPORT } } 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 2e5dcff001a8..a7c6b25990cf 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 @@ -31,6 +31,8 @@ import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.project.*; import com.intellij.openapi.externalSystem.service.project.IdeModelsProvider; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; +import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings; +import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings.SyncType; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemBundle; import com.intellij.openapi.module.*; @@ -248,10 +250,12 @@ public abstract class AbstractModuleDataService extends Ab return; } + AbstractExternalSystemLocalSettings localSettings = ExternalSystemApiUtil.getLocalSettings(project, projectData.getOwner()); + SyncType syncType = localSettings.getProjectSyncType().get(projectData.getLinkedExternalProjectPath()); for (Module module : modules) { if (module.isDisposed()) continue; String path = module.getModuleFilePath(); - if (!ApplicationManager.getApplication().isHeadlessEnvironment()) { + if (!ApplicationManager.getApplication().isHeadlessEnvironment() && syncType == SyncType.RE_IMPORT) { try { // we need to save module configuration before dispose, to get the up-to-date content of the unlinked module iml ServiceKt.getStateStore(module).save(new ArrayList<>()); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java index 3b87c4dfe407..9d03b0f1f65d 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java @@ -72,6 +72,7 @@ import com.intellij.openapi.externalSystem.service.project.manage.ContentRootDat import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl; import com.intellij.openapi.externalSystem.service.project.manage.ExternalSystemTaskActivator; import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManagerImpl; +import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.externalSystem.task.TaskCallback; @@ -115,6 +116,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings.SyncType.*; import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.doWriteAction; import static com.intellij.util.containers.ContainerUtil.*; @@ -390,6 +392,13 @@ public class ExternalSystemUtil { else { projectName = projectFile.getName(); } + + AbstractExternalSystemLocalSettings localSettings = ExternalSystemApiUtil.getLocalSettings(project, externalSystemId); + AbstractExternalSystemLocalSettings.SyncType syncType = + isPreviewMode ? PREVIEW : + localSettings.getProjectSyncType().get(externalProjectPath) == PREVIEW ? IMPORT : RE_IMPORT; + localSettings.getProjectSyncType().put(externalProjectPath, syncType); + final ExternalSystemResolveProjectTask myTask = new ExternalSystemResolveProjectTask(externalSystemId, project, externalProjectPath, vmOptions, arguments, isPreviewMode);