From 6be604a7ca201224982df151482b3701ec15fb10 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 4 Sep 2018 10:56:30 +0200 Subject: [PATCH] do not write factory id for SimpleConfigurationType MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../remote/RemoteConfigurationType.java | 57 +++++-------------- .../execution/ForkedDebuggerThread.java | 5 +- .../RunnerAndConfigurationSettingsImpl.kt | 11 +++- 3 files changed, 23 insertions(+), 50 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurationType.java b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurationType.java index 1a807a9d84ed..53e1927689cf 100644 --- a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurationType.java +++ b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurationType.java @@ -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); } - } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java index c636d4ba460c..97c6c9185d11 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java @@ -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(); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt index 510f365a4b53..236968d55c6f 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt @@ -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!!) }