Use new default settings for java nullability annotations in JavaTypeEnhancementState and get rid of all hardcoded defaults

This commit is contained in:
Victor Petukhov
2021-06-01 12:21:24 +03:00
parent 8e7c0e8c61
commit 46d0b16142
27 changed files with 218 additions and 305 deletions
@@ -18,8 +18,9 @@ package org.jetbrains.kotlin.cli.common.arguments
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.load.java.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.isSubpackageOf
class JavaTypeEnhancementStateParser(private val collector: MessageCollector) {
fun parse(
@@ -30,37 +31,36 @@ class JavaTypeEnhancementStateParser(private val collector: MessageCollector) {
): JavaTypeEnhancementState {
val jsr305State = parseJsr305State(jsr305Args)
val enableCompatqualCheckerFrameworkAnnotations = when (supportCompatqualCheckerFrameworkAnnotations) {
"enable" -> true
"disable" -> false
null -> null
val compatqualCheckerFrameworkAnnotationsReportLevel = when (supportCompatqualCheckerFrameworkAnnotations) {
"enable" -> ReportLevel.STRICT
"disable" -> ReportLevel.IGNORE
null -> getDefaultReportLevelForAnnotation(CHECKER_FRAMEWORK_COMPATQUAL_ANNOTATIONS_PACKAGE)
else -> {
collector.report(
CompilerMessageSeverity.ERROR,
"Unrecognized -Xsupport-compatqual-checker-framework-annotations option: $supportCompatqualCheckerFrameworkAnnotations. Possible values are 'enable'/'disable'"
)
null
getDefaultReportLevelForAnnotation(CHECKER_FRAMEWORK_COMPATQUAL_ANNOTATIONS_PACKAGE)
}
}
val jspecifyReportLevel = parseJspecifyReportLevel(jspecifyState)
val nullabilityAnnotationReportLevels = parseNullabilityAnnotationReportLevels(nullabilityAnnotations)
val jsr305Settings = Jsr305Settings(jsr305State.global ?: ReportLevel.WARN, jsr305State.migration, jsr305State.usedDefined)
val state = JavaTypeEnhancementState(
jsr305State.global ?: ReportLevel.WARN, jsr305State.migration, jsr305State.usedDefined,
enableCompatqualCheckerFrameworkAnnotations =
enableCompatqualCheckerFrameworkAnnotations
?: JavaTypeEnhancementState.COMPATQUAL_CHECKER_FRAMEWORK_ANNOTATIONS_SUPPORT_DEFAULT_VALUE,
jspecifyReportLevel = jspecifyReportLevel,
nullabilityAnnotationsReportLevel = nullabilityAnnotationReportLevels
)
return if (state == JavaTypeEnhancementState.DISABLED_JSR_305) JavaTypeEnhancementState.DISABLED_JSR_305 else state
return JavaTypeEnhancementState(jsr305Settings) {
when {
it.isSubpackageOf(JSPECIFY_ANNOTATIONS_PACKAGE) -> jspecifyReportLevel
it.isSubpackageOf(CHECKER_FRAMEWORK_COMPATQUAL_ANNOTATIONS_PACKAGE) -> compatqualCheckerFrameworkAnnotationsReportLevel
else -> getReportLevelForAnnotation(it, nullabilityAnnotationReportLevels)
}
}
}
private fun parseNullabilityAnnotationReportLevels(nullabilityAnnotations: Array<String>?): Map<String, ReportLevel> {
private fun parseNullabilityAnnotationReportLevels(nullabilityAnnotations: Array<String>?): Map<FqName, ReportLevel> {
if (nullabilityAnnotations.isNullOrEmpty()) return emptyMap()
val annotationsWithReportLevels = mutableMapOf<String, ReportLevel>()
val annotationsWithReportLevels = mutableMapOf<FqName, ReportLevel>()
val compilerOption = "-Xnullability-annotations"
for (item in nullabilityAnnotations) {
@@ -83,7 +83,9 @@ class JavaTypeEnhancementStateParser(private val collector: MessageCollector) {
}
private fun parseJspecifyReportLevel(jspecifyState: String?): ReportLevel {
if (jspecifyState == null) return JavaTypeEnhancementState.DEFAULT_REPORT_LEVEL_FOR_JSPECIFY
if (jspecifyState == null)
return getDefaultReportLevelForAnnotation(JSPECIFY_ANNOTATIONS_PACKAGE)
val reportLevel = ReportLevel.findByDescription(jspecifyState)
if (reportLevel == null) {
@@ -91,7 +93,7 @@ class JavaTypeEnhancementStateParser(private val collector: MessageCollector) {
CompilerMessageSeverity.ERROR,
"Unrecognized -Xjspecify-annotations option: $jspecifyState. Possible values are 'disable'/'warn'/'strict'"
)
return JavaTypeEnhancementState.DEFAULT_REPORT_LEVEL_FOR_JSPECIFY
return getDefaultReportLevelForAnnotation(JSPECIFY_ANNOTATIONS_PACKAGE)
}
return reportLevel
@@ -100,13 +102,13 @@ class JavaTypeEnhancementStateParser(private val collector: MessageCollector) {
private data class Jsr305State(
val global: ReportLevel?,
val migration: ReportLevel?,
val usedDefined: Map<String, ReportLevel>
val usedDefined: Map<FqName, ReportLevel>
)
private fun parseJsr305State(args: Array<String>?): Jsr305State {
var global: ReportLevel? = null
var migration: ReportLevel? = null
val userDefined = mutableMapOf<String, ReportLevel>()
val userDefined = mutableMapOf<FqName, ReportLevel>()
val compilerOption = "-Xjsr305"
fun parseJsr305UnderMigration(item: String): ReportLevel? {
@@ -165,7 +167,7 @@ class JavaTypeEnhancementStateParser(private val collector: MessageCollector) {
collector.report(CompilerMessageSeverity.ERROR, "Conflict duplicating $sourceCompilerOption value: $first, $second")
}
private fun parseAnnotationWithReportLevel(item: String, sourceCompilerOption: String): Pair<String, ReportLevel>? {
private fun parseAnnotationWithReportLevel(item: String, sourceCompilerOption: String): Pair<FqName, ReportLevel>? {
val (name, rawState) = item.substring(1).split(":").takeIf { it.size == 2 } ?: run {
reportUnrecognizedReportLevel(item, sourceCompilerOption)
return null
@@ -176,6 +178,6 @@ class JavaTypeEnhancementStateParser(private val collector: MessageCollector) {
return null
}
return name to state
return FqName(name) to state
}
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.config
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import kotlin.reflect.KProperty
object JvmAnalysisFlags {
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaWildcardType
import org.jetbrains.kotlin.load.java.typeEnhancement.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
internal class EnhancementSignatureParts(
@@ -14,8 +14,9 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.load.java.*
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_ANNOTATION_MEMBER_NAME
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.ReportLevel
import org.jetbrains.kotlin.name.FqName
class FirAnnotationTypeQualifierResolver(private val session: FirSession, private val javaTypeEnhancementState: JavaTypeEnhancementState) {
@@ -52,7 +53,7 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat
get() = (coneClassLikeType?.lookupTag?.toSymbol(this@FirAnnotationTypeQualifierResolver.session) as? FirRegularClassSymbol)?.fir
fun resolveTypeQualifierAnnotation(annotationCall: FirAnnotationCall): FirAnnotationCall? {
if (javaTypeEnhancementState.disabledJsr305) {
if (javaTypeEnhancementState.jsr305.isDisabled) {
return null
}
@@ -63,7 +64,7 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat
}
fun resolveQualifierBuiltInDefaultAnnotation(annotationCall: FirAnnotationCall): JavaDefaultQualifiers? {
if (javaTypeEnhancementState.disabledJsr305) {
if (javaTypeEnhancementState.jsr305.isDisabled) {
return null
}
@@ -77,7 +78,7 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat
}
fun resolveTypeQualifierDefaultAnnotation(annotationCall: FirAnnotationCall): TypeQualifierWithApplicability? {
if (javaTypeEnhancementState.disabledJsr305) {
if (javaTypeEnhancementState.jsr305.isDisabled) {
return null
}
@@ -109,11 +110,11 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat
fun resolveJsr305ReportLevel(annotationCall: FirAnnotationCall): ReportLevel {
resolveJsr305CustomLevel(annotationCall)?.let { return it }
return javaTypeEnhancementState.globalJsr305Level
return javaTypeEnhancementState.jsr305.globalLevel
}
fun resolveJsr305CustomLevel(annotationCall: FirAnnotationCall): ReportLevel? {
javaTypeEnhancementState.userDefinedLevelForSpecificJsr305Annotation[annotationCall.classId?.run { packageFqName.asString() + "." + relativeClassName.asString() }]?.let { return it }
javaTypeEnhancementState.jsr305.userDefinedLevelForSpecificAnnotation[annotationCall.classId?.run { FqName(packageFqName.asString() + "." + relativeClassName.asString()) }]?.let { return it }
return annotationCall.resolvedClass?.migrationAnnotationStatus()
}
@@ -122,7 +123,7 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat
it.classId == MIGRATION_ANNOTATION_ID
}?.arguments?.firstOrNull()?.toResolvedCallableSymbol()?.callableId?.callableName ?: return null
javaTypeEnhancementState.migrationLevelForJsr305?.let { return it }
javaTypeEnhancementState.jsr305.migrationLevel?.let { return it }
return when (enumEntryName.asString()) {
"STRICT" -> ReportLevel.STRICT
@@ -146,7 +147,7 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat
)
}
val disabled: Boolean = javaTypeEnhancementState.disabledJsr305
val isDisabled: Boolean = javaTypeEnhancementState.jsr305.isDisabled
}
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.java.enhancement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.load.java.*
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
class FirJavaEnhancementContext private constructor(
val session: FirSession,
@@ -51,7 +50,7 @@ fun FirJavaEnhancementContext.computeNewDefaultTypeQualifiers(
javaTypeEnhancementState: JavaTypeEnhancementState,
additionalAnnotations: List<FirAnnotationCall>
): JavaTypeQualifiersByElementType? {
if (typeQualifierResolver.disabled) return defaultTypeQualifiers
if (typeQualifierResolver.isDisabled) return defaultTypeQualifiers
val defaultQualifiers =
additionalAnnotations.mapNotNull { annotationCall ->
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.java.enhancement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
class FirJsr305StateContainer(val javaTypeEnhancementState: JavaTypeEnhancementState) : FirSessionComponent {
companion object {
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.load.java.typeEnhancement.*
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class FirSignatureEnhancement(
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.load.java.*
import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifier
import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifierWithMigrationStatus
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
fun List<FirAnnotationCall>.extractNullability(
annotationTypeQualifierResolver: FirAnnotationTypeQualifierResolver,
@@ -42,24 +41,21 @@ fun FirAnnotationCall.extractNullability(
private fun FirAnnotationCall.extractNullabilityFromKnownAnnotations(javaTypeEnhancementState: JavaTypeEnhancementState): NullabilityQualifierWithMigrationStatus? {
val annotationClassId = classId ?: return null
val reportLevel = javaTypeEnhancementState.getReportLevelForAnnotation(annotationClassId.asSingleFqName())
return when {
annotationClassId in NULLABLE_ANNOTATION_IDS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE)
annotationClassId in NOT_NULL_ANNOTATION_IDS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL)
annotationClassId == JAVAX_NONNULL_ANNOTATION_ID -> extractNullabilityTypeFromArgument()
if (reportLevel == ReportLevel.IGNORE) return null
annotationClassId == COMPATQUAL_NULLABLE_ANNOTATION_ID && javaTypeEnhancementState.enableCompatqualCheckerFrameworkAnnotations ->
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE)
annotationClassId == COMPATQUAL_NONNULL_ANNOTATION_ID && javaTypeEnhancementState.enableCompatqualCheckerFrameworkAnnotations ->
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL)
annotationClassId == ANDROIDX_RECENTLY_NON_NULL_ANNOTATION_ID -> NullabilityQualifierWithMigrationStatus(
return when (annotationClassId) {
in NULLABLE_ANNOTATION_IDS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE)
in NOT_NULL_ANNOTATION_IDS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL)
JAVAX_NONNULL_ANNOTATION_ID -> extractNullabilityTypeFromArgument()
COMPATQUAL_NULLABLE_ANNOTATION_ID -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE)
COMPATQUAL_NONNULL_ANNOTATION_ID -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL)
ANDROIDX_RECENTLY_NON_NULL_ANNOTATION_ID -> NullabilityQualifierWithMigrationStatus(
NullabilityQualifier.NOT_NULL,
isForWarningOnly = true
)
annotationClassId == ANDROIDX_RECENTLY_NULLABLE_ANNOTATION_ID -> NullabilityQualifierWithMigrationStatus(
ANDROIDX_RECENTLY_NULLABLE_ANNOTATION_ID -> NullabilityQualifierWithMigrationStatus(
NullabilityQualifier.NULLABLE,
isForWarningOnly = true
)
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.utils.ArrayMapAccessor
import org.jetbrains.kotlin.fir.utils.ComponentArrayOwner
import org.jetbrains.kotlin.fir.utils.NullableArrayMapAccessor
import org.jetbrains.kotlin.fir.utils.TypeRegistry
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import kotlin.reflect.KClass
interface FirSessionComponent
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.resolve.jvm.annotations
import org.jetbrains.kotlin.config.JvmDefaultMode
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
@@ -17,7 +16,6 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.util.findImplementationFromInterface
import org.jetbrains.kotlin.utils.ReportLevel
val JVM_DEFAULT_FQ_NAME = FqName("kotlin.jvm.JvmDefault")
val JVM_DEFAULT_NO_COMPATIBILITY_FQ_NAME = FqName("kotlin.jvm.JvmDefaultWithoutCompatibility")
@@ -97,34 +95,3 @@ fun DeclarationDescriptor.findSynchronizedAnnotation(): AnnotationDescriptor? =
annotations.findAnnotation(SYNCHRONIZED_ANNOTATION_FQ_NAME)
fun ClassDescriptor.isJvmRecord(): Boolean = annotations.hasAnnotation(JVM_RECORD_ANNOTATION_FQ_NAME)
data class NullabilityAnnotationsStatus(
val reportLevelBefore: ReportLevel,
val sinceVersion: LanguageVersion = LanguageVersion.KOTLIN_1_0,
val reportLevelAfter: ReportLevel = reportLevelBefore,
) {
companion object {
val DEFAULT = NullabilityAnnotationsStatus(ReportLevel.STRICT)
}
}
val nullabilityAnnotationSettings = mapOf(
FqName("org.jetbrains.annotations") to NullabilityAnnotationsStatus.DEFAULT,
FqName("androidx.annotation") to NullabilityAnnotationsStatus.DEFAULT,
FqName("android.support.annotation") to NullabilityAnnotationsStatus.DEFAULT,
FqName("android.annotation") to NullabilityAnnotationsStatus.DEFAULT,
FqName("com.android.annotations") to NullabilityAnnotationsStatus.DEFAULT,
FqName("org.eclipse.jdt.annotation") to NullabilityAnnotationsStatus.DEFAULT,
FqName("org.checkerframework.checker.nullness.qual") to NullabilityAnnotationsStatus.DEFAULT,
FqName("org.checkerframework.checker.nullness.compatqual") to NullabilityAnnotationsStatus.DEFAULT,
FqName("javax.annotation") to NullabilityAnnotationsStatus.DEFAULT,
FqName("javax.annotation") to NullabilityAnnotationsStatus.DEFAULT,
FqName("edu.umd.cs.findbugs.annotations") to NullabilityAnnotationsStatus.DEFAULT,
FqName("io.reactivex.annotations") to NullabilityAnnotationsStatus.DEFAULT,
FqName("lombok") to NullabilityAnnotationsStatus.DEFAULT,
FqName("org.jspecify.nullness") to NullabilityAnnotationsStatus(
reportLevelBefore = ReportLevel.WARN,
sinceVersion = LanguageVersion.KOTLIN_1_6,
reportLevelAfter = ReportLevel.STRICT
),
)
@@ -121,7 +121,7 @@ public class KtTestUtil {
if (otherProp != null) {
return getJdkHome(otherProp, null, prop);
} else {
return new File("/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home");
throw new AssertionError("Environment variable " + propToReport + " is not set!");
}
}
return new File(jdk);
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.test.directives
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
import org.jetbrains.kotlin.test.services.configuration.JavaForeignAnnotationType
import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.load.java.ReportLevel
@Suppress("RemoveExplicitTypeArguments")
object ForeignAnnotationsDirectives : SimpleDirectivesContainer() {
@@ -8,20 +8,22 @@ package org.jetbrains.kotlin.test.frontend.classic.handlers
import org.jetbrains.kotlin.codeMetaInfo.model.DiagnosticCodeMetaInfo
import org.jetbrains.kotlin.codeMetaInfo.model.JspecifyMarkerCodeMetaInfo
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.load.java.JSPECIFY_ANNOTATIONS_PACKAGE
import org.jetbrains.kotlin.load.java.ReportLevel
import org.jetbrains.kotlin.load.java.getDefaultReportLevelForAnnotation
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
import org.jetbrains.kotlin.test.directives.ForeignAnnotationsDirectives
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.globalMetadataInfoHandler
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.load.java.getReportLevelForAnnotation
// Not that this diagnostic handler should be included only with `ClassicDiagnosticsHandler` and go after it
class JspecifyDiagnosticComplianceHandler(testServices: TestServices) : ClassicFrontendAnalysisHandler(testServices) {
override fun processModule(module: TestModule, info: ClassicFrontendOutputArtifact) {
val jspecifyMode = module.directives[ForeignAnnotationsDirectives.JSPECIFY_STATE].singleOrNull()
?: JavaTypeEnhancementState.DEFAULT_REPORT_LEVEL_FOR_JSPECIFY
?: getDefaultReportLevelForAnnotation(JSPECIFY_ANNOTATIONS_PACKAGE)
for ((testFile, ktFile) in info.allKtFiles) {
val reportedDiagnostics =
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.config.AnalysisFlag
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.load.java.*
import org.jetbrains.kotlin.test.MockLibraryUtil
import org.jetbrains.kotlin.test.TestJavacVersion
import org.jetbrains.kotlin.test.directives.ForeignAnnotationsDirectives
@@ -26,8 +27,7 @@ import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.name.FqName
import java.io.File
import kotlin.io.path.createTempDirectory
@@ -51,16 +51,14 @@ open class JvmForeignAnnotationsConfigurator(testServices: TestServices) : Envir
val userAnnotationsState = directives[JSR305_SPECIAL_REPORT].mapNotNull {
val (name, stateDescription) = it.split(":").takeIf { it.size == 2 } ?: return@mapNotNull null
val state = ReportLevel.findByDescription(stateDescription) ?: return@mapNotNull null
name to state
FqName(name) to state
}.toMap()
val jSpecifyReportLevel = directives.singleOrZeroValue(JSPECIFY_STATE) ?: ReportLevel.WARN
val configuredReportLevels =
directives.singleOrZeroValue(JSPECIFY_STATE)?.let { mapOf(JSPECIFY_ANNOTATIONS_PACKAGE to it) } ?: emptyMap()
return mapOf(
JvmAnalysisFlags.javaTypeEnhancementState to JavaTypeEnhancementState(
globalState,
migrationState,
userAnnotationsState,
jspecifyReportLevel = jSpecifyReportLevel,
nullabilityAnnotationsReportLevel = emptyMap()
Jsr305Settings(globalState, migrationState, userAnnotationsState),
getReportLevelForAnnotation = { getReportLevelForAnnotation(it, configuredReportLevels) }
)
)
}
@@ -6,8 +6,8 @@
package org.jetbrains.kotlin.jvm.compiler
import org.jetbrains.kotlin.load.java.NULLABILITY_ANNOTATIONS
import org.jetbrains.kotlin.load.java.nullabilityAnnotationSettings
import org.jetbrains.kotlin.name.isChildOf
import org.jetbrains.kotlin.resolve.jvm.annotations.nullabilityAnnotationSettings
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
class AllNullabilityAnnotationsAreSetUpTest : KtUsefulTestCase() {
@@ -29,12 +29,12 @@ import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
import org.jetbrains.kotlin.test.*
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import java.io.File
class LoadJavaPackageAnnotationsTest : KtUsefulTestCase() {
companion object {
private val TEST_DATA_PATH = "compiler/testData/loadJavaPackageAnnotations/"
private const val TEST_DATA_PATH = "compiler/testData/loadJavaPackageAnnotations/"
}
private fun doTest(useJavac: Boolean, configurator: (CompilerConfiguration) -> Unit) {
@@ -45,27 +45,26 @@ class LoadJavaPackageAnnotationsTest : KtUsefulTestCase() {
put(JVMConfigurationKeys.USE_JAVAC, true)
}
languageVersionSettings = LanguageVersionSettingsImpl(
LanguageVersion.LATEST_STABLE, ApiVersion.LATEST_STABLE, mapOf(JvmAnalysisFlags.javaTypeEnhancementState to JavaTypeEnhancementState.STRICT)
LanguageVersion.LATEST_STABLE,
ApiVersion.LATEST_STABLE,
mapOf(JvmAnalysisFlags.javaTypeEnhancementState to JavaTypeEnhancementState.DEFAULT)
)
configurator(this)
}
val environment =
KotlinCoreEnvironment.createForTests(
testRootDisposable,
configuration,
EnvironmentConfigFiles.JVM_CONFIG_FILES
).apply {
if (useJavac) {
registerJavac()
}
}
val environment = KotlinCoreEnvironment.createForTests(
testRootDisposable,
configuration,
EnvironmentConfigFiles.JVM_CONFIG_FILES
).apply {
if (useJavac) {
registerJavac()
}
}
val moduleDescriptor = JvmResolveUtil.analyze(environment).moduleDescriptor
val packageFragmentDescriptor =
moduleDescriptor.getPackage(FqName("test")).fragments
.singleOrNull {
it.getMemberScope().getContributedClassifier(Name.identifier("A"), NoLookupLocation.FROM_TEST) != null
}.let { assertInstanceOf(it, LazyJavaPackageFragment::class.java) }
val packageFragmentDescriptor = moduleDescriptor.getPackage(FqName("test")).fragments
.singleOrNull { it.getMemberScope().getContributedClassifier(Name.identifier("A"), NoLookupLocation.FROM_TEST) != null }
.let { assertInstanceOf(it, LazyJavaPackageFragment::class.java) }
val annotation = packageFragmentDescriptor.annotations.findAnnotation(FqName("test.Ann"))
assertNotNull(annotation)
@@ -36,39 +36,39 @@ import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
import org.jetbrains.kotlin.test.*
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import java.io.File
class TypeQualifierAnnotationResolverTest : KtUsefulTestCase() {
companion object {
private val TEST_DATA_PATH = "compiler/testData/typeQualifierNickname/"
private const val TEST_DATA_PATH = "compiler/testData/typeQualifierNickname/"
}
fun testBasicJSRNullabilityAnnotations() {
val (typeQualifierResolver, aClass) = buildTypeQualifierResolverAndFindClass("A")
assertMethodHasUnwrappedAnnotation(
aClass, typeQualifierResolver,
"nullable",
"@javax.annotation.Nonnull(when = When.UNKNOWN)"
aClass, typeQualifierResolver,
"nullable",
"@javax.annotation.Nonnull(when = When.UNKNOWN)"
)
assertMethodHasUnwrappedAnnotation(
aClass, typeQualifierResolver,
"checkForNull",
"@javax.annotation.CheckForNull()"
aClass, typeQualifierResolver,
"checkForNull",
"@javax.annotation.CheckForNull()"
)
assertMethodHasUnwrappedAnnotation(
aClass, typeQualifierResolver,
"nonNull",
"@javax.annotation.Nonnull()"
aClass, typeQualifierResolver,
"nonNull",
"@javax.annotation.Nonnull()"
)
assertMethodHasUnwrappedAnnotation(
aClass, typeQualifierResolver,
"nonNullExplicitArgument",
"@javax.annotation.Nonnull(when = When.ALWAYS)"
aClass, typeQualifierResolver,
"nonNullExplicitArgument",
"@javax.annotation.Nonnull(when = When.ALWAYS)"
)
}
@@ -76,9 +76,9 @@ class TypeQualifierAnnotationResolverTest : KtUsefulTestCase() {
val (typeQualifierResolver, aClass) = buildTypeQualifierResolverAndFindClass("B")
assertMethodHasUnwrappedAnnotation(
aClass, typeQualifierResolver,
"myNullable",
"@javax.annotation.CheckForNull()"
aClass, typeQualifierResolver,
"myNullable",
"@javax.annotation.CheckForNull()"
)
}
@@ -86,16 +86,18 @@ class TypeQualifierAnnotationResolverTest : KtUsefulTestCase() {
val configuration = KotlinTestUtils.newConfiguration(
ConfigurationKind.ALL, TestJdkKind.FULL_JDK,
listOf(
KtTestUtil.getAnnotationsJar(),
MockLibraryUtilExt.compileJavaFilesLibraryToJar(
FOREIGN_ANNOTATIONS_SOURCES_PATH,
"foreign-annotations"
)
),
KtTestUtil.getAnnotationsJar(),
MockLibraryUtilExt.compileJavaFilesLibraryToJar(
FOREIGN_ANNOTATIONS_SOURCES_PATH,
"foreign-annotations"
)
),
listOf(File(TEST_DATA_PATH))
).apply {
languageVersionSettings = LanguageVersionSettingsImpl(
LanguageVersion.LATEST_STABLE, ApiVersion.LATEST_STABLE, mapOf(JvmAnalysisFlags.javaTypeEnhancementState to JavaTypeEnhancementState.STRICT)
LanguageVersion.LATEST_STABLE,
ApiVersion.LATEST_STABLE,
mapOf(JvmAnalysisFlags.javaTypeEnhancementState to JavaTypeEnhancementState.DEFAULT)
)
}
@@ -109,28 +111,28 @@ class TypeQualifierAnnotationResolverTest : KtUsefulTestCase() {
}
private fun assertMethodHasUnwrappedAnnotation(
aClass: ClassDescriptor,
typeQualifierResolver: AnnotationTypeQualifierResolver,
methodName: String,
annotationText: String
aClass: ClassDescriptor,
typeQualifierResolver: AnnotationTypeQualifierResolver,
methodName: String,
annotationText: String
) {
assertEquals(
annotationText,
DescriptorRenderer.withOptions {
annotationArgumentsRenderingPolicy = AnnotationArgumentsRenderingPolicy.ALWAYS_PARENTHESIZED
}.renderAnnotation(
aClass.findSingleTypeQualifierAnnotationOnMethod(methodName, typeQualifierResolver)
)
annotationText,
DescriptorRenderer.withOptions {
annotationArgumentsRenderingPolicy = AnnotationArgumentsRenderingPolicy.ALWAYS_PARENTHESIZED
}.renderAnnotation(
aClass.findSingleTypeQualifierAnnotationOnMethod(methodName, typeQualifierResolver)
)
)
}
private fun ClassDescriptor.findSingleTypeQualifierAnnotationOnMethod(
name: String,
typeQualifierResolver: AnnotationTypeQualifierResolver
name: String,
typeQualifierResolver: AnnotationTypeQualifierResolver
): AnnotationDescriptor = unsubstitutedMemberScope
.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_TEST)
.single()
.annotations.single()
.let(typeQualifierResolver::resolveTypeQualifierAnnotation)
.also(::assertNotNull)!!
.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_TEST)
.single()
.annotations.single()
.let(typeQualifierResolver::resolveTypeQualifierAnnotation)
.also(::assertNotNull)!!
}
@@ -27,8 +27,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
import org.jetbrains.kotlin.resolve.descriptorUtil.firstArgument
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.ReportLevel
class AnnotationTypeQualifierResolver(storageManager: StorageManager, private val javaTypeEnhancementState: JavaTypeEnhancementState) {
class TypeQualifierWithApplicability(
@@ -68,7 +66,7 @@ class AnnotationTypeQualifierResolver(storageManager: StorageManager, private va
}
fun resolveTypeQualifierAnnotation(annotationDescriptor: AnnotationDescriptor): AnnotationDescriptor? {
if (javaTypeEnhancementState.disabledJsr305) {
if (javaTypeEnhancementState.jsr305.isDisabled) {
return null
}
@@ -92,15 +90,16 @@ class AnnotationTypeQualifierResolver(storageManager: StorageManager, private va
}
private fun resolveDefaultAnnotationState(annotationDescriptor: AnnotationDescriptor): ReportLevel {
if (annotationDescriptor.fqName in JSPECIFY_DEFAULT_ANNOTATIONS) {
return javaTypeEnhancementState.jspecifyReportLevel
val annotationFqname = annotationDescriptor.fqName
if (annotationFqname != null && annotationFqname in JSPECIFY_DEFAULT_ANNOTATIONS) {
return javaTypeEnhancementState.getReportLevelForAnnotation(annotationFqname)
}
return resolveJsr305AnnotationState(annotationDescriptor)
}
fun resolveTypeQualifierDefaultAnnotation(annotationDescriptor: AnnotationDescriptor): TypeQualifierWithApplicability? {
if (javaTypeEnhancementState.disabledJsr305) {
if (javaTypeEnhancementState.jsr305.isDisabled) {
return null
}
@@ -138,11 +137,11 @@ class AnnotationTypeQualifierResolver(storageManager: StorageManager, private va
fun resolveJsr305AnnotationState(annotationDescriptor: AnnotationDescriptor): ReportLevel {
resolveJsr305CustomState(annotationDescriptor)?.let { return it }
return javaTypeEnhancementState.globalJsr305Level
return javaTypeEnhancementState.jsr305.globalLevel
}
fun resolveJsr305CustomState(annotationDescriptor: AnnotationDescriptor): ReportLevel? {
javaTypeEnhancementState.userDefinedLevelForSpecificJsr305Annotation[annotationDescriptor.fqName?.asString()]?.let { return it }
javaTypeEnhancementState.jsr305.userDefinedLevelForSpecificAnnotation[annotationDescriptor.fqName]?.let { return it }
return annotationDescriptor.annotationClass?.migrationAnnotationStatus()
}
@@ -150,7 +149,7 @@ class AnnotationTypeQualifierResolver(storageManager: StorageManager, private va
val enumValue = annotations.findAnnotation(MIGRATION_ANNOTATION_FQNAME)?.firstArgument() as? EnumValue
?: return null
javaTypeEnhancementState.migrationLevelForJsr305?.let { return it }
javaTypeEnhancementState.jsr305.migrationLevel?.let { return it }
return when (enumValue.enumEntryName.asString()) {
"STRICT" -> ReportLevel.STRICT
@@ -40,7 +40,6 @@ import org.jetbrains.kotlin.resolve.sam.SamConversionResolver
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
class JavaResolverComponents(
val storageManager: StorageManager,
@@ -39,8 +39,6 @@ import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.typeUtil.contains
import org.jetbrains.kotlin.types.typeUtil.isTypeParameter
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class SignatureEnhancement(
@@ -89,10 +87,7 @@ class SignatureEnhancement(
val isForWarningOnly = annotationDescriptor is LazyJavaAnnotationDescriptor
&& (annotationDescriptor.isFreshlySupportedTypeUseAnnotation || typeParameterBounds)
&& !areImprovementsEnabled
val migrationStatus = jspecifyMigrationStatus(annotationFqName)
?: commonMigrationStatus(annotationFqName, annotationDescriptor, isForWarningOnly)
?: return null
val migrationStatus = commonMigrationStatus(annotationFqName, annotationDescriptor, isForWarningOnly) ?: return null
return if (!migrationStatus.isForWarningOnly
&& annotationDescriptor is PossiblyExternalAnnotationDescriptor
@@ -102,44 +97,35 @@ class SignatureEnhancement(
} else migrationStatus
}
private fun jspecifyMigrationStatus(
annotationFqName: FqName
): NullabilityQualifierWithMigrationStatus? {
if (javaTypeEnhancementState.jspecifyReportLevel == ReportLevel.IGNORE) return null
val isForWarningOnly = javaTypeEnhancementState.jspecifyReportLevel == ReportLevel.WARN
return when (annotationFqName) {
JSPECIFY_NULLABLE -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE, isForWarningOnly)
JSPECIFY_NULLNESS_UNKNOWN ->
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.FORCE_FLEXIBILITY, isForWarningOnly)
else -> null
}
}
private fun getReportLevel(annotationFqName: FqName) = javaTypeEnhancementState.getReportLevelForAnnotation(annotationFqName)
private fun commonMigrationStatus(
annotationFqName: FqName,
annotationDescriptor: AnnotationDescriptor,
isForWarningOnly: Boolean = false
): NullabilityQualifierWithMigrationStatus? = when {
annotationFqName in NULLABLE_ANNOTATIONS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE, isForWarningOnly)
annotationFqName in NOT_NULL_ANNOTATIONS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL, isForWarningOnly)
annotationFqName == JAVAX_NONNULL_ANNOTATION -> annotationDescriptor.extractNullabilityTypeFromArgument(isForWarningOnly)
): NullabilityQualifierWithMigrationStatus? {
val reportLevel = getReportLevel(annotationFqName)
annotationFqName == COMPATQUAL_NULLABLE_ANNOTATION && javaTypeEnhancementState.enableCompatqualCheckerFrameworkAnnotations ->
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE, isForWarningOnly)
if (reportLevel.isIgnore) return null
annotationFqName == COMPATQUAL_NONNULL_ANNOTATION && javaTypeEnhancementState.enableCompatqualCheckerFrameworkAnnotations ->
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL, isForWarningOnly)
val isForWarning = reportLevel.isWarning || isForWarningOnly
annotationFqName == ANDROIDX_RECENTLY_NON_NULL_ANNOTATION -> NullabilityQualifierWithMigrationStatus(
NullabilityQualifier.NOT_NULL,
isForWarningOnly = true
)
annotationFqName == ANDROIDX_RECENTLY_NULLABLE_ANNOTATION -> NullabilityQualifierWithMigrationStatus(
NullabilityQualifier.NULLABLE,
isForWarningOnly = true
)
else -> null
return when (annotationFqName) {
in NULLABLE_ANNOTATIONS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE, isForWarning)
in NOT_NULL_ANNOTATIONS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL, isForWarning)
JAVAX_NONNULL_ANNOTATION -> annotationDescriptor.extractNullabilityTypeFromArgument(isForWarning)
COMPATQUAL_NULLABLE_ANNOTATION ->
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE, isForWarning)
COMPATQUAL_NONNULL_ANNOTATION ->
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL, isForWarning)
ANDROIDX_RECENTLY_NON_NULL_ANNOTATION -> NullabilityQualifierWithMigrationStatus(
NullabilityQualifier.NOT_NULL, isForWarning
)
ANDROIDX_RECENTLY_NULLABLE_ANNOTATION -> NullabilityQualifierWithMigrationStatus(
NullabilityQualifier.NULLABLE, isForWarning
)
else -> null
}
}
fun <D : CallableMemberDescriptor> enhanceSignatures(c: LazyJavaResolverContext, platformSignatures: Collection<D>): Collection<D> {
@@ -45,7 +45,7 @@ import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfigu
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
class RuntimeModuleData private constructor(
val deserialization: DeserializationComponents,
@@ -117,15 +117,19 @@ fun makeLazyJavaPackageFragmentFromClassLoaderProvider(
singleModuleClassResolver: ModuleClassResolver,
packagePartProvider: PackagePartProvider = PackagePartProvider.Empty
): LazyJavaPackageFragmentProvider {
val annotationTypeQualifierResolver = AnnotationTypeQualifierResolver(storageManager, JavaTypeEnhancementState.DISABLED_JSR_305)
val javaTypeEnhancementState = JavaTypeEnhancementState.DISABLED_JSR_305
val annotationTypeQualifierResolver = AnnotationTypeQualifierResolver(storageManager, JavaTypeEnhancementState.DEFAULT)
val javaTypeEnhancementState = JavaTypeEnhancementState.DEFAULT
val javaResolverComponents = JavaResolverComponents(
storageManager, ReflectJavaClassFinder(classLoader), reflectKotlinClassFinder, deserializedDescriptorResolver,
SignaturePropagator.DO_NOTHING, RuntimeErrorReporter, JavaResolverCache.EMPTY,
JavaPropertyInitializerEvaluator.DoNothing, SamConversionResolverImpl(storageManager, emptyList()), RuntimeSourceElementFactory,
singleModuleClassResolver, packagePartProvider, SupertypeLoopChecker.EMPTY, LookupTracker.DO_NOTHING, module,
ReflectionTypes(module, notFoundClasses), annotationTypeQualifierResolver,
SignatureEnhancement(annotationTypeQualifierResolver, JavaTypeEnhancementState.DISABLED_JSR_305, JavaTypeEnhancement(JavaResolverSettings.Default)),
SignatureEnhancement(
annotationTypeQualifierResolver,
JavaTypeEnhancementState.DEFAULT,
JavaTypeEnhancement(JavaResolverSettings.Default)
),
JavaClassesTracker.Default, JavaResolverSettings.Default, NewKotlinTypeChecker.Default, javaTypeEnhancementState,
object : JavaModuleAnnotationsProvider {
override fun getAnnotationsForModuleOwnerOfClass(classId: ClassId): List<JavaAnnotation>? = null
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.load.java
import org.jetbrains.kotlin.name.FqName
class JavaTypeEnhancementState(
val jsr305: Jsr305Settings = Jsr305Settings.DEFAULT,
val getReportLevelForAnnotation: (FqName) -> ReportLevel = ::getDefaultReportLevelForAnnotation
) {
val disabledDefaultAnnotations = jsr305.isDisabled || getReportLevelForAnnotation(JSPECIFY_ANNOTATIONS_PACKAGE) == ReportLevel.IGNORE
companion object {
val DEFAULT = JavaTypeEnhancementState()
}
}
@@ -0,0 +1,20 @@
/*
* 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
enum class ReportLevel(val description: String) {
IGNORE("ignore"),
WARN("warn"),
STRICT("strict"),
;
companion object {
fun findByDescription(description: String?): ReportLevel? = values().firstOrNull { it.description == description }
}
val isWarning: Boolean get() = this == WARN
val isIgnore: Boolean get() = this == IGNORE
}
@@ -1,91 +0,0 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.utils
enum class ReportLevel(val description: String) {
IGNORE("ignore"),
WARN("warn"),
STRICT("strict"),
;
companion object {
fun findByDescription(description: String?): ReportLevel? = values().firstOrNull { it.description == description }
}
val isWarning: Boolean get() = this == ReportLevel.WARN
val isIgnore: Boolean get() = this == ReportLevel.IGNORE
}
class JavaTypeEnhancementState(
val globalJsr305Level: ReportLevel,
val migrationLevelForJsr305: ReportLevel?,
val userDefinedLevelForSpecificJsr305Annotation: Map<String, ReportLevel>,
val enableCompatqualCheckerFrameworkAnnotations: Boolean = COMPATQUAL_CHECKER_FRAMEWORK_ANNOTATIONS_SUPPORT_DEFAULT_VALUE,
val jspecifyReportLevel: ReportLevel = DEFAULT_REPORT_LEVEL_FOR_JSPECIFY,
val nullabilityAnnotationsReportLevel: Map<String, ReportLevel>
) {
val description: Array<String> by lazy {
val result = mutableListOf<String>()
result.add(globalJsr305Level.description)
migrationLevelForJsr305?.let { result.add("under-migration:${it.description}") }
userDefinedLevelForSpecificJsr305Annotation.forEach {
result.add("@${it.key}:${it.value.description}")
}
result.toTypedArray()
}
val disabledJsr305: Boolean =
globalJsr305Level == ReportLevel.IGNORE &&
migrationLevelForJsr305 == ReportLevel.IGNORE &&
userDefinedLevelForSpecificJsr305Annotation.isEmpty()
val disabledDefaultAnnotations = disabledJsr305 || jspecifyReportLevel == ReportLevel.IGNORE
companion object {
const val COMPATQUAL_CHECKER_FRAMEWORK_ANNOTATIONS_SUPPORT_DEFAULT_VALUE = true
@JvmField
val DEFAULT_REPORT_LEVEL_FOR_JSPECIFY = ReportLevel.WARN
@JvmField
val DEFAULT: JavaTypeEnhancementState = JavaTypeEnhancementState(
ReportLevel.WARN,
null,
emptyMap(),
nullabilityAnnotationsReportLevel = emptyMap()
)
@JvmField
val DISABLED_JSR_305: JavaTypeEnhancementState = JavaTypeEnhancementState(
ReportLevel.IGNORE,
ReportLevel.IGNORE,
emptyMap(),
nullabilityAnnotationsReportLevel = emptyMap()
)
@JvmField
val STRICT: JavaTypeEnhancementState = JavaTypeEnhancementState(
ReportLevel.STRICT,
ReportLevel.STRICT,
emptyMap(),
nullabilityAnnotationsReportLevel = emptyMap()
)
}
}
@@ -40,7 +40,7 @@ import org.jetbrains.kotlin.platform.TargetPlatformVersion
import org.jetbrains.kotlin.platform.jvm.JdkPlatform
import org.jetbrains.kotlin.platform.subplatformsOfType
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
object IDELanguageSettingsProvider : LanguageSettingsProvider {
override fun getLanguageVersionSettings(
@@ -47,7 +47,7 @@ import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.UserDataProperty
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import java.io.File
val KtElement.platform: TargetPlatform
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.test.JUnit3WithIdeaConfigurationRunner
import org.jetbrains.kotlin.test.MockLibraryUtilExt
import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.load.java.ReportLevel
import org.junit.runner.RunWith
@RunWith(JUnit3WithIdeaConfigurationRunner::class)