[kssr] IJ-CR-24168 Fix local class false positive in JUnitUnconstructableTestCase inspection

GitOrigin-RevId: 65a2b5b8a4f8f5c3cb9648e79383ae70d30cc156
This commit is contained in:
Bart van Helvert
2022-05-06 15:34:09 +02:00
committed by intellij-monorepo-bot
parent 44d6296f2b
commit aa734cf40c
4 changed files with 34 additions and 8 deletions

View File

@@ -25,4 +25,12 @@ fun UAnnotated.findAnnotations(fqNames: Collection<String>) = uAnnotations.filte
*/
fun UFile.allClasses() = classes.toTypedArray() + classes.flatMap { it.allInnerClasses().toList() }
fun UClass.allInnerClasses(): Array<UClass> = innerClasses + innerClasses.flatMap { it.allInnerClasses().toList() }
fun UClass.allInnerClasses(): Array<UClass> = innerClasses + innerClasses.flatMap { it.allInnerClasses().toList() }
fun UClass.isAnonymousOrLocal(): Boolean = this is UAnonymousClass || isLocal()
fun UClass.isLocal(): Boolean {
val parent = uastParent
if (parent is UDeclarationsExpression && parent.uastParent is UBlockExpression) return true
return if (parent is UClass) parent.isLocal() else false
}

View File

@@ -2,15 +2,11 @@
package com.intellij.codeInspection.test.junit
import com.intellij.analysis.JvmAnalysisBundle
import com.intellij.codeInspection.AbstractBaseUastLocalInspectionTool
import com.intellij.codeInspection.InspectionManager
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.*
import com.intellij.lang.jvm.JvmModifier
import com.intellij.psi.PsiTypeParameter
import com.siyeh.ig.psiutils.TestUtils
import com.siyeh.ig.psiutils.TypeUtils
import org.jetbrains.uast.UAnonymousClass
import org.jetbrains.uast.UClass
class JUnitUnconstructableTestCaseInspection : AbstractBaseUastLocalInspectionTool() {
@@ -21,7 +17,7 @@ class JUnitUnconstructableTestCaseInspection : AbstractBaseUastLocalInspectionTo
if (javaClass.hasModifier(JvmModifier.ABSTRACT)) return emptyArray()
if (javaClass is PsiTypeParameter) return emptyArray()
if (TestUtils.isJUnitTestClass(javaClass)) { // JUnit 3
if (!javaClass.hasModifier(JvmModifier.PUBLIC) && aClass !is UAnonymousClass) {
if (!javaClass.hasModifier(JvmModifier.PUBLIC) && !aClass.isAnonymousOrLocal()) {
val message = JvmAnalysisBundle.message("jvm.inspections.unconstructable.test.case.not.public.descriptor")
return arrayOf(
manager.createProblemDescriptor(
@@ -44,7 +40,7 @@ class JUnitUnconstructableTestCaseInspection : AbstractBaseUastLocalInspectionTo
}
}
} else if (TestUtils.isJUnit4TestClass(javaClass, false)) { // JUnit 4
if (!javaClass.hasModifier(JvmModifier.PUBLIC) && aClass !is UAnonymousClass) {
if (!javaClass.hasModifier(JvmModifier.PUBLIC) && !aClass.isAnonymousOrLocal()) {
val message = JvmAnalysisBundle.message("jvm.inspections.unconstructable.test.case.not.public.descriptor")
return arrayOf(
manager.createProblemDescriptor(

View File

@@ -61,6 +61,18 @@ class JavaJUnitUnconstructableInspectionTest : JUnitUnconstructableTestCaseTestB
""".trimIndent())
}
fun testUnconstructableJUnit3TestCaseLocalClass() {
myFixture.testHighlighting(ULanguage.JAVA, """
import junit.framework.TestCase;
public class UnconstructableJUnit3TestCaseLocalClass {
public static void main() {
class LocalClass extends TestCase { }
}
}
""".trimIndent())
}
fun testUnconstructableJUnit4TestCase1() {
myFixture.testHighlighting(ULanguage.JAVA, """
import org.junit.Test;

View File

@@ -55,6 +55,16 @@ class KotlinJUnitUnconstructableInspectionTest : JUnitUnconstructableTestCaseTes
""".trimIndent())
}
fun testUnconstructableJUnit3TestCaseLocalClass() {
myFixture.testHighlighting(ULanguage.KOTLIN, """
import junit.framework.TestCase
fun main () {
class LocalClass : TestCase() { }
}
""".trimIndent())
}
fun testUnconstructableJUnit4TestCase1() {
myFixture.testHighlighting(ULanguage.KOTLIN, """
import org.junit.Test