IJPL-189563 LSP: Introduce LSP support for Code Lens and navigation popup

Merge-request: IJ-MR-188241
Merged-by: Vladimir Goncharov <vladimir.goncharov@jetbrains.com>

GitOrigin-RevId: 42b42d128688295cb3189e222472d77ae3b55821
This commit is contained in:
Vladimir Goncharov
2026-02-16 19:16:57 +00:00
committed by intellij-monorepo-bot
parent e1e73d85dd
commit b438c21410
2 changed files with 2 additions and 118 deletions
@@ -1,116 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.java.codeInsight.codeVision
import com.intellij.codeInsight.codeVision.CodeVisionHost
import com.intellij.codeInsight.codeVision.CodeVisionInitializer
import com.intellij.codeInsight.codeVision.settings.CodeVisionSettings
import com.intellij.codeInsight.codeVision.ui.model.CodeVisionListData
import com.intellij.codeInsight.codeVision.ui.renderers.CodeVisionInlayRenderer
import com.intellij.codeInsight.daemon.impl.HighlightInfo
import com.intellij.codeInsight.hints.InlayDumpUtil
import com.intellij.codeInsight.multiverse.CodeInsightContext
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.readAction
import com.intellij.openapi.application.writeIntentReadAction
import com.intellij.openapi.command.WriteCommandAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.waitForSmartMode
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.testFramework.TestModeFlags
import com.intellij.testFramework.fixtures.BasePlatformTestCase.assertEquals
import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl
import com.intellij.testFramework.junit5.fixture.TestFixture
import com.intellij.testFramework.junit5.fixture.testFixture
import com.intellij.util.ArrayUtilRt
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class CodeVisionTestFixture(
private val editor: Editor,
private val virtualFile: VirtualFile,
private val project: Project,
private val disposable: Disposable,
private val onlyCodeVisionHintsAllowed: Boolean = false,
) {
fun doHighlighting(file: PsiFile): List<HighlightInfo> =
CodeInsightTestFixtureImpl.instantiateAndRun(file, editor, ArrayUtilRt.EMPTY_INT_ARRAY, false, false)
suspend fun testProviders(context: CodeInsightContext, expectedText: String, vararg enabledProviderGroupIds: String) {
val sourceText = InlayDumpUtil.removeInlays(expectedText)
project.waitForSmartMode()
val codeVisionHost = readAction { CodeVisionInitializer.getInstance(project).getCodeVisionHost() }
withContext(Dispatchers.EDT) {
writeIntentReadAction {
val settings = CodeVisionSettings.getInstance()
val file = requireNotNull(PsiManager.getInstance(project).findFile(virtualFile, context))
codeVisionHost.providers.map { it.groupId }.toSet().forEach {
settings.setProviderEnabled(it, enabledProviderGroupIds.contains(it))
}
TestModeFlags.set(CodeVisionHost.isCodeVisionTestKey, true, disposable)
codeVisionHost.providers.forEach {
if (it.id == "vcs.code.vision" && enabledProviderGroupIds.contains(it.groupId)) {
it.preparePreview(editor, file)
}
}
val document =
requireNotNull(FileDocumentManager.getInstance().getDocument(virtualFile))
WriteCommandAction.runWriteCommandAction(project) {
document.setText(sourceText)
PsiDocumentManager.getInstance(project).commitDocument(editor.document)
}
val newFile = requireNotNull(PsiDocumentManager.getInstance(project).getPsiFile(document, context))
doHighlighting(newFile)
codeVisionHost.calculateCodeVisionSync(editor, disposable)
}
}
assertText(expectedText)
}
private suspend fun assertText(expectedText: String) {
val sourceText = InlayDumpUtil.removeInlays(expectedText)
val actualText = withContext(Dispatchers.EDT) {
writeIntentReadAction {
dumpCodeVisionHints(sourceText)
}
}
assertEquals(expectedText, actualText)
}
private fun dumpCodeVisionHints(sourceText: String): String {
return InlayDumpUtil.dumpInlays(
sourceText, editor,
filter = {
val rendererSupported = it.renderer is CodeVisionInlayRenderer
if (onlyCodeVisionHintsAllowed && !rendererSupported) error("renderer not supported")
rendererSupported
},
renderer = { _, inlay ->
inlay.getUserData(CodeVisionListData.KEY)!!.visibleLens.joinToString(prefix = "[", postfix = "]", separator = " ") { it.longPresentation }
})
}
}
fun codeVisionFixture(editorFixture: TestFixture<Editor>, fileFixture: TestFixture<PsiFile>): TestFixture<CodeVisionTestFixture> =
testFixture("code-vision-fixture") {
val disposable = Disposer.newDisposable()
val editor = editorFixture.init()
val file = fileFixture.init()
val codeVisionFixture = CodeVisionTestFixture(editor, file.virtualFile, file.project, disposable)
initialized(codeVisionFixture) {
// cleanup
Disposer.dispose(disposable)
}
}
@@ -1,4 +1,4 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.hints
import com.intellij.codeInsight.codeVision.CodeVisionProvider
@@ -19,7 +19,7 @@ import com.intellij.openapi.project.Project
private val LOG = logger<InlayProviderUsageCollector>()
internal class InlayProviderUsageCollector : ProjectUsagesCollector() {
private val INLAY_CONFIGURATION_GROUP = EventLogGroup("inlay.configuration", 61)
private val INLAY_CONFIGURATION_GROUP = EventLogGroup("inlay.configuration", 62)
private val GLOBAL_SETTINGS_EVENT = INLAY_CONFIGURATION_GROUP.registerEvent(
"global.inlays.settings",