[devkit] IJ-CR-145746 IJPL-163148: make ActionOrGroupIdReference implement PluginConfigReference

to highlight unresolved

GitOrigin-RevId: 2327a574210bdb804dbbc7f73ed2bb1c5066e72a
This commit is contained in:
Nicolay Mitropolsky
2024-10-03 14:48:29 +02:00
committed by intellij-monorepo-bot
parent 781aab2a34
commit bb2f8f4920
4 changed files with 35 additions and 3 deletions

View File

@@ -479,6 +479,8 @@ plugin.xml.convert.language.id.any.language.display.name=<any language>
plugin.xml.convert.module.descriptor.name=Cannot resolve module descriptor ''{0}'' in source roots of module ''{1}''
plugin.xml.action.cannot.resolve=Cannot resolve action id ''{0}''
error.message.cannot.find.module=Cannot find module ''{0}''
error.message.cannot.find.resource.file=Cannot find ''{0}'' file in module ''{1}''

View File

@@ -6,6 +6,7 @@ import com.intellij.patterns.uast.injectionHostUExpression
import com.intellij.psi.*
import com.intellij.util.ThreeState
import org.jetbrains.idea.devkit.util.PsiUtil
import org.jetbrains.uast.evaluateString
private class ActionIdReferenceContributor : PsiReferenceContributor() {
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
@@ -16,11 +17,11 @@ private class ActionIdReferenceContributor : PsiReferenceContributor() {
PsiJavaPatterns.psiMethod()
.withName("getAction").definedInClass("com.intellij.openapi.actionSystem.ActionManager")
),
uastInjectionHostReferenceProvider { _, host ->
uastInjectionHostReferenceProvider { uhost, host ->
arrayOf(ActionOrGroupIdReference(
host,
ElementManipulators.getValueTextRange(host),
ElementManipulators.getValueText(host),
uhost.evaluateString() ?: ElementManipulators.getValueText(host),
ThreeState.UNSURE
))
}

View File

@@ -19,6 +19,7 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.JBIterable;
import com.intellij.util.xml.DomTarget;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.devkit.DevKitBundle;
import org.jetbrains.idea.devkit.dom.ActionOrGroup;
import org.jetbrains.idea.devkit.dom.OverrideText;
import org.jetbrains.idea.devkit.dom.impl.ActionOrGroupResolveConverter;
@@ -27,7 +28,7 @@ import org.jetbrains.idea.devkit.dom.index.IdeaPluginRegistrationIndex;
import java.util.List;
import java.util.Objects;
final class ActionOrGroupIdReference extends PsiPolyVariantReferenceBase<PsiElement> {
final class ActionOrGroupIdReference extends PsiPolyVariantReferenceBase<PsiElement> implements PluginConfigReference {
private final String myId;
private final ThreeState myIsAction;
@@ -106,4 +107,9 @@ final class ActionOrGroupIdReference extends PsiPolyVariantReferenceBase<PsiElem
IdeaPluginRegistrationIndex.processGroup(project, id, scope, processor);
}
}
@Override
public @NotNull String getUnresolvedMessagePattern() {
return DevKitBundle.message("plugin.xml.action.cannot.resolve", myId);
}
}

View File

@@ -2,12 +2,14 @@
package org.jetbrains.idea.devkit.kotlin.codeInsight
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
import org.jetbrains.idea.devkit.inspections.UnresolvedPluginConfigReferenceInspection
class KtActionReferenceTest : LightJavaCodeInsightFixtureTestCase() {
override fun setUp() {
super.setUp()
myFixture.addClass("package com.intellij.ui.components; public class JBList {}");
myFixture.addClass("package com.intellij.openapi.actionSystem; public abstract class AnAction {}");
myFixture.addClass("""
package com.intellij.openapi.actionSystem;
@@ -67,6 +69,27 @@ class KtActionReferenceTest : LightJavaCodeInsightFixtureTestCase() {
assertSameElements(myFixture.getCompletionVariants("Caller.kt").orEmpty(), "myAction", "myGroup")
}
fun testInvalidActionOrGroupReference() {
val DLR = '$'.toString()
myFixture.enableInspections(UnresolvedPluginConfigReferenceInspection::class.java)
myFixture.createFile("plugin.xml", pluginXmlActions("""
<group id="myGroup"></group>
<action id="myAction" class="foo.bar.BarAction"></action>
<action id="${DLR}myActionDollar" class="foo.bar.BarAction"></action>
"""
));
myFixture.configureByText("Caller.kt", """
fun usage(actionManager: com.intellij.openapi.actionSystem.ActionManager){
actionManager.getAction("myAction")
actionManager.getAction("$DLR{"\$DLR"}myActionDollar")
actionManager.getAction("<error descr="Cannot resolve action id 'someUndefinedAction'">someUndefinedAction</error>")
}
""".trimIndent())
myFixture.testHighlighting()
}
fun testRenameGroup() {
myFixture.createFile("plugin.xml", pluginXmlActions("""
<group id="myGroup"></group>