From 5784e9e931e9d4bcde95f1be7cbab8baa8c6691c Mon Sep 17 00:00:00 2001 From: Yuriy Artamonov Date: Tue, 23 Dec 2025 11:01:54 +0100 Subject: [PATCH] [devkit] IJPL-115429 Fix false-positive private visibility diagnostics for AnAction not registered in plugin.xml GitOrigin-RevId: c457667cab714b6ae8cc9c0ebf83bd233bc5e324 --- .../ActionClassWithPrivateModifier.kt | 4 +++- .../PrivateExtensionClassInspection.kt | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/privateExtension/ActionClassWithPrivateModifier.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/privateExtension/ActionClassWithPrivateModifier.kt index 43c7e30efe45..5c88e6b92f22 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/privateExtension/ActionClassWithPrivateModifier.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/privateExtension/ActionClassWithPrivateModifier.kt @@ -6,4 +6,6 @@ import com.intellij.openapi.actionSystem.* class MyPublicActionImpl : AnAction() { -} \ No newline at end of file +} + +private class MyLocallyDeclaredActionImpl : AnAction() { } \ No newline at end of file diff --git a/plugins/devkit/intellij.kotlin.devkit/src/inspections/PrivateExtensionClassInspection.kt b/plugins/devkit/intellij.kotlin.devkit/src/inspections/PrivateExtensionClassInspection.kt index 5e0c8a5f3db2..88d95e33f1ea 100644 --- a/plugins/devkit/intellij.kotlin.devkit/src/inspections/PrivateExtensionClassInspection.kt +++ b/plugins/devkit/intellij.kotlin.devkit/src/inspections/PrivateExtensionClassInspection.kt @@ -7,6 +7,7 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiElementVisitor import com.intellij.psi.util.InheritanceUtil import org.jetbrains.annotations.Nls +import org.jetbrains.idea.devkit.dom.index.IdeaPluginRegistrationIndex import org.jetbrains.idea.devkit.inspections.ExtensionUtil import org.jetbrains.idea.devkit.inspections.ExtensionUtil.isExtensionPointImplementationCandidate import org.jetbrains.idea.devkit.inspections.isServiceImplementationRegisteredInPluginXml @@ -26,9 +27,12 @@ internal class PrivateExtensionClassInspection : LocalInspectionTool() { return object : KtVisitorVoid() { override fun visitClass(klass: KtClass) { if (!klass.isPrivate()) return - val ktLightClass = klass.toLightClass() ?: return - if (isExtensionOrAction(ktLightClass) + + if (!isExtensionPointImplementationCandidate(ktLightClass)) return + + if (isExtension(ktLightClass) + || isRegisteredAction(ktLightClass) || isServiceImplementationRegisteredInPluginXml(ktLightClass)) { holder.registerProblem(klass.modifierList ?: klass, DevKitKotlinBundle.message("inspection.private.extension.class.text"), InternalVisibilityFix()) @@ -39,11 +43,13 @@ internal class PrivateExtensionClassInspection : LocalInspectionTool() { } } - private fun isExtensionOrAction(psiClass: PsiClass): Boolean { - if (!isExtensionPointImplementationCandidate(psiClass)) return false - + private fun isExtension(psiClass: PsiClass): Boolean { return ExtensionUtil.isInstantiatedExtension(psiClass) { ExtensionUtil.hasServiceBeanFqn(it) } - || InheritanceUtil.isInheritor(psiClass, "com.intellij.openapi.actionSystem.AnAction") + } + + private fun isRegisteredAction(psiClass: PsiClass): Boolean { + return InheritanceUtil.isInheritor(psiClass, "com.intellij.openapi.actionSystem.AnAction") + && IdeaPluginRegistrationIndex.isRegisteredActionOrGroup(psiClass, psiClass.resolveScope) } private class InternalVisibilityFix : LocalQuickFix {