[kotlin] k2: restore navigation to registry keys located in plugin.xml

- Registry was converted from java to kotlin, then resolve inside sources start to return functions from the companion object. At the same time, decompiled code still returns bridges from Registry itself and thus was not affected by the bug.
- Test covers now only "sources" case, because the compiled case is covered by java/k1 tests.

^KTIJ-31444 fixed

GitOrigin-RevId: 59dfa24c89b89057e6af3e5da939cf7a93bdb8fa
This commit is contained in:
Anna Kozlova
2024-09-30 12:00:19 +02:00
committed by intellij-monorepo-bot
parent 644c0d4252
commit a43aa6fee3
5 changed files with 91 additions and 3 deletions

View File

@@ -44,7 +44,10 @@ final class RegistryKeyIdReferenceContributor extends PsiReferenceContributor {
.methodCallParameter(0, psiMethod()
.withName(string().oneOf("get", "is", "intValue", "doubleValue", "stringValue", "getColor"))
.definedInClass(PsiJavaPatterns.psiClass().withQualifiedName(string().oneOf(
//kotlin would resolve in the companion,
//while java would pretend to see static method in class
Registry.class.getName(),
Registry.class.getName() + ".Companion",
RegistryManager.class.getName()
)))),
new UastInjectionHostReferenceProvider() {

View File

@@ -14,5 +14,6 @@
<orderEntry type="module" module-name="intellij.devkit.testFramework" />
<orderEntry type="module" module-name="intellij.kotlin.plugin.community.main" />
<orderEntry type="module" module-name="intellij.kotlin.devkit" />
<orderEntry type="module" module-name="kotlin.base.test" scope="TEST" />
</component>
</module>

View File

@@ -0,0 +1,24 @@
import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.util.registry.RegistryManager
class RegistryKeyId {
fun registry() {
Registry.intValue("vcs.showConsole") // registry.properties
Registry.intValue("my.plugin.key") // registryKey.xml
Registry.get("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
Registry.`is`("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
Registry.intValue("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
Registry.doubleValue("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
Registry.stringValue("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
}
fun registryManager() {
val registryManager = RegistryManager.getInstance()
registryManager.`is`("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
registryManager.intValue("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
registryManager.intValue("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>", 123)
registryManager.get("<error descr="Cannot resolve registry key 'INVALID_VALUE'">INVALID_VALUE</error>")
}
}

View File

@@ -0,0 +1,5 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<registryKey defaultValue="myDefaultValue" description="My description" restartRequired="true" key="my.plugin.key"/>
</extensions>
</idea-plugin>

View File

@@ -1,19 +1,39 @@
package org.jetbrains.idea.devkit.k2.codeInsight
import com.intellij.codeInspection.LocalInspectionEP
import com.intellij.diagnostic.ITNReporter
import com.intellij.notification.impl.NotificationGroupEP
import com.intellij.openapi.application.PluginPathManager
import com.intellij.openapi.extensions.BaseExtensionPointName
import com.intellij.openapi.options.Configurable
import com.intellij.openapi.options.advanced.AdvancedSettings
import com.intellij.openapi.project.IntelliJProjectUtil
import com.intellij.openapi.util.Iconable
import com.intellij.openapi.util.registry.RegistryManager
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.builders.JavaModuleFixtureBuilder
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase
import com.intellij.ui.components.JBList
import com.intellij.util.IncorrectOperationException
import com.intellij.util.PathUtil
import com.intellij.util.xmlb.annotations.XCollection
import org.jetbrains.annotations.NonNls
import org.jetbrains.idea.devkit.inspections.PluginXmlDomInspection
import org.jetbrains.idea.devkit.inspections.UnresolvedPluginConfigReferenceInspection
import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginMode
import org.jetbrains.kotlin.idea.base.plugin.artifacts.TestKotlinArtifacts
import org.jetbrains.kotlin.idea.test.ExpectedPluginModeProvider
import org.jetbrains.kotlin.idea.test.setUpWithKotlinPlugin
import java.nio.file.Paths
class KotlinFirPluginXmlFunctionalTest : JavaCodeInsightFixtureTestCase(), ExpectedPluginModeProvider {
override val pluginMode: KotlinPluginMode = KotlinPluginMode.K2
class KotlinFirPluginXmlFunctionalTest : JavaCodeInsightFixtureTestCase() {
override fun setUp() {
super.setUp()
myFixture.enableInspections(PluginXmlDomInspection::class.java)
setUpWithKotlinPlugin {
super.setUp()
myFixture.enableInspections(PluginXmlDomInspection::class.java)
}
}
override fun getBasePath(): @NonNls String? {
@@ -26,10 +46,45 @@ class KotlinFirPluginXmlFunctionalTest : JavaCodeInsightFixtureTestCase() {
//because kotlin builtins are not found in library session
moduleBuilder.addLibrary("annotations", TestKotlinArtifacts.kotlinStdlib.canonicalPath, PathUtil.getJarPathForClass(XCollection::class.java))
moduleBuilder.addJdk(IdeaTestUtil.getMockJdk18Path().getPath())
moduleBuilder.addLibrary("platform-core", PathUtil.getJarPathForClass(RegistryManager::class.java))
moduleBuilder.addLibrary("platform-ide", PathUtil.getJarPathForClass(JBList::class.java))
moduleBuilder.addLibrary("platform-ide-impl", PathUtil.getJarPathForClass(ITNReporter::class.java))
moduleBuilder.addLibrary("platform-util-base", PathUtil.getJarPathForClass(IncorrectOperationException::class.java))
//moduleBuilder.addLibrary("platform-util", PathUtil.getJarPathForClass(Iconable::class.java))
moduleBuilder.addLibrary("platform-analysis", PathUtil.getJarPathForClass(LocalInspectionEP::class.java))
moduleBuilder.addLibrary("platform-resources", Paths.get(PathUtil.getJarPathForClass(LocalInspectionEP::class.java))
.resolveSibling("intellij.platform.resources").toString());
moduleBuilder.addLibrary("platform-ide-core", PathUtil.getJarPathForClass(Configurable::class.java))
moduleBuilder.addLibrary("platform-ide-core-impl", PathUtil.getJarPathForClass(NotificationGroupEP::class.java))
moduleBuilder.addLibrary("platform-editor", PathUtil.getJarPathForClass(AdvancedSettings::class.java))
moduleBuilder.addLibrary("platform-extensions", PathUtil.getJarPathForClass(BaseExtensionPointName::class.java))
}
fun testCustomAttribute() {
myFixture.testHighlightingAllFiles(true, false, false, "MyBean.kt", "plugin.xml")
}
fun testRegistryKeyIdHighlighting() {
myFixture.addFileToProject("Registry.kt", """
package com.intellij.openapi.util.registry
class Registry {
companion object {
@JvmStatic fun get(key: String): RegistryValue
@JvmStatic fun `is`(key: String): Boolean
@JvmStatic fun `is`(key: String, defaultValue: Boolean): Boolean
@JvmStatic fun intValue(key: String): Int
@JvmStatic fun intValue(key: String, defaultValue: Int): Int
@JvmStatic fun doubleValue(key: String, defaultValue: Double): Double
@JvmStatic fun doubleValue(key: String): Double
@JvmStatic fun stringValue(key: String): String
@JvmStatic fun intValue(key: String, defaultValue: Int, minValue: Int, maxValue: Int): Int
}
}
""")
myFixture.enableInspections(UnresolvedPluginConfigReferenceInspection())
myFixture.testHighlighting(true, false, false, "RegistryKeyId.kt", "registryKeyId.xml")
}
}