From a81cf72dac59b7ee6abe7587630caaee0bdeb956 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 11 May 2020 13:19:50 +0200 Subject: [PATCH] Add possibility to explicitly mark plugin as requiring restart on load/unload GitOrigin-RevId: 0cd92fdd5e3ff329c71403eb9a30a64dcb736cc2 --- .../com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java | 6 ++++++ .../core-impl/src/com/intellij/ide/plugins/XmlReader.java | 4 ++++ .../com/intellij/openapi/extensions/PluginDescriptor.java | 5 +++++ .../src/com/intellij/ide/plugins/DynamicPlugins.kt | 4 ++++ 4 files changed, 19 insertions(+) diff --git a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java index 7b28bedc5771..5ba3259827f0 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java @@ -77,6 +77,7 @@ public final class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor { private boolean myUseCoreClassLoader; boolean myAllowBundledUpdate; boolean myImplementationDetail; + boolean myRequireRestart; private String mySinceBuild; private String myUntilBuild; @@ -909,6 +910,11 @@ public final class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor { return myImplementationDetail; } + @Override + public boolean isRequireRestart() { + return myRequireRestart; + } + public @NotNull List getModules() { return myModules == null ? Collections.emptyList() : myModules; } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/XmlReader.java b/platform/core-impl/src/com/intellij/ide/plugins/XmlReader.java index d144895867ea..8a1f9cfee230 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/XmlReader.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/XmlReader.java @@ -170,6 +170,10 @@ final class XmlReader { descriptor.myImplementationDetail = Boolean.parseBoolean(attribute.getValue()); break; + case "require-restart": + descriptor.myRequireRestart = Boolean.parseBoolean(attribute.getValue()); + break; + case "version": String internalVersionString = StringUtil.nullize(attribute.getValue()); if (internalVersionString != null) { diff --git a/platform/extensions/src/com/intellij/openapi/extensions/PluginDescriptor.java b/platform/extensions/src/com/intellij/openapi/extensions/PluginDescriptor.java index 7a50178c49e9..6c679a7e1990 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/PluginDescriptor.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/PluginDescriptor.java @@ -101,6 +101,11 @@ public interface PluginDescriptor { return false; } + /** + * If true, this plugin requires restart even if it otherwise fulfills the requirements of dynamic plugins. + */ + default boolean isRequireRestart() { return false; } + boolean isEnabled(); void setEnabled(boolean enabled); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt index 2b68b1bad948..da8284b9854f 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt @@ -120,6 +120,10 @@ object DynamicPlugins { return null } + if (descriptor.isRequireRestart) { + return "Plugin ${descriptor.pluginId} is explicitly marked as requiring restart"; + } + val loadedPluginDescriptor = if (descriptor.pluginId == null) null else PluginManagerCore.getPlugin(descriptor.pluginId) as? IdeaPluginDescriptorImpl val app = ApplicationManager.getApplication()