K2: introduce OptIn language version checker
#KT-60598 Fixed
This commit is contained in:
committed by
Space Team
parent
8c305d6143
commit
95bf63d6cb
+37
-1
@@ -5,9 +5,45 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.analysis.checkers.config
|
||||
|
||||
import org.jetbrains.kotlin.config.AnalysisFlags
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.PackageResolutionResult
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.resolveToPackageOrClass
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.checkers.OptInNames
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
|
||||
|
||||
object FirOptInLanguageVersionSettingsChecker : FirLanguageVersionSettingsChecker() {
|
||||
override fun check(context: CheckerContext, rawReport: (Boolean, String) -> Unit) {
|
||||
context.languageVersionSettings.getFlag(AnalysisFlags.optIn).forEach { fqNameAsString ->
|
||||
if (fqNameAsString != OptInNames.REQUIRES_OPT_IN_FQ_NAME.asString()) {
|
||||
checkOptInMarkerArgument(context, fqNameAsString, rawReport)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkOptInMarkerArgument(context: CheckerContext, fqNameAsString: String, rawReport: (Boolean, String) -> Unit) {
|
||||
val packageOrClass = resolveToPackageOrClass(context.session.symbolProvider, FqName(fqNameAsString))
|
||||
val symbol = (packageOrClass as? PackageResolutionResult.PackageOrClass)?.classSymbol
|
||||
|
||||
if (symbol == null) {
|
||||
rawReport(
|
||||
false,
|
||||
"Opt-in requirement marker $fqNameAsString is unresolved. Please make sure it's present in the module dependencies"
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
if (symbol.getAnnotationByClassId(OptInNames.REQUIRES_OPT_IN_CLASS_ID, context.session) == null) {
|
||||
rawReport(false, "Class $fqNameAsString is not an opt-in requirement marker")
|
||||
return
|
||||
}
|
||||
val deprecationInfo = symbol.getDeprecation(context.languageVersionSettings.apiVersion)?.all ?: return
|
||||
rawReport(
|
||||
deprecationInfo.deprecationLevel != DeprecationLevelValue.WARNING,
|
||||
"Opt-in requirement marker $fqNameAsString is deprecated" + deprecationInfo.message?.let { ". $it" }.orEmpty()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+2
-7
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.LanguageVersionSettingsCheckers
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.config.FirLanguageVersionSettingsChecker
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkersComponent
|
||||
|
||||
@@ -21,13 +20,9 @@ class LanguageVersionSettingsDiagnosticComponent(
|
||||
private val checkers: LanguageVersionSettingsCheckers = session.checkersComponent.languageVersionSettingsCheckers,
|
||||
) : AbstractDiagnosticCollectorComponent(session, reporter) {
|
||||
override fun checkSettings(data: CheckerContext) {
|
||||
checkers.languageVersionSettingsCheckers.check(data)
|
||||
}
|
||||
|
||||
private fun Collection<FirLanguageVersionSettingsChecker>.check(context: CheckerContext) {
|
||||
val rawReport = (reporter as? BaseDiagnosticsCollector)?.rawReport ?: return
|
||||
for (checker in this) {
|
||||
checker.check(context, rawReport)
|
||||
for (checker in checkers.languageVersionSettingsCheckers) {
|
||||
checker.check(data, rawReport)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user