From 2c7348e1d2f8e3c1efc54cd1d31c29b02c7d8921 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 26 Feb 2019 22:52:18 +0300 Subject: [PATCH] goto action: simplify MatchedValue comparator --- .../ide/util/gotoByName/GotoActionTest.groovy | 1 - .../ide/actions/GotoActionAction.java | 2 +- .../ide/util/gotoByName/GotoActionModel.java | 68 ++++++++++--------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/ide/util/gotoByName/GotoActionTest.groovy b/java/java-tests/testSrc/com/intellij/ide/util/gotoByName/GotoActionTest.groovy index 28cb70792d67..805817e4040f 100644 --- a/java/java-tests/testSrc/com/intellij/ide/util/gotoByName/GotoActionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/ide/util/gotoByName/GotoActionTest.groovy @@ -84,7 +84,6 @@ class GotoActionTest extends LightCodeInsightFixtureTestCase { items += matchedOption(name, pattern) items += matchedOption(name, pattern) items += matchedBooleanOption(name, pattern) - items += new MatchedValue(name, pattern) } PlatformTestUtil.assertComparisonContractNotViolated(items, diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java index 3ed3f2a90235..4a333ad6064b 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java @@ -247,7 +247,7 @@ public class GotoActionAction extends GotoActionBase implements DumbAware { DumbAwareAction.create(e -> { Object o = popup.getChosenElement(); if (o instanceof GotoActionModel.MatchedValue && activeKeymap != null) { - Comparable value = ((GotoActionModel.MatchedValue)o).value; + Object value = ((GotoActionModel.MatchedValue)o).value; if (value instanceof GotoActionModel.ActionWrapper) { GotoActionModel.ActionWrapper aw = (GotoActionModel.ActionWrapper)value; if (aw.isAvailable()) { diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java index 530ffa718f3f..ed516352137f 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java @@ -168,10 +168,11 @@ public class GotoActionModel implements ChooseByNameModel, Comparator, D } public static class MatchedValue implements Comparable { - @NotNull public final Comparable value; + @NotNull public final Object value; @NotNull final String pattern; - public MatchedValue(@NotNull Comparable value, @NotNull String pattern) { + public MatchedValue(@NotNull Object value, @NotNull String pattern) { + assert value instanceof OptionDescription || value instanceof ActionWrapper; this.value = value; this.pattern = pattern; } @@ -180,8 +181,8 @@ public class GotoActionModel implements ChooseByNameModel, Comparator, D @VisibleForTesting public String getValueText() { if (value instanceof OptionDescription) return ((OptionDescription)value).getHit(); - if (!(value instanceof ActionWrapper)) return null; - return ((ActionWrapper)value).getAction().getTemplatePresentation().getText(); + if (value instanceof ActionWrapper) return ((ActionWrapper)value).getAction().getTemplatePresentation().getText(); + return null; } @Nullable @@ -212,42 +213,43 @@ public class GotoActionModel implements ChooseByNameModel, Comparator, D int diff = o.getMatchingDegree() - getMatchingDegree(); if (diff != 0) return diff; - boolean edt = ApplicationManager.getApplication().isDispatchThread(); + diff = getTypeWeight(o.value) - getTypeWeight(value); + if (diff != 0) return diff; if (value instanceof ActionWrapper && o.value instanceof ActionWrapper) { - if (edt || ((ActionWrapper)value).hasPresentation() && ((ActionWrapper)o.value).hasPresentation()) { - boolean p1Enable = ((ActionWrapper)value).isAvailable(); - boolean p2enable = ((ActionWrapper)o.value).isAvailable(); - if (p1Enable && !p2enable) return -1; - if (!p1Enable && p2enable) return 1; - } - //noinspection unchecked - int compared = value.compareTo(o.value); + ActionWrapper value1 = (ActionWrapper)value; + ActionWrapper value2 = (ActionWrapper)o.value; + int compared = value1.compareTo(value2); if (compared != 0) return compared; } - - if (value instanceof ActionWrapper && o.value instanceof BooleanOptionDescription) { - return edt && ((ActionWrapper)value).isAvailable() ? -1 : 1; - } - - if (o.value instanceof ActionWrapper && value instanceof BooleanOptionDescription) { - return edt && ((ActionWrapper)o.value).isAvailable() ? 1 : -1; - } - - if (value instanceof BooleanOptionDescription && !(o.value instanceof BooleanOptionDescription) && o.value instanceof OptionDescription) return -1; - if (o.value instanceof BooleanOptionDescription && !(value instanceof BooleanOptionDescription) && value instanceof OptionDescription) return 1; - - if (value instanceof OptionDescription && !(o.value instanceof OptionDescription)) return 1; - if (o.value instanceof OptionDescription && !(value instanceof OptionDescription)) return -1; diff = StringUtil.notNullize(getValueText()).length() - StringUtil.notNullize(o.getValueText()).length(); if (diff != 0) return diff; - - //noinspection unchecked - diff = value.compareTo(o.value); - if (diff != 0) return diff; - - return o.hashCode() - hashCode(); + + if (value instanceof OptionDescription && o.value instanceof OptionDescription) { + OptionDescription value1 = (OptionDescription)value; + OptionDescription value2 = (OptionDescription)o.value; + diff = value1.compareTo(value2); + if (diff != 0) return diff; + } + + return o.hashCode() - hashCode(); + } + + private static int getTypeWeight(@NotNull Object value) { + if (value instanceof ActionWrapper) { + ActionWrapper actionWrapper = (ActionWrapper)value; + if ((ApplicationManager.getApplication().isDispatchThread() || actionWrapper.hasPresentation()) && + actionWrapper.isAvailable()) { + return 0; + } + return 2; + } + if (value instanceof OptionDescription) { + if (value instanceof BooleanOptionDescription) return 1; + return 3; + } + throw new IllegalArgumentException(value.getClass() + " - " + value.toString()); } @Override