From 21dbcdb8b9f07b950ad8440cd217f7fc8a920366 Mon Sep 17 00:00:00 2001 From: Mikhail Mutcianko Date: Fri, 13 Dec 2019 18:43:04 +0300 Subject: [PATCH] prefer loading a plugin from property over classpath External plugin developers often use `plugin.path` property to load their plugin in tests, however to run actual tests with external build tools a classpath entry pointing to the compiled classes of the plugin is usually passed as well. For some plugins with a complex artifact, a valid structure is required to properly load, which is provided by the plugin dist passed with `plugin.path`. When plugin loader overrides it with the one from classpath, the plugin is loaded but from an incomplete artifact making it fail in cases such as starting JPS. GitOrigin-RevId: 64d6fc1760bcc88301c53062f894d60246bfc008 --- .../src/com/intellij/ide/plugins/PluginLoadingResult.java | 7 +++++++ .../src/com/intellij/ide/plugins/PluginManagerCore.java | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginLoadingResult.java b/platform/core-impl/src/com/intellij/ide/plugins/PluginLoadingResult.java index 0128c0a48dab..55d655d7a5f2 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginLoadingResult.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginLoadingResult.java @@ -8,6 +8,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.text.VersionComparatorUtil; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -166,6 +167,12 @@ final class PluginLoadingResult { } } + @Contract(pure = true) + boolean contains(@NotNull IdeaPluginDescriptorImpl descriptor) { + PluginId pluginId = descriptor.getPluginId(); + return (pluginId != null && plugins.containsKey(pluginId)); + } + private boolean isCompatible(@NotNull IdeaPluginDescriptorImpl descriptor) { return PluginManagerCore.isIncompatible(productBuildNumber, descriptor.getSinceBuild(), descriptor.getUntilBuild()) == null; } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java index e5668045e9c5..c0bf3621a81d 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java @@ -1163,7 +1163,8 @@ public final class PluginManagerCore { PluginLoadingResult result = context.parentContext.result; for (Future task : tasks) { IdeaPluginDescriptorImpl descriptor = task.get(); - if (descriptor != null) { + // plugins added via property shouldn't be overridden to avoid plugin root detection issues when running external plugin tests + if (descriptor != null && !result.contains(descriptor)) { descriptor.setUseCoreClassLoader(); result.add(descriptor, context.parentContext); }