IDEA-150835: Provide an API which tells which production module corresponding to...
[idea/community.git] / platform / external-system-impl / src / com / intellij / openapi / externalSystem / service / project / manage / AbstractModuleDataService.java
index f36e260dbb1dacd701c81e4cd78162b9c5a113cb..60c9d7d4e7b626c6b74de7d43f08f1ecfa008ec9 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.openapi.externalSystem.service.project.manage;
 
+import com.intellij.compiler.CompilerConfiguration;
 import com.intellij.ide.util.projectWizard.ModuleBuilder;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
@@ -40,6 +41,7 @@ import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.pom.java.LanguageLevel;
 import com.intellij.ui.CheckBoxList;
 import com.intellij.ui.IdeBorderFactory;
 import com.intellij.ui.components.JBScrollPane;
@@ -83,15 +85,33 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
     if (!toCreate.isEmpty()) {
       createModules(toCreate, modelsProvider, project);
     }
+
     for (DataNode<E> node : toImport) {
       Module module = node.getUserData(MODULE_KEY);
       if (module != null) {
         setModuleOptions(module, node);
+        ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module);
+        syncPaths(module, modifiableRootModel, node.getData());
+        setLanguageLevel(modifiableRootModel, node.getData());
+      }
+    }
 
+    final boolean isOneToOneMapping = projectData != null && ExternalSystemApiUtil.isOneToOneMapping(project, projectData);
+    for (DataNode<E> node : toImport) {
+      Module module = node.getUserData(MODULE_KEY);
+      if (module != null) {
+        final String[] groupPath;
+        if (isOneToOneMapping || projectData == null) {
+          groupPath = node.getData().getIdeModuleGroup();
+        }
+        else {
+          final String externalProjectGroup = projectData.getInternalName() + " modules";
+          groupPath = node.getData().getIdeModuleGroup() == null
+                      ? new String[]{externalProjectGroup}
+                      : ArrayUtil.prepend(externalProjectGroup, node.getData().getIdeModuleGroup());
+        }
         final ModifiableModuleModel modifiableModel = modelsProvider.getModifiableModuleModel();
-        modifiableModel.setModuleGroupPath(module, node.getData().getIdeModuleGroup());
-
-        syncPaths(module, modelsProvider, node.getData());
+        modifiableModel.setModuleGroupPath(module, groupPath);
       }
     }
   }
@@ -103,8 +123,12 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
       ModuleData data = module.getData();
       final Module created = modelsProvider.newModule(data.getModuleFilePath(), data.getModuleTypeId());
       module.putUserData(MODULE_KEY, created);
+      String productionModuleId = data.getProductionModuleId();
+      if (productionModuleId != null) {
+        modelsProvider.setTestModuleProperties(created, productionModuleId);
+      }
       Set<String> orphanFiles = project.getUserData(ORPHAN_MODULE_FILES);
-      if(orphanFiles != null) {
+      if (orphanFiles != null) {
         orphanFiles.remove(created.getModuleFilePath());
       }
 
@@ -161,8 +185,7 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
     return result;
   }
 
-  private static void syncPaths(@NotNull Module module, @NotNull IdeModifiableModelsProvider modelsProvider, @NotNull ModuleData data) {
-    ModifiableRootModel modifiableModel = modelsProvider.getModifiableRootModel(module);
+  private static void syncPaths(@NotNull Module module, @NotNull ModifiableRootModel modifiableModel, @NotNull ModuleData data) {
     CompilerModuleExtension extension = modifiableModel.getModuleExtension(CompilerModuleExtension.class);
     if (extension == null) {
       //modifiableModel.dispose();
@@ -331,17 +354,19 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
                           @NotNull IdeModifiableModelsProvider modelsProvider) {
     for (DataNode<E> moduleDataNode : toImport) {
       final Module module = moduleDataNode.getUserData(MODULE_KEY);
+      if (module == null) continue;
       final Map<OrderEntry, OrderAware> orderAwareMap = moduleDataNode.getUserData(ORDERED_DATA_MAP_KEY);
-      if (module != null && orderAwareMap != null) {
+      if (orderAwareMap != null) {
         rearrangeOrderEntries(orderAwareMap, modelsProvider.getModifiableRootModel(module));
       }
+      setBytecodeTargetLevel(project, module, moduleDataNode.getData());
     }
   }
 
   @Override
   public void onSuccessImport(@NotNull Project project) {
     final Set<String> orphanFiles = project.getUserData(ORPHAN_MODULE_FILES);
-    if(orphanFiles != null && !orphanFiles.isEmpty()) {
+    if (orphanFiles != null && !orphanFiles.isEmpty()) {
       ExternalSystemApiUtil.executeOnEdt(false, new Runnable() {
         @Override
         public void run() {
@@ -417,4 +442,24 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
     }
     return idx == -1 ? -1 : idx;
   }
+
+  private void setLanguageLevel(@NotNull ModifiableRootModel modifiableRootModel, E data) {
+    LanguageLevel level = LanguageLevel.parse(data.getSourceCompatibility());
+    if (level != null) {
+      try {
+        modifiableRootModel.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(level);
+      }
+      catch (IllegalArgumentException e) {
+        LOG.debug(e);
+      }
+    }
+  }
+
+  private void setBytecodeTargetLevel(@NotNull Project project, @NotNull Module module, @NotNull E data) {
+    String targetLevel = data.getTargetCompatibility();
+    if (targetLevel != null) {
+      CompilerConfiguration configuration = CompilerConfiguration.getInstance(project);
+      configuration.setBytecodeTargetLevel(module, targetLevel);
+    }
+  }
 }