refactor "suggestUniqueName"
authorVassiliy.Kudryashov <Vassiliy.Kudryashov@jetbrains.com>
Fri, 13 May 2016 12:49:27 +0000 (15:49 +0300)
committerVassiliy.Kudryashov <Vassiliy.Kudryashov@jetbrains.com>
Fri, 13 May 2016 12:57:01 +0000 (15:57 +0300)
platform/lang-api/src/com/intellij/execution/RunManager.java
platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java
platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java

index a73d29c58a698f787191629b45c8a56e7e58658b..88553c0ed6a96df749e147ca624d82b491da4e29 100644 (file)
@@ -20,6 +20,10 @@ import com.intellij.execution.configurations.ConfigurationType;
 import com.intellij.execution.configurations.RunConfiguration;
 import com.intellij.execution.configurations.RunProfile;
 import com.intellij.openapi.project.Project;
 import com.intellij.execution.configurations.RunConfiguration;
 import com.intellij.execution.configurations.RunProfile;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.util.Function;
+import com.intellij.util.containers.ContainerUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -36,6 +40,8 @@ import java.util.regex.Pattern;
  * @see ExecutionManager
  */
 public abstract class RunManager {
  * @see ExecutionManager
  */
 public abstract class RunManager {
+  public static final String UNNAMED = "Unnamed";
+
   public static RunManager getInstance(final Project project) {
     return project.getComponent(RunManager.class);
   }
   public static RunManager getInstance(final Project project) {
     return project.getComponent(RunManager.class);
   }
@@ -230,4 +236,37 @@ public abstract class RunManager {
       i++;
     }
   }
       i++;
     }
   }
+
+  public String suggestUniqueName(@Nullable String name, @Nullable ConfigurationType type) {
+    List<RunnerAndConfigurationSettings> settingsList = type != null ? getConfigurationSettingsList(type) : getAllSettings();
+    List<String> names = ContainerUtil.map(settingsList, new Function<RunnerAndConfigurationSettings, String>() {
+      @Override
+      public String fun(RunnerAndConfigurationSettings settings) {
+        return settings.getName();
+      }
+    });
+    return suggestUniqueName(StringUtil.notNullize(name, UNNAMED), names);
+  }
+
+  /**
+   * Sets unique name if existing one is not 'unique'
+   * If settings type is not null (for example settings may be provided by plugin that is unavailable after IDE restart, so type would be suddenly null)
+   * name will be chosen unique for certain type otherwise name will be unique among all configurations
+   * @return <code>true</code> if name was changed
+   */
+  public boolean setUniqueNameIfNeed(@NotNull RunnerAndConfigurationSettings settings) {
+    String oldName = settings.getName();
+    settings.setName(suggestUniqueName(StringUtil.notNullize(oldName, UNNAMED), settings.getType()));
+    return !Comparing.equal(oldName, settings.getName());
+  }
+
+  /**
+   * Sets unique name if existing one is not 'unique' for corresponding configuration type
+   * @return <code>true</code> if name was changed
+   */
+  public boolean setUniqueNameIfNeed(@NotNull RunConfiguration configuration) {
+    String oldName = configuration.getName();
+    configuration.setName(suggestUniqueName(StringUtil.notNullize(oldName, UNNAMED), configuration.getType()));
+    return !Comparing.equal(oldName, configuration.getName());
+  }
 }
 }
index a68dea0503bc25a3d6f49106c77c62b466d91f24..8546e2127044a8ec00ade74ef6b62e4ab3646f73 100644 (file)
@@ -29,7 +29,7 @@ import com.intellij.util.containers.ContainerUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.*;
+import java.util.List;
 
 /**
  * Supports creating run configurations from context (by right-clicking a code element in the source editor or the project view). Typically,
 
 /**
  * Supports creating run configurations from context (by right-clicking a code element in the source editor or the project view). Typically,
@@ -183,22 +183,11 @@ public abstract class RunConfigurationProducer<T extends RunConfiguration> {
         // replace with existing configuration if any
         final RunManager runManager = RunManager.getInstance(context.getProject());
         final ConfigurationType type = fromContext.getConfigurationType();
         // replace with existing configuration if any
         final RunManager runManager = RunManager.getInstance(context.getProject());
         final ConfigurationType type = fromContext.getConfigurationType();
-        final List<RunnerAndConfigurationSettings> configurations = runManager.getConfigurationSettingsList(type);
         final RunnerAndConfigurationSettings settings = findExistingConfiguration(context);
         if (settings != null) {
           fromContext.setConfigurationSettings(settings);
         } else {
         final RunnerAndConfigurationSettings settings = findExistingConfiguration(context);
         if (settings != null) {
           fromContext.setConfigurationSettings(settings);
         } else {
-          final ArrayList<String> currentNames = new ArrayList<String>();
-          for (RunnerAndConfigurationSettings configurationSettings : configurations) {
-            currentNames.add(configurationSettings.getName());
-          }
-          RunConfiguration configuration = fromContext.getConfiguration();
-          String name = configuration.getName();
-          if (name == null) {
-            LOG.error(configuration);
-            name = "Unnamed";
-          }
-          configuration.setName(RunManager.suggestUniqueName(name, currentNames));
+          runManager.setUniqueNameIfNeed(fromContext.getConfiguration());
         }
       }
     }
         }
       }
     }
index 3b68a0706062469fe8d003385fd7802ce9fd8bd4..b8441ee942fbb61ce6a50ef9fefa76949aeb56f7 100644 (file)
@@ -32,7 +32,6 @@ import org.jdom.Element;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 
 import java.util.Comparator;
 import java.util.List;
 
@@ -62,21 +61,19 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea
 
     if (result.myConfiguration != null) {
       final PsiElement psiElement = result.getSourceElement();
 
     if (result.myConfiguration != null) {
       final PsiElement psiElement = result.getSourceElement();
-      final Location<PsiElement> _location = PsiLocation.fromPsiElement(psiElement, location != null ? location.getModule() : null);
+      final Location<PsiElement> _location = PsiLocation.fromPsiElement(psiElement, location.getModule());
       if (_location != null) {
         // replace with existing configuration if any
         final RunManager runManager = RunManager.getInstance(context.getProject());
         final ConfigurationType type = result.myConfiguration.getType();
       if (_location != null) {
         // replace with existing configuration if any
         final RunManager runManager = RunManager.getInstance(context.getProject());
         final ConfigurationType type = result.myConfiguration.getType();
-        final List<RunnerAndConfigurationSettings> configurations = runManager.getConfigurationSettingsList(type);
-        final RunnerAndConfigurationSettings configuration = result.findExistingByElement(_location, configurations, context);
+        RunnerAndConfigurationSettings configuration = null;
+        if (type != null) {
+          configuration = result.findExistingByElement(_location, runManager.getConfigurationSettingsList(type), context);
+        }
         if (configuration != null) {
           result.myConfiguration = configuration;
         } else {
         if (configuration != null) {
           result.myConfiguration = configuration;
         } else {
-          final ArrayList<String> currentNames = new ArrayList<String>();
-          for (RunnerAndConfigurationSettings configurationSettings : configurations) {
-            currentNames.add(configurationSettings.getName());
-          }
-          result.myConfiguration.setName(RunManager.suggestUniqueName(result.myConfiguration.getName(), currentNames));
+          runManager.setUniqueNameIfNeed(result.myConfiguration);
         }
       }
     }
         }
       }
     }