Skip to content

Commit 5566e5d

Browse files
darthorimarintellij-monorepo-bot
authored andcommitted
[lsp] filter code actions by kind
To avoid computing redundant actions GitOrigin-RevId: f6129e204e3ff4a675c433086cfc453bc074b41d
1 parent b2d3a31 commit 5566e5d

File tree

9 files changed

+46
-10
lines changed

9 files changed

+46
-10
lines changed

api.features/src/com/jetbrains/ls/api/features/codeActions/LSCodeActionProvider.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,18 @@ package com.jetbrains.ls.api.features.codeActions
44
import com.jetbrains.ls.api.core.LSServer
55
import com.jetbrains.ls.api.features.LSLanguageSpecificConfigurationEntry
66
import com.jetbrains.lsp.protocol.CodeAction
7+
import com.jetbrains.lsp.protocol.CodeActionKind
78
import com.jetbrains.lsp.protocol.CodeActionParams
89
import kotlinx.coroutines.flow.Flow
910

1011
interface LSCodeActionProvider : LSLanguageSpecificConfigurationEntry {
12+
/**
13+
* Only code actions of these kinds will be provided. Cannot be empty.
14+
*
15+
* [getCodeActions] cannot provide kinds not listed in [providesOnlyKinds]. Otherwise, it an exception will be thrown.
16+
*/
17+
val providesOnlyKinds: Set<CodeActionKind>
18+
1119
context(LSServer)
1220
fun getCodeActions(params: CodeActionParams): Flow<CodeAction>
1321
}

api.features/src/com/jetbrains/ls/api/features/codeActions/LSCodeActions.kt

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,41 @@ import com.jetbrains.ls.api.features.LSConfiguration
66
import com.jetbrains.ls.api.features.partialResults.LSConcurrentResponseHandler
77
import com.jetbrains.lsp.implementation.LspHandlerContext
88
import com.jetbrains.lsp.protocol.CodeAction
9+
import com.jetbrains.lsp.protocol.CodeActionKind
910
import com.jetbrains.lsp.protocol.CodeActionParams
11+
import kotlinx.coroutines.flow.onEach
1012

1113
object LSCodeActions {
1214
context(LSServer, LSConfiguration, LspHandlerContext)
1315
suspend fun getCodeActions(params: CodeActionParams): List<CodeAction> {
1416
return LSConcurrentResponseHandler.streamResultsIfPossibleOrRespondDirectly(
1517
params.partialResultToken,
1618
CodeAction.serializer(),
17-
entriesFor<LSCodeActionProvider>(params.textDocument),
18-
) {
19-
it.getCodeActions(params)
19+
getProviders(params),
20+
) { provider ->
21+
provider.getCodeActions(params)
22+
.onEach { it.ensureCanBeProvidedBy(provider) }
23+
}
24+
}
25+
26+
context(LSConfiguration)
27+
fun supportedCodeActionKinds(): List<CodeActionKind> {
28+
return entries<LSCodeActionProvider>().flatMapTo(mutableSetOf()) { it.providesOnlyKinds }.toList()
29+
}
30+
31+
32+
private fun CodeAction.ensureCanBeProvidedBy(provider: LSCodeActionProvider) {
33+
check(kind in provider.providesOnlyKinds) {
34+
"Code action $title is not supported by ${provider.javaClass.name}. The only supported kinds are: ${provider.providesOnlyKinds.joinToString()}"
35+
}
36+
}
37+
38+
context(LSConfiguration)
39+
private fun getProviders(params: CodeActionParams): List<LSCodeActionProvider> {
40+
val all = entriesFor<LSCodeActionProvider>(params.textDocument)
41+
val only = params.context.only?.toSet() ?: return all
42+
return all.filter { provider ->
43+
provider.providesOnlyKinds.any { it in only }
2044
}
2145
}
2246
}

api.features/src/com/jetbrains/ls/api/features/codeActions/LSSimpleCodeActionProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ import kotlinx.serialization.json.encodeToJsonElement
2020

