do not write factory id for SimpleConfigurationType

factory uses RC `name`, but type uses `id`. It means that for SimpleConfigurationType deserialization maybe (depends on RC id value) broken. As solution, we don't write factory id for SimpleConfigurationType anymore — and this change IS backward compatible — previous IDEA version will correctly use first factory if factory id is not specified at all (`null` value). Also, in any case it doesn't make sense to write factory id for single-factory RC type

Only for SimpleConfigurationType, not for Configuration with the only factory, because it is not clear how it can affect (some RC conditionally build factory list)
This commit is contained in:
Vladimir Krivosheev
2018-09-04 11:23:38 +02:00
parent 1f3ac8da09
commit 6be604a7ca
3 changed files with 23 additions and 50 deletions
@@ -8,60 +8,24 @@ package com.intellij.execution.remote;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.configurations.ConfigurationType;
import com.intellij.execution.configurations.ConfigurationTypeUtil;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.configurations.SimpleConfigurationType;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.project.Project;
import com.intellij.util.LazyUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
public final class RemoteConfigurationType implements ConfigurationType {
private final ConfigurationFactory myFactory;
/**reflection*/
public final class RemoteConfigurationType extends SimpleConfigurationType {
public RemoteConfigurationType() {
myFactory = new ConfigurationFactory(this) {
@Override
@NotNull
public RunConfiguration createTemplateConfiguration(@NotNull Project project) {
return new RemoteConfiguration(project, this);
}
};
}
@NotNull
@Override
public String getDisplayName() {
return ExecutionBundle.message("remote.debug.configuration.display.name");
}
@Override
public String getConfigurationTypeDescription() {
return ExecutionBundle.message("remote.debug.configuration.description");
}
@Override
public Icon getIcon() {
return AllIcons.RunConfigurations.Remote;
}
@Override
public ConfigurationFactory[] getConfigurationFactories() {
return new ConfigurationFactory[]{myFactory};
}
@NotNull
public ConfigurationFactory getFactory() {
return myFactory;
super("Remote", ExecutionBundle.message("remote.debug.configuration.display.name"), ExecutionBundle.message("remote.debug.configuration.description"),
LazyUtil.create(() -> AllIcons.RunConfigurations.Remote));
}
@Override
@NotNull
public String getId() {
return "Remote";
public RunConfiguration createTemplateConfiguration(@NotNull Project project) {
return new RemoteConfiguration(project, this);
}
@NotNull
@@ -70,9 +34,14 @@ public final class RemoteConfigurationType implements ConfigurationType {
return "jvmRemote";
}
@NotNull
@Deprecated
public ConfigurationFactory getFactory() {
return this;
}
@NotNull
public static RemoteConfigurationType getInstance() {
return ConfigurationTypeUtil.findConfigurationType(RemoteConfigurationType.class);
}
}
@@ -9,7 +9,6 @@ import com.intellij.execution.ExecutionException;
import com.intellij.execution.ProgramRunnerUtil;
import com.intellij.execution.RunManager;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.impl.ConsoleViewImpl;
import com.intellij.execution.impl.EditorHyperlinkSupport;
@@ -192,9 +191,7 @@ class ForkedDebuggerThread extends Thread {
}
private static void attachVM(@NotNull Project project, String runConfigName, @NotNull String debugPort, ProgramRunner.Callback callback) {
RemoteConfigurationType remoteConfigurationType = RemoteConfigurationType.getInstance();
ConfigurationFactory factory = remoteConfigurationType.getFactory();
RunnerAndConfigurationSettings runSettings = RunManager.getInstance(project).createConfiguration(runConfigName, factory);
RunnerAndConfigurationSettings runSettings = RunManager.getInstance(project).createConfiguration(runConfigName, RemoteConfigurationType.class);
runSettings.setActivateToolWindowBeforeRun(false);
RemoteConfiguration configuration = (RemoteConfiguration)runSettings.getConfiguration();
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.text.StringUtil
import com.intellij.util.PathUtilRt
import com.intellij.util.SmartList
import com.intellij.util.getAttributeBooleanValue
import com.intellij.util.text.nullize
import gnu.trove.THashMap
import gnu.trove.THashSet
import org.jdom.Element
@@ -243,11 +244,17 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(val manager:
if (!isNewSerializationAllowed) {
element.setAttribute(TEMPLATE_FLAG_ATTRIBUTE, "false")
}
element.setAttribute(NAME_ATTR, configuration.name)
configuration.name.nullize()?.let {
element.setAttribute(NAME_ATTR, it)
}
}
val factory = factory
element.setAttribute(CONFIGURATION_TYPE_ATTRIBUTE, factory.type.id)
element.setAttribute(FACTORY_NAME_ATTRIBUTE, factory.id)
if (factory.type !is SimpleConfigurationType) {
element.setAttribute(FACTORY_NAME_ATTRIBUTE, factory.id)
}
if (folderName != null) {
element.setAttribute(FOLDER_NAME, folderName!!)
}