diff --git a/platform/lang-api/src/com/intellij/execution/RunManager.java b/platform/lang-api/src/com/intellij/execution/RunManager.java index a73d29c58a69..88553c0ed6a9 100644 --- a/platform/lang-api/src/com/intellij/execution/RunManager.java +++ b/platform/lang-api/src/com/intellij/execution/RunManager.java @@ -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.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; @@ -36,6 +40,8 @@ import java.util.regex.Pattern; * @see ExecutionManager */ public abstract class RunManager { + public static final String UNNAMED = "Unnamed"; + public static RunManager getInstance(final Project project) { return project.getComponent(RunManager.class); } @@ -230,4 +236,37 @@ public abstract class RunManager { i++; } } + + public String suggestUniqueName(@Nullable String name, @Nullable ConfigurationType type) { + List settingsList = type != null ? getConfigurationSettingsList(type) : getAllSettings(); + List names = ContainerUtil.map(settingsList, new Function() { + @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 true 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 true 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()); + } } diff --git a/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java b/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java index a68dea0503bc..8546e2127044 100644 --- a/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java +++ b/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java @@ -29,7 +29,7 @@ import com.intellij.util.containers.ContainerUtil; 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, @@ -183,22 +183,11 @@ public abstract class RunConfigurationProducer { // replace with existing configuration if any final RunManager runManager = RunManager.getInstance(context.getProject()); final ConfigurationType type = fromContext.getConfigurationType(); - final List configurations = runManager.getConfigurationSettingsList(type); final RunnerAndConfigurationSettings settings = findExistingConfiguration(context); if (settings != null) { fromContext.setConfigurationSettings(settings); } else { - final ArrayList currentNames = new ArrayList(); - 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()); } } } diff --git a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java index 3b68a0706062..b8441ee942fb 100644 --- a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java +++ b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java @@ -32,7 +32,6 @@ import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; 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(); - final Location _location = PsiLocation.fromPsiElement(psiElement, location != null ? location.getModule() : null); + final Location _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(); - final List 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 { - final ArrayList currentNames = new ArrayList(); - for (RunnerAndConfigurationSettings configurationSettings : configurations) { - currentNames.add(configurationSettings.getName()); - } - result.myConfiguration.setName(RunManager.suggestUniqueName(result.myConfiguration.getName(), currentNames)); + runManager.setUniqueNameIfNeed(result.myConfiguration); } } }