[devkit] new inspection: JComponent must use UiDataProvider (IDEA-355274)

rewrite to UAST

GitOrigin-RevId: 3579db2e2f0416ea30ceeddb8f0416efe53c5831
This commit is contained in:
Yann Cébron
2024-08-06 11:57:42 +02:00
committed by intellij-monorepo-bot
parent 70a88b1725
commit e2fa26c890
6 changed files with 72 additions and 42 deletions

View File

@@ -395,7 +395,7 @@
groupPathKey="inspections.group.path"
key="inspections.action.update.thread.display.name" groupKey="inspections.group.code" enabledByDefault="true"
level="WARNING" implementationClass="org.jetbrains.idea.devkit.inspections.MissingActionUpdateThread"/>
<localInspection language="JVM"
<localInspection language="UAST"
projectType="INTELLIJ_PLUGIN"
groupPathKey="inspections.group.path"
key="inspections.jcomponent.data.provider.display.name" groupKey="inspections.group.code" enabledByDefault="true"

View File

@@ -1,42 +1,42 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.devkit.inspections
import com.intellij.codeInspection.InspectionManager
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.lang.jvm.DefaultJvmElementVisitor
import com.intellij.lang.jvm.JvmClass
import com.intellij.codeInspection.registerUProblem
import com.intellij.lang.jvm.JvmClassKind
import com.intellij.lang.jvm.JvmElementVisitor
import com.intellij.lang.jvm.util.JvmInheritanceUtil
import com.intellij.openapi.actionSystem.DataProvider
import com.intellij.openapi.actionSystem.UiCompatibleDataProvider
import com.intellij.openapi.actionSystem.UiDataProvider
import com.intellij.openapi.project.Project
import com.intellij.psi.util.InheritanceUtil
import org.jetbrains.idea.devkit.DevKitBundle
import org.jetbrains.uast.UClass
import javax.swing.JComponent
internal class JComponentDataProviderInspection : DevKitJvmInspection() {
internal class JComponentDataProviderInspection : DevKitUastInspectionBase(UClass::class.java) {
override fun isAllowed(holder: ProblemsHolder): Boolean {
return super.isAllowed(holder) &&
DevKitInspectionUtil.isClassAvailable(holder, UiDataProvider::class.java.name)
}
override fun buildVisitor(project: Project, sink: HighlightSink, isOnTheFly: Boolean): JvmElementVisitor<Boolean>? {
return object : DefaultJvmElementVisitor<Boolean> {
override fun checkClass(uClass: UClass, manager: InspectionManager, isOnTheFly: Boolean): Array<out ProblemDescriptor?>? {
val psiClass = uClass.javaPsi
if (psiClass.classKind != JvmClassKind.CLASS) return null
override fun visitClass(clazz: JvmClass): Boolean {
if (clazz.classKind != JvmClassKind.CLASS) return true
@Suppress("UsagesOfObsoleteApi")
if (!InheritanceUtil.isInheritor(psiClass, DataProvider::class.java.canonicalName)) return null
if (!JvmInheritanceUtil.isInheritor(clazz, DataProvider::class.java.canonicalName)) return true
@Suppress("UsagesOfObsoleteApi")
if (InheritanceUtil.isInheritor(psiClass, UiCompatibleDataProvider::class.java.canonicalName)) return null
@Suppress("UsagesOfObsoleteApi")
if (JvmInheritanceUtil.isInheritor(clazz, UiCompatibleDataProvider::class.java.canonicalName)) return true
if (!InheritanceUtil.isInheritor(psiClass, JComponent::class.java.canonicalName)) return null
if (JvmInheritanceUtil.isInheritor(clazz, JComponent::class.java.canonicalName)) {
sink.highlight(DevKitBundle.message("inspections.jcomponent.data.provider.use.uidataprovider.instead.of.dataprovider"))
}
return true
}
}
val holder = createProblemsHolder(uClass, manager, isOnTheFly)
holder.registerUProblem(uClass,
DevKitBundle.message("inspections.jcomponent.data.provider.use.uidataprovider.instead.of.dataprovider"))
return holder.resultsArray
}
}

View File

@@ -3,35 +3,14 @@ package org.jetbrains.idea.devkit.inspections
import com.intellij.testFramework.TestDataPath
import org.jetbrains.idea.devkit.DevkitJavaTestsUtil
import org.jetbrains.idea.devkit.inspections.quickfix.LightDevKitInspectionFixTestBase
@TestDataPath("\$CONTENT_ROOT/testData/inspections/jComponentDataProvider")
class JComponentDataProviderInspectionTest : LightDevKitInspectionFixTestBase() {
class JComponentDataProviderInspectionTest : JComponentDataProviderInspectionTestBase() {
override fun getBasePath() = DevkitJavaTestsUtil.TESTDATA_PATH + "inspections/jComponentDataProvider/"
override fun getFileExtension(): String = "java"
override fun setUp() {
super.setUp()
myFixture.enableInspections(JComponentDataProviderInspection())
myFixture.addClass("""
package com.intellij.openapi.actionSystem;
public interface DataProvider {}
""".trimIndent())
myFixture.addClass("""
package com.intellij.openapi.actionSystem;
public interface UiCompatibleDataProvider {}
""".trimIndent())
myFixture.addClass("""
package com.intellij.openapi.actionSystem;
public interface UiDataProvider {}
""".trimIndent())
}
fun testNotJComponent() {
doTest()
}

View File

@@ -0,0 +1,6 @@
@file:Suppress("MISSING_DEPENDENCY_SUPERCLASS") // mockSDK misses some superclasses
import javax.swing.JComponent
import com.intellij.openapi.actionSystem.DataProvider
private val table = <warning descr="Use UiDataProvider instead of DataProvider">object</warning> : JComponent(), DataProvider {}

View File

@@ -0,0 +1,17 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.devkit.kotlin.inspections
import org.jetbrains.idea.devkit.inspections.JComponentDataProviderInspectionTestBase
import org.jetbrains.idea.devkit.kotlin.DevkitKtTestsUtil
class KtJComponentDataProviderInspectionTest : JComponentDataProviderInspectionTestBase() {
override fun getFileExtension() = "kt"
override fun getBasePath(): String = DevkitKtTestsUtil.TESTDATA_PATH + "/inspections/jComponentDataProvider/"
fun testObject() {
doTest()
}
}

View File

@@ -0,0 +1,28 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.devkit.inspections
import org.jetbrains.idea.devkit.inspections.quickfix.LightDevKitInspectionFixTestBase
abstract class JComponentDataProviderInspectionTestBase : LightDevKitInspectionFixTestBase() {
override fun setUp() {
super.setUp()
myFixture.enableInspections(JComponentDataProviderInspection())
myFixture.addClass("""
package com.intellij.openapi.actionSystem;
public interface DataProvider {}
""".trimIndent())
myFixture.addClass("""
package com.intellij.openapi.actionSystem;
public interface UiCompatibleDataProvider {}
""".trimIndent())
myFixture.addClass("""
package com.intellij.openapi.actionSystem;
public interface UiDataProvider {}
""".trimIndent())
}
}