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

WIP

GitOrigin-RevId: 0c8002a011a442f8cad12a001f6a2daf40e28be5
This commit is contained in:
Yann Cébron
2024-07-16 17:09:39 +02:00
committed by intellij-monorepo-bot
parent 81668ee458
commit 4817098482
9 changed files with 117 additions and 2 deletions

View File

@@ -0,0 +1,8 @@
<html>
<body>
<code>javax.swing.JComponent</code> must use <code>com.intellij.openapi.actionSystem.UiDataProvider</code> instead of
<code>com.intellij.openapi.actionSystem.DataProvider</code> API.
<!-- tooltip end -->
<p><small>New in 2024.3</small>
</body>
</html>

View File

@@ -395,6 +395,11 @@
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"
projectType="INTELLIJ_PLUGIN"
groupPathKey="inspections.group.path"
key="inspections.jcomponent.data.provider.display.name" groupKey="inspections.group.code" enabledByDefault="true"
level="WARNING" implementationClass="org.jetbrains.idea.devkit.inspections.JComponentDataProviderInspection"/>
<localInspection language="UAST" enabledByDefault="true" level="ERROR" shortName="ExtensionRegisteredAsServiceOrComponent"
projectType="INTELLIJ_PLUGIN"

View File

@@ -685,4 +685,7 @@ inspection.plugin.xml.registration.check.display.name=Plugin.xml registration ch
inspection.plugin.xml.plugin.logo.display.name=Plugin Logo check
api.dump.generated.sources.filter.notification=Do not modify manually, contents must be taken from ApiCheckTest.
devkit.unstable.api.usage.ignore.declared.inside.this.project=Ignore unstable API declared in this project
devkit.unstable.api.usage.ignore.declared.inside.this.project=Ignore unstable API declared in this project
inspections.jcomponent.data.provider.display.name=JComponent must use UiDataProvider
inspections.jcomponent.data.provider.use.uidataprovider.instead.of.dataprovider=Use UiDataProvider instead of DataProvider

View File

@@ -0,0 +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.ProblemsHolder
import com.intellij.lang.jvm.DefaultJvmElementVisitor
import com.intellij.lang.jvm.JvmClass
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 org.jetbrains.idea.devkit.DevKitBundle
import javax.swing.JComponent
internal class JComponentDataProviderInspection : DevKitJvmInspection() {
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 visitClass(clazz: JvmClass): Boolean {
if (clazz.classKind != JvmClassKind.CLASS) return true
if (!JvmInheritanceUtil.isInheritor(clazz, DataProvider::class.java.canonicalName)) return true
@Suppress("UsagesOfObsoleteApi")
if (JvmInheritanceUtil.isInheritor(clazz, UiCompatibleDataProvider::class.java.canonicalName)) return true
if (JvmInheritanceUtil.isInheritor(clazz, JComponent::class.java.canonicalName)) {
sink.highlight(DevKitBundle.message("inspections.jcomponent.data.provider.use.uidataprovider.instead.of.dataprovider"))
}
return true
}
}
}
}

View File

@@ -0,0 +1,4 @@
import javax.swing.JComponent;
import com.intellij.openapi.actionSystem.DataProvider;
public class <warning descr="Use UiDataProvider instead of DataProvider">MyJComponent</warning> extends JComponent implements DataProvider {}

View File

@@ -0,0 +1,4 @@
import javax.swing.JComponent;
import com.intellij.openapi.actionSystem.UiCompatibleDataProvider;
public class MyJComponentUiCompatibleDataProvider extends JComponent implements UiCompatibleDataProvider {}

View File

@@ -0,0 +1,3 @@
import com.intellij.openapi.actionSystem.DataProvider;
public class NotJComponent implements DataProvider {}

View File

@@ -41,7 +41,7 @@ public class DevkitInspectionsRegistrationCheckTest extends BasePlatformTestCase
List<LocalInspectionEP> devkitInspections = ContainerUtil.filter(LocalInspectionEP.LOCAL_INSPECTION.getExtensionList(), ep -> {
return "DevKit".equals(ep.getPluginDescriptor().getPluginId().getIdString());
});
assertEquals("Mismatch in total inspections, check classpath in test run configuration (intellij.devkit.plugin)", 72,
assertEquals("Mismatch in total inspections, check classpath in test run configuration (intellij.devkit.plugin)", 73,
devkitInspections.size());
List<LocalInspectionEP> disabledInspections = ContainerUtil.filter(devkitInspections, ep -> !ep.enabledByDefault);

View File

@@ -0,0 +1,46 @@
// 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.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() {
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()
}
fun testMyJComponent() {
doTest()
}
fun testMyJComponentUiCompatibleDataProvider() {
doTest()
}
}