2121
abstract class LSSimpleCodeActionProvider<P : Any> : LSCodeActionProvider, LSCommandDescriptorProvider {
2222
protected abstract val title: String
23-
protected open val kind: CodeActionKind? = null
23+
protected abstract val kind: CodeActionKind
2424
protected open val isPreferred: Boolean? = null
2525
protected open val commandName: String get() = title
2626

27+
final override val providesOnlyKinds: Set<CodeActionKind> get ()= setOf(kind)
28+
2729
abstract val dataSerializer: KSerializer<P>
2830

2931
context(LSServer, LSAnalysisContext)

features-impl/common/src/com/jetbrains/ls/api/features/impl/common/diagnostics/inspections/LSInspectionDiagnosticProviderImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class LSInspectionDiagnosticProviderImpl(
5959
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.K2MemberVisibilityCanBePrivateInspection", "slow, performs find usages"),
6060
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.VariableNeverReadInspection", "very slow, uses extended checkers"),
6161
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.AssignedValueIsNeverReadInspection", "very slow, uses extended checkers"),
62-
62+
6363
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.expressions.ExplicitThisInspection", "too noisy https://github.com/Kotlin/kotlin-lsp/issues/20"),
6464
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.ImplicitThisInspection", "too noisy https://github.com/Kotlin/kotlin-lsp/issues/20"),
6565
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.PublicApiImplicitTypeInspection", "too noisy https://github.com/Kotlin/kotlin-lsp/issues/4"),

features-impl/common/src/com/jetbrains/ls/api/features/impl/common/diagnostics/inspections/LSInspectionFixesCodeActionProvider.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ class LSInspectionFixesCodeActionProvider(
2626
override val supportedLanguages: Set<LSLanguage>,
2727
) : LSCodeActionProvider, LSCommandDescriptorProvider {
2828

29+
override val providesOnlyKinds: Set<CodeActionKind> = setOf(CodeActionKind.QuickFix)
30+
2931
context(LSServer)
3032
override fun getCodeActions(params: CodeActionParams): Flow<CodeAction> = flow {
31-
if (!params.shouldProvideKind(CodeActionKind.QuickFix)) return@flow
3233
val diagnosticData = params.diagnosticData<InspectionDiagnosticData>().ifEmpty { return@flow }
3334

3435
withAnalysisContext {

features-impl/kotlin/src/com/jetbrains/ls/api/features/impl/common/kotlin/codeActions/LSOrganizeImportsCodeActionProviderKotlinImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal object LSOrganizeImportsCodeActionProviderKotlinImpl : LSSimpleCodeActi
2424
override val supportedLanguages: Set<LSLanguage> get() = setOf(LSKotlinLanguage)
2525

2626
override val title: String get() = "Organize Imports"
27-
override val kind: CodeActionKind? get() = CodeActionKind.SourceOrganizeImports
27+
override val kind: CodeActionKind get() = CodeActionKind.SourceOrganizeImports
2828
override val dataSerializer: KSerializer<NoData> get() = NoData.serializer()
2929

3030
context(LSServer, LSAnalysisContext)

features-impl/kotlin/src/com/jetbrains/ls/api/features/impl/common/kotlin/diagnostics/compiler/LSKotlinCompilerDiagnosticsFixesCodeActionProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ import org.jetbrains.kotlin.psi.KtFile
3636

3737
internal object LSKotlinCompilerDiagnosticsFixesCodeActionProvider : LSCodeActionProvider, LSCommandDescriptorProvider {
3838
override val supportedLanguages: Set<LSLanguage> = setOf(LSKotlinLanguage)
39+
override val providesOnlyKinds: Set<CodeActionKind> = setOf(CodeActionKind.QuickFix)
3940

4041
context(LSServer)
4142
override fun getCodeActions(params: CodeActionParams): Flow<CodeAction> = flow {
42-
if (!params.shouldProvideKind(CodeActionKind.QuickFix)) return@flow
4343
val diagnosticData = params.diagnosticData<KotlinCompilerDiagnosticData>().ifEmpty { return@flow }
4444

4545
val uri = params.textDocument.uri.uri

features-impl/kotlin/src/com/jetbrains/ls/api/features/impl/common/kotlin/diagnostics/intentions/LSKotlinIntentionCodeActionProviderImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import java.util.function.Function
5151

5252
internal object LSKotlinIntentionCodeActionProviderImpl : LSCodeActionProvider, LSCommandDescriptorProvider {
5353
override val supportedLanguages: Set<LSLanguage> get() = setOf(LSKotlinLanguage)
54+
override val providesOnlyKinds: Set<CodeActionKind> = setOf(CodeActionKind.QuickFix)
5455

5556
private fun createActions(): List<KotlinApplicableModCommandAction<*, *>> {
5657
return listOf(
@@ -61,7 +62,6 @@ internal object LSKotlinIntentionCodeActionProviderImpl : LSCodeActionProvider,
6162

6263
context(LSServer)
6364
override fun getCodeActions(params: CodeActionParams): Flow<CodeAction> = flow {
64-
if (!params.shouldProvideKind(CodeActionKind.QuickFix)) return@flow
6565
val uri = params.textDocument.uri.uri
6666
withAnalysisContext {
6767
runReadAction {

kotlin-lsp/src/com/jetbrains/ls/kotlinLsp/requests/core/initialize.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.jetbrains.ls.api.core.util.jarLibraries
77
import com.jetbrains.ls.api.core.util.toLspUri
88
import com.jetbrains.ls.api.core.util.updateWorkspaceModel
99
import com.jetbrains.ls.api.features.LSConfiguration
10+
import com.jetbrains.ls.api.features.codeActions.LSCodeActions
1011
import com.jetbrains.ls.api.features.completion.LSCompletionProvider
1112
import com.jetbrains.ls.api.features.semanticTokens.LSSemanticTokens
1213
import com.jetbrains.ls.imports.api.WorkspaceImportException
@@ -84,7 +85,7 @@ internal fun LspHandlersBuilder.initializeRequest() {
8485
),
8586
codeActionProvider = OrBoolean.of(
8687
CodeActionOptions(
87-
codeActionKinds = CodeActionKind.entries,
88+
codeActionKinds = LSCodeActions.supportedCodeActionKinds(),
8889
resolveProvider = false,
8990
workDoneProgress = false,
9091
)

0 commit comments

Comments
 (0)