From 5983cfcb48f5827f01e97e2dff077153624ec7bf Mon Sep 17 00:00:00 2001 From: Pavel Fatin Date: Tue, 12 Dec 2017 13:07:09 +0100 Subject: [PATCH] ComparingLengthInspection: skip when n is 0, #SCL-8300, #SCL-13116 fixed --- .../ComparingLengthInspection.scala | 9 +++- .../codeInspection/collections/package.scala | 2 + .../collections/ComparingLengthTest.scala | 50 ++++++++++++++++++- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthInspection.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthInspection.scala index 1cbbb634a30..c1f5a659fb8 100644 --- a/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthInspection.scala +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthInspection.scala @@ -2,6 +2,7 @@ package org.jetbrains.plugins.scala.codeInspection.collections import org.jetbrains.plugins.scala.codeInspection.InspectionBundle import org.jetbrains.plugins.scala.codeInspection.collections.ComparingLengthInspection._ +import org.jetbrains.plugins.scala.lang.psi.api.base.ScIntLiteral import org.jetbrains.plugins.scala.lang.psi.api.expr.ScExpression /** @@ -22,10 +23,14 @@ private object ComparingLengthInspection { case q `.sizeOrLength` () `!=` n => (q, "!=", n) case q `.sizeOrLength` () `<` n => (q, "<", n) case q `.sizeOrLength` () `<=` n => (q, "<=", n) - } filter { case (q, op, n) => - isSeq(q) && !isIndexedSeq(q) + } filter { case (q, _, n) => + isNonIndexedSeq(q) && !intLiteralValue(n).contains(0) } map { case (q, op, n) => replace(e).withText(s"${invocationText(q, "lengthCompare", n)} $op 0").highlightFrom(q) } } + + private def intLiteralValue(e: ScExpression) = Some(e).collect { + case ScIntLiteral(n) => n + } } \ No newline at end of file diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/package.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/package.scala index 09112439726..42c7fe84053 100644 --- a/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/package.scala +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/codeInspection/collections/package.scala @@ -394,6 +394,8 @@ package object collections { def isIndexedSeq(expr: ScExpression): Boolean = isExpressionOfType("scala.collection.IndexedSeqLike", expr) + def isNonIndexedSeq(expr: ScExpression): Boolean = isSeq(expr) && !isIndexedSeq(expr) + def isMap(expr: ScExpression): Boolean = isExpressionOfType("scala.collection.GenMapLike", expr) def isSortedSet(expr: ScExpression): Boolean = isExpressionOfType("scala.collection.SortedSetLike", expr) diff --git a/scala/scala-impl/test/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthTest.scala b/scala/scala-impl/test/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthTest.scala index 10c8df725bb..c319c94cec1 100644 --- a/scala/scala-impl/test/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthTest.scala +++ b/scala/scala-impl/test/org/jetbrains/plugins/scala/codeInspection/collections/ComparingLengthTest.scala @@ -64,6 +64,33 @@ class ComparingLengthTest extends OperationsOnCollectionInspectionTest { ) } + def testLengthIndexedSeq(): Unit = { + checkTextHasNoErrors( + "Vector(1, 2, 3).length == 2" + ) + } + + def testLengthZero(): Unit = { + checkTextHasNoErrors( + "Seq(1, 2, 3).length == 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).length != 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).length > 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).length => 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).length < 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).length <= 0" + ) + } + def testSizeEqual(): Unit = { doTest( s"Seq(1, 2, 3).${START}size == 2$END", @@ -112,7 +139,28 @@ class ComparingLengthTest extends OperationsOnCollectionInspectionTest { ) } - def testIndexedSeq(): Unit = { + def testSizeZero(): Unit = { + checkTextHasNoErrors( + "Seq(1, 2, 3).size == 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).size != 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).size > 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).size => 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).size < 0" + ) + checkTextHasNoErrors( + "Seq(1, 2, 3).size <= 0" + ) + } + + def testSizeIndexedSeq(): Unit = { checkTextHasNoErrors( "Vector(1, 2, 3).size == 2" )