FIR/FE: extract common code for type qualifier defaults

This commit is contained in:
pyos
2021-08-09 08:36:42 +02:00
committed by teamcityserver
parent 8bf5e86788
commit e0d0bf9ede
6 changed files with 61 additions and 150 deletions
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.load.java.structure.JavaWildcardType
import org.jetbrains.kotlin.load.java.typeEnhancement.* import org.jetbrains.kotlin.load.java.typeEnhancement.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
internal class EnhancementSignatureParts( internal class EnhancementSignatureParts(
@@ -49,11 +48,10 @@ internal class EnhancementSignatureParts(
internal fun enhance( internal fun enhance(
session: FirSession, session: FirSession,
javaTypeEnhancementState: JavaTypeEnhancementState,
predefined: TypeEnhancementInfo? = null, predefined: TypeEnhancementInfo? = null,
forAnnotationMember: Boolean = false forAnnotationMember: Boolean = false
): PartEnhancementResult { ): PartEnhancementResult {
val qualifiers = computeIndexedQualifiersForOverride(session, javaTypeEnhancementState) val qualifiers = computeIndexedQualifiersForOverride(session)
val qualifiersWithPredefined = predefined?.let { val qualifiersWithPredefined = predefined?.let {
IndexedJavaTypeQualifiers(qualifiers.size) { index -> IndexedJavaTypeQualifiers(qualifiers.size) { index ->
@@ -95,13 +93,12 @@ internal class EnhancementSignatureParts(
private fun FirTypeRef.toIndexed( private fun FirTypeRef.toIndexed(
typeQualifierResolver: FirAnnotationTypeQualifierResolver, typeQualifierResolver: FirAnnotationTypeQualifierResolver,
javaTypeEnhancementState: JavaTypeEnhancementState,
context: FirJavaEnhancementContext context: FirJavaEnhancementContext
): List<TypeAndDefaultQualifiers> { ): List<TypeAndDefaultQualifiers> {
val list = ArrayList<TypeAndDefaultQualifiers>(1) val list = ArrayList<TypeAndDefaultQualifiers>(1)
fun add(type: FirTypeRef?) { fun add(type: FirTypeRef?) {
val c = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, javaTypeEnhancementState, type?.annotations.orEmpty()) val c = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, type?.annotations.orEmpty())
list.add( list.add(
TypeAndDefaultQualifiers( TypeAndDefaultQualifiers(
@@ -206,7 +203,7 @@ internal class EnhancementSignatureParts(
else else
defaultQualifiersForType defaultQualifiersForType
val nullabilityInfo = composedAnnotation.extractNullability(typeQualifierResolver).also { val nullabilityInfo = composedAnnotation.firstNotNullOfOrNull { typeQualifierResolver.extractNullability(it) }.also {
if (it?.qualifier == NullabilityQualifier.NOT_NULL) { if (it?.qualifier == NullabilityQualifier.NOT_NULL) {
attributesCache[this] = composedAnnotation.computeTypeAttributesForJavaType() attributesCache[this] = composedAnnotation.computeTypeAttributesForJavaType()
} }
@@ -284,9 +281,9 @@ internal class EnhancementSignatureParts(
) )
} }
private fun computeIndexedQualifiersForOverride(session: FirSession, javaTypeEnhancementState: JavaTypeEnhancementState): IndexedJavaTypeQualifiers { private fun computeIndexedQualifiersForOverride(session: FirSession): IndexedJavaTypeQualifiers {
val indexedFromSupertypes = fromOverridden.map { it.toIndexed(typeQualifierResolver, javaTypeEnhancementState, context) } val indexedFromSupertypes = fromOverridden.map { it.toIndexed(typeQualifierResolver, context) }
val indexedThisType = current.toIndexed(typeQualifierResolver, javaTypeEnhancementState, context) val indexedThisType = current.toIndexed(typeQualifierResolver, context)
// The covariant case may be hard, e.g. in the superclass the return may be Super<T>, but in the subclass it may be Derived, which // The covariant case may be hard, e.g. in the superclass the return may be Super<T>, but in the subclass it may be Derived, which
// is declared to extend Super<T>, and propagating data here is highly non-trivial, so we only look at the head type constructor // is declared to extend Super<T>, and propagating data here is highly non-trivial, so we only look at the head type constructor
@@ -19,66 +19,13 @@ class FirJavaEnhancementContext private constructor(
val defaultTypeQualifiers: JavaTypeQualifiersByElementType? by delegateForDefaultTypeQualifiers val defaultTypeQualifiers: JavaTypeQualifiersByElementType? by delegateForDefaultTypeQualifiers
} }
fun extractDefaultNullabilityQualifier(
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
annotationCall: FirAnnotationCall
): JavaDefaultQualifiers? {
typeQualifierResolver.resolveQualifierBuiltInDefaultAnnotation(annotationCall)?.let { return it }
val (typeQualifier, applicability) =
typeQualifierResolver.resolveTypeQualifierDefaultAnnotation(annotationCall)
?: return null
val jsr305ReportLevel = with(typeQualifierResolver) {
resolveJsr305CustomState(annotationCall) ?: resolveJsr305AnnotationState(typeQualifier)
}
if (jsr305ReportLevel.isIgnore) {
return null
}
val nullabilityQualifier = typeQualifier.extractNullability(typeQualifierResolver)
?.copy(isForWarningOnly = jsr305ReportLevel.isWarning) ?: return null
return JavaDefaultQualifiers(nullabilityQualifier, applicability)
}
fun FirJavaEnhancementContext.computeNewDefaultTypeQualifiers(
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
javaTypeEnhancementState: JavaTypeEnhancementState,
additionalAnnotations: List<FirAnnotationCall>
): JavaTypeQualifiersByElementType? {
if (javaTypeEnhancementState.jsr305.isDisabled) return defaultTypeQualifiers
val defaultQualifiers =
additionalAnnotations.mapNotNull { annotationCall ->
extractDefaultNullabilityQualifier(typeQualifierResolver, annotationCall)
}
if (defaultQualifiers.isEmpty()) return defaultTypeQualifiers
val defaultQualifiersByType =
defaultTypeQualifiers?.defaultQualifiers?.let(::QualifierByApplicabilityType)
?: QualifierByApplicabilityType(AnnotationQualifierApplicabilityType::class.java)
var wasUpdate = false
for (qualifier in defaultQualifiers) {
for (applicabilityType in qualifier.qualifierApplicabilityTypes) {
defaultQualifiersByType[applicabilityType] = qualifier
wasUpdate = true
}
}
return if (!wasUpdate) defaultTypeQualifiers else JavaTypeQualifiersByElementType(defaultQualifiersByType)
}
fun FirJavaEnhancementContext.copyWithNewDefaultTypeQualifiers( fun FirJavaEnhancementContext.copyWithNewDefaultTypeQualifiers(
typeQualifierResolver: FirAnnotationTypeQualifierResolver, typeQualifierResolver: FirAnnotationTypeQualifierResolver,
javaTypeEnhancementState: JavaTypeEnhancementState,
additionalAnnotations: List<FirAnnotationCall> additionalAnnotations: List<FirAnnotationCall>
): FirJavaEnhancementContext = ): FirJavaEnhancementContext =
when { when {
additionalAnnotations.isEmpty() -> this additionalAnnotations.isEmpty() -> this
else -> FirJavaEnhancementContext(session) { else -> FirJavaEnhancementContext(session) {
computeNewDefaultTypeQualifiers(typeQualifierResolver, javaTypeEnhancementState, additionalAnnotations) typeQualifierResolver.extractAndMergeDefaultQualifiers(defaultTypeQualifiers, additionalAnnotations)
} }
} }
@@ -57,7 +57,7 @@ class FirSignatureEnhancement(
private val typeQualifierResolver = FirAnnotationTypeQualifierResolver(session, jsr305State) private val typeQualifierResolver = FirAnnotationTypeQualifierResolver(session, jsr305State)
private val context: FirJavaEnhancementContext = private val context: FirJavaEnhancementContext =
FirJavaEnhancementContext(session) { null }.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, owner.annotations) FirJavaEnhancementContext(session) { null }.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, owner.annotations)
private val enhancements = mutableMapOf<FirCallableSymbol<*>, FirCallableSymbol<*>>() private val enhancements = mutableMapOf<FirCallableSymbol<*>, FirCallableSymbol<*>>()
@@ -85,7 +85,7 @@ class FirSignatureEnhancement(
when (val firElement = original.fir) { when (val firElement = original.fir) {
is FirEnumEntry -> { is FirEnumEntry -> {
if (firElement.returnTypeRef !is FirJavaTypeRef) return original if (firElement.returnTypeRef !is FirJavaTypeRef) return original
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firElement.annotations) val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, firElement.annotations)
val predefinedInfo = val predefinedInfo =
PredefinedFunctionEnhancementInfo( PredefinedFunctionEnhancementInfo(
TypeEnhancementInfo(0 to JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, false)), TypeEnhancementInfo(0 to JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, false)),
@@ -100,7 +100,7 @@ class FirSignatureEnhancement(
} }
is FirField -> { is FirField -> {
if (firElement.returnTypeRef !is FirJavaTypeRef) return original if (firElement.returnTypeRef !is FirJavaTypeRef) return original
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firElement.annotations) val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, firElement.annotations)
val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), memberContext, null) val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), memberContext, null)
val symbol = FirFieldSymbol(original.callableId) val symbol = FirFieldSymbol(original.callableId)
@@ -176,7 +176,7 @@ class FirSignatureEnhancement(
methodId: CallableId, methodId: CallableId,
name: Name? name: Name?
): FirFunctionSymbol<*> { ): FirFunctionSymbol<*> {
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firMethod.annotations) val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, firMethod.annotations)
val predefinedEnhancementInfo = val predefinedEnhancementInfo =
SignatureBuildingComponents.signature( SignatureBuildingComponents.signature(
@@ -316,7 +316,7 @@ class FirSignatureEnhancement(
parameterContainer = ownerFunction, parameterContainer = ownerFunction,
methodContext = memberContext, methodContext = memberContext,
typeInSignature = TypeInSignature.Receiver typeInSignature = TypeInSignature.Receiver
).enhance(session, jsr305State) ).enhance(session)
return signatureParts.type return signatureParts.type
} }
@@ -340,7 +340,6 @@ class FirSignatureEnhancement(
typeInSignature = TypeInSignature.ValueParameter(hasReceiver, index) typeInSignature = TypeInSignature.ValueParameter(hasReceiver, index)
).enhance( ).enhance(
session, session,
jsr305State,
predefinedEnhancementInfo?.parametersInfo?.getOrNull(index), predefinedEnhancementInfo?.parametersInfo?.getOrNull(index),
forAnnotationMember = owner.classKind == ClassKind.ANNOTATION_CLASS forAnnotationMember = owner.classKind == ClassKind.ANNOTATION_CLASS
) )
@@ -363,8 +362,7 @@ class FirSignatureEnhancement(
else AnnotationQualifierApplicabilityType.METHOD_RETURN_TYPE, else AnnotationQualifierApplicabilityType.METHOD_RETURN_TYPE,
typeInSignature = TypeInSignature.Return typeInSignature = TypeInSignature.Return
).enhance( ).enhance(
session, jsr305State, predefinedEnhancementInfo?.returnTypeInfo, session, predefinedEnhancementInfo?.returnTypeInfo, forAnnotationMember = this.owner.classKind == ClassKind.ANNOTATION_CLASS
forAnnotationMember = this.owner.classKind == ClassKind.ANNOTATION_CLASS
) )
return signatureParts.type return signatureParts.type
} }
@@ -405,7 +403,7 @@ class FirSignatureEnhancement(
overriddenMembers, overriddenMembers,
parameterContainer, false, parameterContainer, false,
parameterContainer?.let { parameterContainer?.let {
methodContext.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, it.annotations) methodContext.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, it.annotations)
} ?: methodContext, } ?: methodContext,
AnnotationQualifierApplicabilityType.VALUE_PARAMETER, AnnotationQualifierApplicabilityType.VALUE_PARAMETER,
typeInSignature typeInSignature
@@ -432,7 +430,7 @@ class FirSignatureEnhancement(
isCovariant, isCovariant,
// recompute default type qualifiers using type annotations // recompute default type qualifiers using type annotations
containerContext.copyWithNewDefaultTypeQualifiers( containerContext.copyWithNewDefaultTypeQualifiers(
typeQualifierResolver, jsr305State, typeRef.annotations typeQualifierResolver, typeRef.annotations
), ),
containerApplicabilityType containerApplicabilityType
) )
@@ -1,20 +0,0 @@
/*
* Copyright 2010-2019 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.fir.java.enhancement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifierWithMigrationStatus
fun List<FirAnnotationCall>.extractNullability(
annotationTypeQualifierResolver: FirAnnotationTypeQualifierResolver
): NullabilityQualifierWithMigrationStatus? =
this.firstNotNullOfOrNull { it.extractNullability(annotationTypeQualifierResolver) }
fun FirAnnotationCall.extractNullability(
annotationTypeQualifierResolver: FirAnnotationTypeQualifierResolver
): NullabilityQualifierWithMigrationStatus? =
annotationTypeQualifierResolver.extractNullability(this) { false }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifierWithMi
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
typealias TypeQualifierWithApplicability<Annotation> = Pair<Annotation, Set<AnnotationQualifierApplicabilityType>> private typealias TypeQualifierWithApplicability<Annotation> = Pair<Annotation, Set<AnnotationQualifierApplicabilityType>>
abstract class AbstractAnnotationTypeQualifierResolver<Annotation : Any>( abstract class AbstractAnnotationTypeQualifierResolver<Annotation : Any>(
private val javaTypeEnhancementState: JavaTypeEnhancementState private val javaTypeEnhancementState: JavaTypeEnhancementState
@@ -43,7 +43,7 @@ abstract class AbstractAnnotationTypeQualifierResolver<Annotation : Any>(
} }
} }
fun resolveQualifierBuiltInDefaultAnnotation(annotation: Annotation): JavaDefaultQualifiers? { private fun resolveQualifierBuiltInDefaultAnnotation(annotation: Annotation): JavaDefaultQualifiers? {
if (javaTypeEnhancementState.disabledDefaultAnnotations) { if (javaTypeEnhancementState.disabledDefaultAnnotations) {
return null return null
} }
@@ -72,7 +72,7 @@ abstract class AbstractAnnotationTypeQualifierResolver<Annotation : Any>(
else else
this this
fun resolveTypeQualifierDefaultAnnotation(annotation: Annotation): TypeQualifierWithApplicability<Annotation>? { private fun resolveTypeQualifierDefaultAnnotation(annotation: Annotation): TypeQualifierWithApplicability<Annotation>? {
if (javaTypeEnhancementState.jsr305.isDisabled) return null if (javaTypeEnhancementState.jsr305.isDisabled) return null
val typeQualifierDefault = annotation.findAnnotation(TYPE_QUALIFIER_DEFAULT_FQNAME) ?: return null val typeQualifierDefault = annotation.findAnnotation(TYPE_QUALIFIER_DEFAULT_FQNAME) ?: return null
val typeQualifier = annotation.annotations.firstOrNull { resolveTypeQualifierAnnotation(it) != null } ?: return null val typeQualifier = annotation.annotations.firstOrNull { resolveTypeQualifierAnnotation(it) != null } ?: return null
@@ -87,12 +87,12 @@ abstract class AbstractAnnotationTypeQualifierResolver<Annotation : Any>(
return target.enumArguments(onlyValue = false).any { it == KotlinTarget.TYPE.name } return target.enumArguments(onlyValue = false).any { it == KotlinTarget.TYPE.name }
} }
fun resolveJsr305AnnotationState(annotation: Annotation): ReportLevel { private fun resolveJsr305AnnotationState(annotation: Annotation): ReportLevel {
resolveJsr305CustomState(annotation)?.let { return it } resolveJsr305CustomState(annotation)?.let { return it }
return javaTypeEnhancementState.jsr305.globalLevel return javaTypeEnhancementState.jsr305.globalLevel
} }
fun resolveJsr305CustomState(annotation: Annotation): ReportLevel? { private fun resolveJsr305CustomState(annotation: Annotation): ReportLevel? {
javaTypeEnhancementState.jsr305.userDefinedLevelForSpecificAnnotation[annotation.fqName]?.let { return it } javaTypeEnhancementState.jsr305.userDefinedLevelForSpecificAnnotation[annotation.fqName]?.let { return it }
val enumValue = annotation.findAnnotation(MIGRATION_ANNOTATION_FQNAME)?.enumArguments(onlyValue = false)?.firstOrNull() val enumValue = annotation.findAnnotation(MIGRATION_ANNOTATION_FQNAME)?.enumArguments(onlyValue = false)?.firstOrNull()
?: return null ?: return null
@@ -104,7 +104,9 @@ abstract class AbstractAnnotationTypeQualifierResolver<Annotation : Any>(
} }
} }
fun extractNullability(annotation: Annotation, forceWarning: Annotation.() -> Boolean): NullabilityQualifierWithMigrationStatus? { fun extractNullability(
annotation: Annotation, forceWarning: Annotation.() -> Boolean = { false }
): NullabilityQualifierWithMigrationStatus? {
knownNullability(annotation, annotation.forceWarning())?.let { return it } knownNullability(annotation, annotation.forceWarning())?.let { return it }
val typeQualifierAnnotation = resolveTypeQualifierAnnotation(annotation) ?: return null val typeQualifierAnnotation = resolveTypeQualifierAnnotation(annotation) ?: return null
@@ -115,6 +117,42 @@ abstract class AbstractAnnotationTypeQualifierResolver<Annotation : Any>(
?.copy(isForWarningOnly = jsr305State.isWarning) ?.copy(isForWarningOnly = jsr305State.isWarning)
} }
private fun extractDefaultQualifiers(annotation: Annotation): JavaDefaultQualifiers? {
resolveQualifierBuiltInDefaultAnnotation(annotation)?.let { return it }
val (typeQualifier, applicability) = resolveTypeQualifierDefaultAnnotation(annotation)
?: return null
val jsr305State = resolveJsr305CustomState(annotation) ?: resolveJsr305AnnotationState(typeQualifier)
if (jsr305State.isIgnore) return null
// TODO: since we override the warning status, whether we force it in `extractNullability` is irrelevant.
// However, this is probably not what was intended.
val nullabilityQualifier = extractNullability(typeQualifier) ?: return null
return JavaDefaultQualifiers(nullabilityQualifier.copy(isForWarningOnly = jsr305State.isWarning), applicability)
}
fun extractAndMergeDefaultQualifiers(
oldQualifiers: JavaTypeQualifiersByElementType?, annotations: Iterable<Annotation>
): JavaTypeQualifiersByElementType? {
if (javaTypeEnhancementState.disabledDefaultAnnotations) return oldQualifiers
val defaultQualifiers = annotations.mapNotNull { extractDefaultQualifiers(it) }
if (defaultQualifiers.isEmpty()) return oldQualifiers
val defaultQualifiersByType =
oldQualifiers?.defaultQualifiers?.let(::QualifierByApplicabilityType)
?: QualifierByApplicabilityType(AnnotationQualifierApplicabilityType::class.java)
var wasUpdate = false
for (qualifier in defaultQualifiers) {
for (applicabilityType in qualifier.qualifierApplicabilityTypes) {
defaultQualifiersByType[applicabilityType] = qualifier
wasUpdate = true
}
}
return if (!wasUpdate) oldQualifiers else JavaTypeQualifiersByElementType(defaultQualifiersByType)
}
private fun knownNullability(annotation: Annotation, forceWarning: Boolean): NullabilityQualifierWithMigrationStatus? { private fun knownNullability(annotation: Annotation, forceWarning: Boolean): NullabilityQualifierWithMigrationStatus? {
val fqName = annotation.fqName ?: return null val fqName = annotation.fqName ?: return null
val reportLevel = javaTypeEnhancementState.getReportLevelForAnnotation(fqName) val reportLevel = javaTypeEnhancementState.getReportLevelForAnnotation(fqName)
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.ClassOrPackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.SupertypeLoopChecker import org.jetbrains.kotlin.descriptors.SupertypeLoopChecker
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.* import org.jetbrains.kotlin.load.java.*
@@ -29,7 +28,6 @@ import org.jetbrains.kotlin.load.java.components.JavaPropertyInitializerEvaluato
import org.jetbrains.kotlin.load.java.components.JavaResolverCache import org.jetbrains.kotlin.load.java.components.JavaResolverCache
import org.jetbrains.kotlin.load.java.components.SignaturePropagator import org.jetbrains.kotlin.load.java.components.SignaturePropagator
import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeResolver import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeResolver
import org.jetbrains.kotlin.load.java.lazy.types.TypeParameterUpperBoundEraser
import org.jetbrains.kotlin.load.java.sources.JavaSourceElementFactory import org.jetbrains.kotlin.load.java.sources.JavaSourceElementFactory
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameterListOwner import org.jetbrains.kotlin.load.java.structure.JavaTypeParameterListOwner
import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement
@@ -131,55 +129,8 @@ fun LazyJavaResolverContext.child(
fun LazyJavaResolverContext.computeNewDefaultTypeQualifiers( fun LazyJavaResolverContext.computeNewDefaultTypeQualifiers(
additionalAnnotations: Annotations additionalAnnotations: Annotations
): JavaTypeQualifiersByElementType? { ): JavaTypeQualifiersByElementType? =
if (components.javaTypeEnhancementState.disabledDefaultAnnotations) return defaultTypeQualifiers components.annotationTypeQualifierResolver.extractAndMergeDefaultQualifiers(defaultTypeQualifiers, additionalAnnotations)
val defaultQualifiers =
additionalAnnotations.mapNotNull(this::extractDefaultNullabilityQualifier)
if (defaultQualifiers.isEmpty()) return defaultTypeQualifiers
val defaultQualifiersByType =
defaultTypeQualifiers?.defaultQualifiers?.let(::QualifierByApplicabilityType)
?: QualifierByApplicabilityType(AnnotationQualifierApplicabilityType::class.java)
var wasUpdate = false
for (qualifier in defaultQualifiers) {
for (applicabilityType in qualifier.qualifierApplicabilityTypes) {
defaultQualifiersByType[applicabilityType] = qualifier
wasUpdate = true
}
}
return if (!wasUpdate) defaultTypeQualifiers else JavaTypeQualifiersByElementType(defaultQualifiersByType)
}
private fun LazyJavaResolverContext.extractDefaultNullabilityQualifier(
annotationDescriptor: AnnotationDescriptor
): JavaDefaultQualifiers? {
val typeQualifierResolver = components.annotationTypeQualifierResolver
typeQualifierResolver.resolveQualifierBuiltInDefaultAnnotation(annotationDescriptor)?.let { return it }
val (typeQualifier, applicability) =
typeQualifierResolver.resolveTypeQualifierDefaultAnnotation(annotationDescriptor)
?: return null
val jsr305State = typeQualifierResolver.resolveJsr305CustomState(annotationDescriptor)
?: typeQualifierResolver.resolveJsr305AnnotationState(typeQualifier)
if (jsr305State.isIgnore) {
return null
}
val areImprovementsInStrictMode = components.settings.typeEnhancementImprovementsInStrictMode
// TODO: if `extractNullability` forces a warning for compatibility, this overrides that. Expected? Probably not.
val nullabilityQualifier =
components.signatureEnhancement.extractNullability(typeQualifier, areImprovementsInStrictMode, typeParameterBounds = false)
?.copy(isForWarningOnly = jsr305State.isWarning) ?: return null
return JavaDefaultQualifiers(nullabilityQualifier, applicability)
}
fun LazyJavaResolverContext.replaceComponents( fun LazyJavaResolverContext.replaceComponents(
components: JavaResolverComponents components: JavaResolverComponents