Skip to content

Commit 87e3609

Browse files
bartekpaciaintellij-monorepo-bot
authored andcommitted
refactor [lsp]: clean up Blacklist and move Kotlin/Java blacklists to better places
Done while working toward LSP-308 GitOrigin-RevId: 0ce7737a94fbcaad1f20b11daaeb1ebb8972b693
1 parent 641c08d commit 87e3609

File tree

4 files changed

+99
-80
lines changed

4 files changed

+99
-80
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
package com.jetbrains.ls.api.features.impl.common.diagnostics
3+
4+
import kotlin.reflect.KClass
5+
6+
class Blacklist(entries: List<BlacklistEntry>) {
7+
constructor(vararg entries: BlacklistEntry) : this(entries.toList())
8+
9+
private val implementationClasses = entries.filterIsInstance<BlacklistEntry.Class>().map { entry -> entry.fqcn }
10+
11+
private val superClasses = entries.filterIsInstance<BlacklistEntry.SuperClass>().map { entry -> entry.fqcn }
12+
13+
fun containsImplementation(fqcn: String): Boolean {
14+
return fqcn in implementationClasses
15+
}
16+
17+
fun containsSuperClass(inspectionInstance: Any): Boolean {
18+
return inspectionInstance::class.supertypes.any { kType ->
19+
(kType.classifier as? KClass<*>)?.java?.name in superClasses
20+
}
21+
}
22+
}
23+
24+
sealed class BlacklistEntry {
25+
abstract val reason: String
26+
27+
protected fun ensureReason() {
28+
require(reason.isNotBlank()) { "reason must not be blank" }
29+
}
30+
31+
data class Class(val fqcn: String, override val reason: String) : BlacklistEntry() {
32+
init {
33+
ensureReason()
34+
}
35+
}
36+
37+
data class SuperClass(val fqcn: String, override val reason: String) : BlacklistEntry() {
38+
init {
39+
ensureReason()
40+
}
41+
}
42+
}

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

Lines changed: 2 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.jetbrains.ls.api.core.util.findVirtualFile
2424
import com.jetbrains.ls.api.core.util.toLspRange
2525
import com.jetbrains.ls.api.core.withAnalysisContext
2626
import com.jetbrains.ls.api.features.diagnostics.LSDiagnosticProvider
27+
import com.jetbrains.ls.api.features.impl.common.diagnostics.Blacklist
2728
import com.jetbrains.ls.api.features.impl.common.diagnostics.DiagnosticSource
2829
import com.jetbrains.ls.api.features.impl.common.diagnostics.SimpleDiagnosticData
2930
import com.jetbrains.ls.api.features.impl.common.diagnostics.SimpleDiagnosticQuickfixData
@@ -35,10 +36,10 @@ import com.jetbrains.lsp.protocol.*
3536
import kotlinx.coroutines.flow.Flow
3637
import kotlinx.coroutines.flow.flow
3738
import kotlinx.serialization.json.encodeToJsonElement
38-
import kotlin.reflect.KClass
3939

