Describe default settings for java nullability annotations depending on current kotlin version
This commit is contained in:
+64
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.load.java
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.isChildOf
|
||||||
|
|
||||||
|
val JSPECIFY_ANNOTATIONS_PACKAGE = FqName("org.jspecify.nullness")
|
||||||
|
val CHECKER_FRAMEWORK_COMPATQUAL_ANNOTATIONS_PACKAGE = FqName("org.checkerframework.checker.nullness.compatqual")
|
||||||
|
|
||||||
|
val nullabilityAnnotationSettings = mapOf(
|
||||||
|
FqName("org.jetbrains.annotations") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("androidx.annotation") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("android.support.annotation") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("android.annotation") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("com.android.annotations") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("org.eclipse.jdt.annotation") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("org.checkerframework.checker.nullness.qual") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
CHECKER_FRAMEWORK_COMPATQUAL_ANNOTATIONS_PACKAGE to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("javax.annotation") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("edu.umd.cs.findbugs.annotations") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("io.reactivex.annotations") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
FqName("lombok") to JavaNullabilityAnnotationsStatus.DEFAULT,
|
||||||
|
JSPECIFY_ANNOTATIONS_PACKAGE to JavaNullabilityAnnotationsStatus(
|
||||||
|
reportLevelBefore = ReportLevel.WARN,
|
||||||
|
sinceVersion = KotlinVersion(1, 6),
|
||||||
|
reportLevelAfter = ReportLevel.STRICT
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
val jsr305Settings = JavaNullabilityAnnotationsStatus(
|
||||||
|
reportLevelBefore = ReportLevel.WARN,
|
||||||
|
sinceVersion = null
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getDefaultReportLevelForAnnotation(annotationFqName: FqName) = getReportLevelForAnnotation(annotationFqName, emptyMap())
|
||||||
|
|
||||||
|
fun getReportLevelForAnnotation(annotationFqName: FqName, configuredReportLevels: Map<FqName, ReportLevel>): ReportLevel {
|
||||||
|
val configuredReportLevel = configuredReportLevels.entries.find { (fqName, _) ->
|
||||||
|
annotationFqName == fqName || annotationFqName.isChildOf(fqName)
|
||||||
|
}?.value
|
||||||
|
|
||||||
|
if (configuredReportLevel != null) return configuredReportLevel
|
||||||
|
|
||||||
|
val defaultReportLevel = nullabilityAnnotationSettings.entries.find { (fqName, _) ->
|
||||||
|
annotationFqName == fqName || annotationFqName.isChildOf(fqName)
|
||||||
|
}?.value
|
||||||
|
|
||||||
|
require(defaultReportLevel != null) {
|
||||||
|
println(nullabilityAnnotationSettings)
|
||||||
|
"Default settings for nullability annotation ${annotationFqName.asString()} must be described"
|
||||||
|
}
|
||||||
|
|
||||||
|
return if (defaultReportLevel.sinceVersion != null && defaultReportLevel.sinceVersion <= KotlinVersion.CURRENT) {
|
||||||
|
defaultReportLevel.reportLevelAfter
|
||||||
|
} else {
|
||||||
|
defaultReportLevel.reportLevelBefore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.load.java
|
||||||
|
|
||||||
|
data class JavaNullabilityAnnotationsStatus(
|
||||||
|
val reportLevelBefore: ReportLevel,
|
||||||
|
val sinceVersion: KotlinVersion? = KotlinVersion(1, 0),
|
||||||
|
val reportLevelAfter: ReportLevel = reportLevelBefore,
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
val DEFAULT = JavaNullabilityAnnotationsStatus(ReportLevel.STRICT)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.load.java
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
|
data class Jsr305Settings(
|
||||||
|
val globalLevel: ReportLevel,
|
||||||
|
val migrationLevel: ReportLevel? = null,
|
||||||
|
val userDefinedLevelForSpecificAnnotation: Map<FqName, ReportLevel> = emptyMap()
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
val DEFAULT by lazy {
|
||||||
|
val reportLevelBefore = if (jsr305Settings.sinceVersion != null && jsr305Settings.sinceVersion <= KotlinVersion.CURRENT) {
|
||||||
|
jsr305Settings.reportLevelBefore
|
||||||
|
} else jsr305Settings.reportLevelAfter
|
||||||
|
|
||||||
|
Jsr305Settings(reportLevelBefore, if (reportLevelBefore == ReportLevel.WARN) null else reportLevelBefore)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
val description by lazy {
|
||||||
|
buildList {
|
||||||
|
add(globalLevel.description)
|
||||||
|
migrationLevel?.let { add("under-migration:${it.description}") }
|
||||||
|
userDefinedLevelForSpecificAnnotation.forEach { add("@${it.key}:${it.value.description}") }
|
||||||
|
}.toTypedArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
val isDisabled = globalLevel == ReportLevel.IGNORE
|
||||||
|
&& migrationLevel == ReportLevel.IGNORE
|
||||||
|
&& userDefinedLevelForSpecificAnnotation.isEmpty()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user