diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/comparatorCombinators/afterNotEqReturn.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/comparatorCombinators/afterNotEqReturn.java new file mode 100644 index 000000000000..56da2e8b2c78 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/comparatorCombinators/afterNotEqReturn.java @@ -0,0 +1,16 @@ +// "Replace with Comparator chain" "true" + +import java.util.*; + +public class NodeDescriptor { + + public int getWeight() { + return 0; + } + + public int getIndex() { + return 0; + } + + public static final Comparator NODE_DESCRIPTOR_COMPARATOR = Comparator.comparingInt(NodeDescriptor::getWeight).thenComparingInt(NodeDescriptor::getIndex); +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/comparatorCombinators/beforeNotEqReturn.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/comparatorCombinators/beforeNotEqReturn.java new file mode 100644 index 000000000000..b1bf36135055 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/comparatorCombinators/beforeNotEqReturn.java @@ -0,0 +1,22 @@ +// "Replace with Comparator chain" "true" + +import java.util.*; + +public class NodeDescriptor { + + public int getWeight() { + return 0; + } + + public int getIndex() { + return 0; + } + + public static final Comparator NODE_DESCRIPTOR_COMPARATOR = (descriptor1, descriptor2) -> { + int compare = Integer.compare(descriptor1.getWeight(), descriptor2.getWeight()); + if (compare != 0) { + return compare; + } + return Integer.compare(descriptor1.getIndex(), descriptor2.getIndex()); + }; +} diff --git a/plugins/InspectionGadgets/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java b/plugins/InspectionGadgets/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java index e12fe8eae00a..29be514f5ab2 100644 --- a/plugins/InspectionGadgets/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java +++ b/plugins/InspectionGadgets/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java @@ -91,10 +91,14 @@ public class ComparatorCombinatorsInspection extends AbstractBaseJavaLocalInspec while (index < statements.length - 1) { PsiStatement current = statements[index]; if (isNotZeroCheck(current, lastResult)) { - if (index + 1 >= statements.length) return null; - PsiStatement next = statements[index + 1]; + int nextIndex = index + 1; + if (nextIndex >= statements.length) return null; + PsiStatement next = statements[nextIndex]; ComparisonBlock block = ComparisonBlock.extractBlock(next, first, second, lastResult); - if (block == null) return null; + if (block == null) { + if (nextIndex == statements.length - 1) break; + return null; + } blocks.add(block); index += 2; continue; @@ -118,6 +122,9 @@ public class ComparatorCombinatorsInspection extends AbstractBaseJavaLocalInspec return blocks; } ComparisonBlock lastBlock = extractTernaryComparison(first, second, lastResult, returnExpr); + if (lastBlock == null) { + lastBlock = ComparisonBlock.extractBlock(returnExpr, first, second, lastResult); + } if (lastBlock == null) return null; blocks.add(lastBlock); return blocks;