4040
class LSInspectionDiagnosticProviderImpl(
4141
override val supportedLanguages: Set<LSLanguage>,
42+
private val blacklist: Blacklist = Blacklist(),
4243
) : LSDiagnosticProvider {
4344
companion object {
4445
val diagnosticSource: DiagnosticSource = DiagnosticSource("inspection")
@@ -115,84 +116,6 @@ class LSInspectionDiagnosticProviderImpl(
115116
}.forEach { diagnostic -> emit(diagnostic) }
116117
}
117118

118-
// kotlin ones should be moved closer to the kotlin impl
119-
private val blacklist = BlackList(
120-
// Kotlin local inspections
121-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.RemoveRedundantQualifierNameInspection", "slow"),
122-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.codeInsight.inspections.shared.KotlinUnusedImportInspection", "slow"),
123-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.UnusedVariableInspection", "slow"),
124-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.KotlinUnreachableCodeInspection", "slow"),
125-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.RemoveExplicitTypeArgumentsInspection", "slow"),
126-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.K2MemberVisibilityCanBePrivateInspection", "slow, performs find usages"),
127-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.VariableNeverReadInspection", "very slow, uses extended checkers"),
128-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.AssignedValueIsNeverReadInspection", "very slow, uses extended checkers"),
129-
130-
BlackListEntry.InspectionClass("org.jetbrains.kotlin.idea.k2.codeinsight.inspections.PublicApiImplicitTypeInspection", "too noisy https://github.com/Kotlin/kotlin-lsp/issues/4"),
131-
132-
BlackListEntry.InspectionSuperClass("org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.KotlinKtDiagnosticBasedInspectionBase", "they are slow as calling additional diagnostic collection"),
133-
BlackListEntry.InspectionSuperClass("org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.KotlinPsiDiagnosticBasedInspectionBase", "they are slow as calling additional diagnostic collection"),
134-
135-
// Java local inspections
136-
BlackListEntry.InspectionClass("com.siyeh.ig.bugs.WriteOnlyObjectInspection", "depends on ContractInferenceIndexKt which depends on GistManager"),
137-
BlackListEntry.InspectionClass("com.siyeh.ig.bugs.MismatchedCollectionQueryUpdateInspection", "depends on ImplicitUsagesProvider"),
138-
BlackListEntry.InspectionSuperClass("com.intellij.codeInspection.nullable.NullableStuffInspectionBase", "depends on NullableNotNullManager"),
139-
BlackListEntry.InspectionClass("com.intellij.codeInspection.nullable.NotNullFieldNotInitializedInspection", "depends on NullableNotNullManager"),
140-
BlackListEntry.InspectionClass("com.siyeh.ig.controlflow.IfStatementWithIdenticalBranchesInspection", "depends on NullableNotNullManager"),
141-
BlackListEntry.InspectionClass("com.siyeh.ig.threading.DoubleCheckedLockingInspection", "depends on NullableNotNullManager"),
142-
BlackListEntry.InspectionClass("com.siyeh.ig.controlflow.DuplicateConditionInspection", "depends on NullableNotNullManager"),
143-
BlackListEntry.InspectionClass("com.siyeh.ig.migration.IfCanBeSwitchInspection", "depends on NullableNotNullManager"),
144-
BlackListEntry.InspectionClass("com.siyeh.ig.controlflow.PointlessNullCheckInspection", "depends on NullableNotNullManager"),
145-
BlackListEntry.InspectionClass("com.intellij.codeInspection.bulkOperation.UseBulkOperationInspection", "depends on BulkMethodInfoProvider"),
146-
BlackListEntry.InspectionClass("com.intellij.codeInspection.UpdateInspectionOptionFix", "depends on PathMacrosImpl"),
147-
BlackListEntry.InspectionClass("com.siyeh.ig.annotation.MetaAnnotationWithoutRuntimeRetentionInspection", "depends on UastLanguagePlugin"),
148-
BlackListEntry.InspectionClass("com.siyeh.ig.bugs.IgnoreResultOfCallInspection", "depends on ProjectBytecodeAnalysis"),
149-
BlackListEntry.InspectionClass("com.siyeh.ig.style.FieldMayBeFinalInspection", "Missing extension point com.intellij.canBeFinal"),
150-
BlackListEntry.InspectionClass("com.siyeh.ig.controlflow.PointlessBooleanExpressionInspection", "Missing extension point: com.intellij.canBeFinal"),
151-
BlackListEntry.InspectionClass("com.siyeh.ig.maturity.CommentedOutCodeInspection", "depends on JavaCodeFragmentFactory"),
152-
BlackListEntry.InspectionClass("com.intellij.codeInspection.java18api.Java8MapApiInspection", "Missing extension point: com.intellij.deepestSuperMethodsSearch"),
153-
BlackListEntry.InspectionClass("com.siyeh.ig.dataflow.UnnecessaryLocalVariableInspection", "depends on CommonJavaInlineUtil"),
154-
BlackListEntry.InspectionClass("com.siyeh.ig.controlflow.ExcessiveRangeCheckInspection", "NoClassDefFoundError: could not initialize class com.intellij.psi.impl.JavaSimplePropertyGistKt"),
155-
156-
// Java global inspections
157-
BlackListEntry.InspectionClass("com.intellij.codeInspection.IdempotentLoopBodyInspection", "depends on ProjectBytecodeAnalysis which is not available in LSP context"),
158-
)
159-
160-
private class BlackList(
161-
entries: List<BlackListEntry>,
162-
) {
163-
constructor(vararg entries: BlackListEntry) : this(entries.toList())
164-
165-
private val implementationClasses = entries.mapTo(mutableSetOf()) { (it as? BlackListEntry.InspectionClass)?.inspectionClass }
166-
private val superClasses = entries.mapTo(mutableSetOf()) { (it as? BlackListEntry.InspectionSuperClass)?.superClass }
167-
168-
fun containsImplementation(inspectionClass: String): Boolean {
169-
return inspectionClass in implementationClasses
170-
}
171-
172-
fun containsSuperClass(inspectionInstance: Any): Boolean {
173-
return inspectionInstance::class.supertypes.any { (it.classifier as? KClass<*>)?.java?.name in superClasses }
174-
}
175-
}
176-
177-
private sealed class BlackListEntry{
178-
abstract val reason: String
179-
180-
protected fun ensureReason() {
181-
require(reason.isNotBlank()) { "inspectionClass must not be blank" }
182-
}
183-
184-
data class InspectionClass(val inspectionClass: String, override val reason: String): BlackListEntry() {
185-
init {
186-
ensureReason()
187-
}
188-
}
189-
data class InspectionSuperClass(val superClass: String, override val reason: String): BlackListEntry() {
190-
init {
191-
ensureReason()
192-
}
193-
}
194-
}
195-
196119
private fun getLocalInspections(psiFile: PsiFile): List<LocalInspectionTool> {
197120
return LocalInspectionEP.LOCAL_INSPECTION.extensionList
198121
.asSequence()

features-impl/kotlin/src/com/jetbrains/ls/api/features/impl/common/kotlin/configuration/LSKotlinLanguageConfiguration.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.jetbrains.ls.api.features.impl.common.kotlin.definitions.LSKotlinPack
1616
import com.jetbrains.ls.api.features.impl.common.kotlin.diagnostics.compiler.LSKotlinCompilerDiagnosticsFixesCodeActionProvider
1717
import com.jetbrains.ls.api.features.impl.common.kotlin.diagnostics.compiler.LSKotlinCompilerDiagnosticsProvider
1818
import com.jetbrains.ls.api.features.impl.common.kotlin.diagnostics.intentions.LSKotlinIntentionCodeActionProviderImpl
19+
import com.jetbrains.ls.api.features.impl.common.kotlin.diagnostics.kotlinInspectionBlacklist
1920
import com.jetbrains.ls.api.features.impl.common.kotlin.hover.LSHoverProviderKotlinImpl
2021
import com.jetbrains.ls.api.features.impl.common.kotlin.inlayHints.LSInlayHintsKotlinImpl
2122
import com.jetbrains.ls.api.features.impl.common.kotlin.language.LSKotlinLanguage
@@ -40,7 +41,7 @@ val LSKotlinLanguageConfiguration: LSConfigurationPiece = LSConfigurationPiece(
4041
LSKotlinPackageDefinitionProvider,
4142
LSSemanticTokensProviderKotlinImpl,
4243
LSReferencesProviderCommonImpl(setOf(LSKotlinLanguage), TargetKind.ALL),
43-
LSInspectionDiagnosticProviderImpl(setOf(LSKotlinLanguage)),
44+
LSInspectionDiagnosticProviderImpl(setOf(LSKotlinLanguage), blacklist = kotlinInspectionBlacklist),
4445
LSInspectionFixesCodeActionProvider(setOf(LSKotlinLanguage)),
4546
LSSyntaxErrorDiagnosticProviderImpl(setOf(LSKotlinLanguage)),
4647
LSKotlinCompilerDiagnosticsProvider,
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
package com.jetbrains.ls.api.features.impl.common.kotlin.diagnostics
3+
4+
import com.jetbrains.ls.api.features.impl.common.diagnostics.Blacklist
5+
import com.jetbrains.ls.api.features.impl.common.diagnostics.BlacklistEntry
6+
7+
internal val kotlinInspectionBlacklist = Blacklist(
8+
// Local inspections
9+
BlacklistEntry.Class(
10+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.RemoveRedundantQualifierNameInspection",
11+
reason = "slow",
12+
),
13+
BlacklistEntry.Class(
14+
fqcn = "org.jetbrains.kotlin.idea.codeInsight.inspections.shared.KotlinUnusedImportInspection",
15+
reason = "slow",
16+
),
17+
BlacklistEntry.Class(
18+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.UnusedVariableInspection",
19+
reason = "slow",
20+
),
21+
BlacklistEntry.Class(
22+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.KotlinUnreachableCodeInspection",
23+
reason = "slow",
24+
),
25+
BlacklistEntry.Class(
26+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.RemoveExplicitTypeArgumentsInspection",
27+
reason = "slow",
28+
),
29+
BlacklistEntry.Class(
30+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.K2MemberVisibilityCanBePrivateInspection",
31+
reason = "slow, performs find usages",
32+
),
33+
BlacklistEntry.Class(
34+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.VariableNeverReadInspection",
35+
reason = "very slow, uses extended checkers",
36+
),
37+
BlacklistEntry.Class(
38+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased.AssignedValueIsNeverReadInspection",
39+
reason = "very slow, uses extended checkers",
40+
),
41+
BlacklistEntry.Class(
42+
fqcn = "org.jetbrains.kotlin.idea.k2.codeinsight.inspections.PublicApiImplicitTypeInspection",
43+
reason = "too noisy https://github.com/Kotlin/kotlin-lsp/issues/4",
44+
),
45+
BlacklistEntry.SuperClass(
46+
fqcn = "org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.KotlinKtDiagnosticBasedInspectionBase",
47+
reason = "they are slow as calling additional diagnostic collection",
48+
),
49+
BlacklistEntry.SuperClass(
50+
fqcn = "org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.KotlinPsiDiagnosticBasedInspectionBase",
51+
reason = "they are slow as calling additional diagnostic collection",
52+
),
53+
)

0 commit comments

Comments
 (0)