FIR/FE: extract common code for type qualifier defaults
This commit is contained in:
+6
-9
@@ -27,7 +27,6 @@ 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.load.java.JavaTypeEnhancementState
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
internal class EnhancementSignatureParts(
|
||||
@@ -49,11 +48,10 @@ internal class EnhancementSignatureParts(
|
||||
|
||||
internal fun enhance(
|
||||
session: FirSession,
|
||||
javaTypeEnhancementState: JavaTypeEnhancementState,
|
||||
predefined: TypeEnhancementInfo? = null,
|
||||
forAnnotationMember: Boolean = false
|
||||
): PartEnhancementResult {
|
||||
val qualifiers = computeIndexedQualifiersForOverride(session, javaTypeEnhancementState)
|
||||
val qualifiers = computeIndexedQualifiersForOverride(session)
|
||||
|
||||
val qualifiersWithPredefined = predefined?.let {
|
||||
IndexedJavaTypeQualifiers(qualifiers.size) { index ->
|
||||
@@ -95,13 +93,12 @@ internal class EnhancementSignatureParts(
|
||||
|
||||
private fun FirTypeRef.toIndexed(
|
||||
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
|
||||
javaTypeEnhancementState: JavaTypeEnhancementState,
|
||||
context: FirJavaEnhancementContext
|
||||
): List<TypeAndDefaultQualifiers> {
|
||||
val list = ArrayList<TypeAndDefaultQualifiers>(1)
|
||||
|
||||
fun add(type: FirTypeRef?) {
|
||||
val c = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, javaTypeEnhancementState, type?.annotations.orEmpty())
|
||||
val c = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, type?.annotations.orEmpty())
|
||||
|
||||
list.add(
|
||||
TypeAndDefaultQualifiers(
|
||||
@@ -206,7 +203,7 @@ internal class EnhancementSignatureParts(
|
||||
else
|
||||
defaultQualifiersForType
|
||||
|
||||
val nullabilityInfo = composedAnnotation.extractNullability(typeQualifierResolver).also {
|
||||
val nullabilityInfo = composedAnnotation.firstNotNullOfOrNull { typeQualifierResolver.extractNullability(it) }.also {
|
||||
if (it?.qualifier == NullabilityQualifier.NOT_NULL) {
|
||||
attributesCache[this] = composedAnnotation.computeTypeAttributesForJavaType()
|
||||
}
|
||||
@@ -284,9 +281,9 @@ internal class EnhancementSignatureParts(
|
||||
)
|
||||
}
|
||||
|
||||
private fun computeIndexedQualifiersForOverride(session: FirSession, javaTypeEnhancementState: JavaTypeEnhancementState): IndexedJavaTypeQualifiers {
|
||||
val indexedFromSupertypes = fromOverridden.map { it.toIndexed(typeQualifierResolver, javaTypeEnhancementState, context) }
|
||||
val indexedThisType = current.toIndexed(typeQualifierResolver, javaTypeEnhancementState, context)
|
||||
private fun computeIndexedQualifiersForOverride(session: FirSession): IndexedJavaTypeQualifiers {
|
||||
val indexedFromSupertypes = fromOverridden.map { it.toIndexed(typeQualifierResolver, 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
|
||||
// is declared to extend Super<T>, and propagating data here is highly non-trivial, so we only look at the head type constructor
|
||||
|
||||
+1
-54
@@ -19,66 +19,13 @@ class FirJavaEnhancementContext private constructor(
|
||||
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(
|
||||
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
|
||||
javaTypeEnhancementState: JavaTypeEnhancementState,
|
||||
additionalAnnotations: List<FirAnnotationCall>
|
||||
): FirJavaEnhancementContext =
|
||||
when {
|
||||
additionalAnnotations.isEmpty() -> this
|
||||
else -> FirJavaEnhancementContext(session) {
|
||||
computeNewDefaultTypeQualifiers(typeQualifierResolver, javaTypeEnhancementState, additionalAnnotations)
|
||||
typeQualifierResolver.extractAndMergeDefaultQualifiers(defaultTypeQualifiers, additionalAnnotations)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-10
@@ -57,7 +57,7 @@ class FirSignatureEnhancement(
|
||||
private val typeQualifierResolver = FirAnnotationTypeQualifierResolver(session, jsr305State)
|
||||
|
||||
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<*>>()
|
||||
|
||||
@@ -85,7 +85,7 @@ class FirSignatureEnhancement(
|
||||
when (val firElement = original.fir) {
|
||||
is FirEnumEntry -> {
|
||||
if (firElement.returnTypeRef !is FirJavaTypeRef) return original
|
||||
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firElement.annotations)
|
||||
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, firElement.annotations)
|
||||
val predefinedInfo =
|
||||
PredefinedFunctionEnhancementInfo(
|
||||
TypeEnhancementInfo(0 to JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, false)),
|
||||
@@ -100,7 +100,7 @@ class FirSignatureEnhancement(
|
||||
}
|
||||
is FirField -> {
|
||||
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 symbol = FirFieldSymbol(original.callableId)
|
||||
@@ -176,7 +176,7 @@ class FirSignatureEnhancement(
|
||||
methodId: CallableId,
|
||||
name: Name?
|
||||
): FirFunctionSymbol<*> {
|
||||
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firMethod.annotations)
|
||||
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, firMethod.annotations)
|
||||
|
||||
val predefinedEnhancementInfo =
|
||||
SignatureBuildingComponents.signature(
|
||||
@@ -316,7 +316,7 @@ class FirSignatureEnhancement(
|
||||
parameterContainer = ownerFunction,
|
||||
methodContext = memberContext,
|
||||
typeInSignature = TypeInSignature.Receiver
|
||||
).enhance(session, jsr305State)
|
||||
).enhance(session)
|
||||
return signatureParts.type
|
||||
}
|
||||
|
||||
@@ -340,7 +340,6 @@ class FirSignatureEnhancement(
|
||||
typeInSignature = TypeInSignature.ValueParameter(hasReceiver, index)
|
||||
).enhance(
|
||||
session,
|
||||
jsr305State,
|
||||
predefinedEnhancementInfo?.parametersInfo?.getOrNull(index),
|
||||
forAnnotationMember = owner.classKind == ClassKind.ANNOTATION_CLASS
|
||||
)
|
||||
@@ -363,8 +362,7 @@ class FirSignatureEnhancement(
|
||||
else AnnotationQualifierApplicabilityType.METHOD_RETURN_TYPE,
|
||||
typeInSignature = TypeInSignature.Return
|
||||
).enhance(
|
||||
session, jsr305State, predefinedEnhancementInfo?.returnTypeInfo,
|
||||
forAnnotationMember = this.owner.classKind == ClassKind.ANNOTATION_CLASS
|
||||
session, predefinedEnhancementInfo?.returnTypeInfo, forAnnotationMember = this.owner.classKind == ClassKind.ANNOTATION_CLASS
|
||||
)
|
||||
return signatureParts.type
|
||||
}
|
||||
@@ -405,7 +403,7 @@ class FirSignatureEnhancement(
|
||||
overriddenMembers,
|
||||
parameterContainer, false,
|
||||
parameterContainer?.let {
|
||||
methodContext.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, it.annotations)
|
||||
methodContext.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, it.annotations)
|
||||
} ?: methodContext,
|
||||
AnnotationQualifierApplicabilityType.VALUE_PARAMETER,
|
||||
typeInSignature
|
||||
@@ -432,7 +430,7 @@ class FirSignatureEnhancement(
|
||||
isCovariant,
|
||||
// recompute default type qualifiers using type annotations
|
||||
containerContext.copyWithNewDefaultTypeQualifiers(
|
||||
typeQualifierResolver, jsr305State, typeRef.annotations
|
||||
typeQualifierResolver, typeRef.annotations
|
||||
),
|
||||
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 }
|
||||
Reference in New Issue
Block a user