From e89ffc1cc2b7d3c28358b6d1363aced99ae2756c Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Thu, 27 Mar 2025 21:36:55 +0100 Subject: [PATCH] IJPL-171936 IllegalStateException occurs and Settings doesn't open on selecting 'Configure Gutter Icons' options in Remote Development mode GitOrigin-RevId: fea22ff451fc5cad10a4d5c2668478852dfdca36 --- .../com/intellij/openapi/options/Configurable.java | 5 +++++ .../com/intellij/ide/actions/ShowSettingsUtilImpl.kt | 5 +++-- .../openapi/options/ex/ConfigurableWrapper.java | 11 +++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/platform/ide-core/src/com/intellij/openapi/options/Configurable.java b/platform/ide-core/src/com/intellij/openapi/options/Configurable.java index 43b17c53a36c..e6df6c260c8b 100644 --- a/platform/ide-core/src/com/intellij/openapi/options/Configurable.java +++ b/platform/ide-core/src/com/intellij/openapi/options/Configurable.java @@ -256,6 +256,11 @@ public interface Configurable extends UnnamedConfigurable { } + @ApiStatus.Internal + interface ClassCastChecker { + boolean tryToCast(@NotNull Class type); + } + interface TopComponentController { TopComponentController EMPTY = new TopComponentController() { @Override diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.kt b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.kt index 7956ca1fdc7b..40c136c7fb74 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.kt +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.kt @@ -145,9 +145,10 @@ open class ShowSettingsUtilImpl : ShowSettingsUtil() { additionalConfiguration: Consumer?, ) { assert(Configurable::class.java.isAssignableFrom(configurableClass)) { "Not a configurable: " + configurableClass.name } - showSettingsDialog(project, { it: Configurable? -> ConfigurableWrapper.cast(configurableClass, it) != null }) { it: Configurable -> + showSettingsDialog(project, { it: Configurable? -> ConfigurableWrapper.tryToCast(configurableClass, it) }) { it: Configurable -> if (additionalConfiguration != null) { - val toConfigure = ConfigurableWrapper.cast(configurableClass, it) ?: error("Wrong configurable found: " + it.javaClass) + val toConfigure = ConfigurableWrapper.cast(configurableClass, it) + ?: error("Wrong configurable found: " + it.javaClass + " but expected: " + configurableClass) additionalConfiguration.accept(toConfigure) } } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java index a1f8bc82483c..3e0a7b7da16a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java @@ -91,6 +91,17 @@ public class ConfigurableWrapper implements SearchableConfigurable, Weighted, Hi } } + @ApiStatus.Internal + public static boolean tryToCast(@NotNull Class type, @Nullable UnnamedConfigurable configurable) { + if (cast(type, configurable) != null) { + return true; + } + if (configurable instanceof ClassCastChecker checker) { + return checker.tryToCast(type); + } + return false; + } + public static @Nullable T cast(@NotNull Class type, @Nullable UnnamedConfigurable configurable) { if (configurable instanceof ConfigurableWrapper wrapper) { if (wrapper.myConfigurable == null) {