Prepare type enhancement for codeanalysis annotations
- Rename NullabilityQualifierWithApplicability -> JavaDefaultQualifiers - Use JavaDefaultQualifiers instead of JavaTypeQualifiers for default qualifiers This change is intended to make code more clear and to allow add some additional parameters specific for default qualifiers needed for codeanalysis annotations
This commit is contained in:
committed by
Victor Petukhov
parent
e27501497b
commit
fa2578c795
+6
-5
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
|||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||||
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType
|
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType
|
||||||
|
import org.jetbrains.kotlin.load.java.JavaDefaultQualifiers
|
||||||
import org.jetbrains.kotlin.load.java.MUTABLE_ANNOTATIONS
|
import org.jetbrains.kotlin.load.java.MUTABLE_ANNOTATIONS
|
||||||
import org.jetbrains.kotlin.load.java.READ_ONLY_ANNOTATIONS
|
import org.jetbrains.kotlin.load.java.READ_ONLY_ANNOTATIONS
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaClassifierType
|
import org.jetbrains.kotlin.load.java.structure.JavaClassifierType
|
||||||
@@ -180,7 +181,7 @@ internal class EnhancementSignatureParts(
|
|||||||
|
|
||||||
private fun FirTypeRef?.extractQualifiersFromAnnotations(
|
private fun FirTypeRef?.extractQualifiersFromAnnotations(
|
||||||
isHeadTypeConstructor: Boolean,
|
isHeadTypeConstructor: Boolean,
|
||||||
defaultQualifiersForType: JavaTypeQualifiers?,
|
defaultQualifiersForType: JavaDefaultQualifiers?,
|
||||||
jsr305State: Jsr305State
|
jsr305State: Jsr305State
|
||||||
): JavaTypeQualifiers {
|
): JavaTypeQualifiers {
|
||||||
val composedAnnotation =
|
val composedAnnotation =
|
||||||
@@ -204,10 +205,10 @@ internal class EnhancementSignatureParts(
|
|||||||
defaultQualifiersForType
|
defaultQualifiersForType
|
||||||
|
|
||||||
val nullabilityInfo = composedAnnotation.extractNullability(typeQualifierResolver, jsr305State)
|
val nullabilityInfo = composedAnnotation.extractNullability(typeQualifierResolver, jsr305State)
|
||||||
?: defaultTypeQualifier?.nullability?.let { nullability ->
|
?: defaultTypeQualifier?.nullabilityQualifier?.let { nullability ->
|
||||||
NullabilityQualifierWithMigrationStatus(
|
NullabilityQualifierWithMigrationStatus(
|
||||||
nullability,
|
nullability.qualifier,
|
||||||
defaultTypeQualifier.isNullabilityQualifierForWarning
|
nullability.isForWarningOnly
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +234,7 @@ internal class EnhancementSignatureParts(
|
|||||||
private fun FirTypeRef?.computeQualifiersForOverride(
|
private fun FirTypeRef?.computeQualifiersForOverride(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
fromSupertypes: Collection<FirTypeRef>,
|
fromSupertypes: Collection<FirTypeRef>,
|
||||||
defaultQualifiersForType: JavaTypeQualifiers?,
|
defaultQualifiersForType: JavaDefaultQualifiers?,
|
||||||
isHeadTypeConstructor: Boolean,
|
isHeadTypeConstructor: Boolean,
|
||||||
jsr305State: Jsr305State
|
jsr305State: Jsr305State
|
||||||
): JavaTypeQualifiers {
|
): JavaTypeQualifiers {
|
||||||
|
|||||||
+5
-3
@@ -63,15 +63,17 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat
|
|||||||
return resolveTypeQualifierNickname(annotationClass)
|
return resolveTypeQualifierNickname(annotationClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resolveQualifierBuiltInDefaultAnnotation(annotationCall: FirAnnotationCall): NullabilityQualifierWithApplicability? {
|
fun resolveQualifierBuiltInDefaultAnnotation(annotationCall: FirAnnotationCall): JavaDefaultQualifiers? {
|
||||||
if (jsr305State.disabled) {
|
if (jsr305State.disabled) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
val annotationClassId = annotationCall.classId
|
val annotationClassId = annotationCall.classId
|
||||||
return BUILT_IN_TYPE_QUALIFIER_DEFAULT_ANNOTATION_IDS[annotationClassId]?.let { (qualifier, applicability) ->
|
return BUILT_IN_TYPE_QUALIFIER_DEFAULT_ANNOTATION_IDS[annotationClassId]?.let { qualifierForDefaultingAnnotation ->
|
||||||
val state = resolveJsr305ReportLevel(annotationCall).takeIf { it != ReportLevel.IGNORE } ?: return null
|
val state = resolveJsr305ReportLevel(annotationCall).takeIf { it != ReportLevel.IGNORE } ?: return null
|
||||||
return NullabilityQualifierWithApplicability(qualifier.copy(isForWarningOnly = state.isWarning), applicability)
|
return qualifierForDefaultingAnnotation.copy(
|
||||||
|
nullabilityQualifier = qualifierForDefaultingAnnotation.nullabilityQualifier.copy(isForWarningOnly = state.isWarning)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-10
@@ -26,7 +26,7 @@ fun extractDefaultNullabilityQualifier(
|
|||||||
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
|
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
|
||||||
jsr305State: Jsr305State,
|
jsr305State: Jsr305State,
|
||||||
annotationCall: FirAnnotationCall
|
annotationCall: FirAnnotationCall
|
||||||
): NullabilityQualifierWithApplicability? {
|
): JavaDefaultQualifiers? {
|
||||||
typeQualifierResolver.resolveQualifierBuiltInDefaultAnnotation(annotationCall)?.let { return it }
|
typeQualifierResolver.resolveQualifierBuiltInDefaultAnnotation(annotationCall)?.let { return it }
|
||||||
|
|
||||||
val (typeQualifier, applicability) =
|
val (typeQualifier, applicability) =
|
||||||
@@ -45,7 +45,7 @@ fun extractDefaultNullabilityQualifier(
|
|||||||
typeQualifierResolver, jsr305State
|
typeQualifierResolver, jsr305State
|
||||||
)?.copy(isForWarningOnly = jsr305ReportLevel.isWarning) ?: return null
|
)?.copy(isForWarningOnly = jsr305ReportLevel.isWarning) ?: return null
|
||||||
|
|
||||||
return NullabilityQualifierWithApplicability(nullabilityQualifier, applicability)
|
return JavaDefaultQualifiers(nullabilityQualifier, applicability)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirJavaEnhancementContext.computeNewDefaultTypeQualifiers(
|
fun FirJavaEnhancementContext.computeNewDefaultTypeQualifiers(
|
||||||
@@ -55,7 +55,7 @@ fun FirJavaEnhancementContext.computeNewDefaultTypeQualifiers(
|
|||||||
): JavaTypeQualifiersByElementType? {
|
): JavaTypeQualifiersByElementType? {
|
||||||
if (typeQualifierResolver.disabled) return defaultTypeQualifiers
|
if (typeQualifierResolver.disabled) return defaultTypeQualifiers
|
||||||
|
|
||||||
val nullabilityQualifiersWithApplicability =
|
val defaultQualifiers =
|
||||||
additionalAnnotations.mapNotNull { annotationCall ->
|
additionalAnnotations.mapNotNull { annotationCall ->
|
||||||
extractDefaultNullabilityQualifier(
|
extractDefaultNullabilityQualifier(
|
||||||
typeQualifierResolver,
|
typeQualifierResolver,
|
||||||
@@ -64,21 +64,21 @@ fun FirJavaEnhancementContext.computeNewDefaultTypeQualifiers(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nullabilityQualifiersWithApplicability.isEmpty()) return defaultTypeQualifiers
|
if (defaultQualifiers.isEmpty()) return defaultTypeQualifiers
|
||||||
|
|
||||||
val nullabilityQualifiersByType =
|
val defaultQualifiersByType =
|
||||||
defaultTypeQualifiers?.nullabilityQualifiers?.let(::QualifierByApplicabilityType)
|
defaultTypeQualifiers?.defaultQualifiers?.let(::QualifierByApplicabilityType)
|
||||||
?: QualifierByApplicabilityType(AnnotationQualifierApplicabilityType::class.java)
|
?: QualifierByApplicabilityType(AnnotationQualifierApplicabilityType::class.java)
|
||||||
|
|
||||||
var wasUpdate = false
|
var wasUpdate = false
|
||||||
for ((nullability, applicableTo) in nullabilityQualifiersWithApplicability) {
|
for (qualifier in defaultQualifiers) {
|
||||||
for (applicabilityType in applicableTo) {
|
for (applicabilityType in qualifier.qualifierApplicabilityTypes) {
|
||||||
nullabilityQualifiersByType[applicabilityType] = nullability
|
defaultQualifiersByType[applicabilityType] = qualifier
|
||||||
wasUpdate = true
|
wasUpdate = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (!wasUpdate) defaultTypeQualifiers else JavaTypeQualifiersByElementType(nullabilityQualifiersByType)
|
return if (!wasUpdate) defaultTypeQualifiers else JavaTypeQualifiersByElementType(defaultQualifiersByType)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirJavaEnhancementContext.copyWithNewDefaultTypeQualifiers(
|
fun FirJavaEnhancementContext.copyWithNewDefaultTypeQualifiers(
|
||||||
|
|||||||
@@ -13,6 +13,14 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
|
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
|
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
|
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
|
||||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||||
@@ -25,6 +33,7 @@ import org.jetbrains.kotlin.fir.typeContext
|
|||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||||
|
import org.jetbrains.kotlin.load.java.JavaDefaultQualifiers
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_NULL_FQ_NAME
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_NULL_FQ_NAME
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_VALUE_FQ_NAME
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_VALUE_FQ_NAME
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.AnnotationDefaultValue
|
import org.jetbrains.kotlin.load.java.descriptors.AnnotationDefaultValue
|
||||||
@@ -243,7 +252,7 @@ private fun ConeClassifierLookupTag.enhanceMutability(
|
|||||||
|
|
||||||
internal data class TypeAndDefaultQualifiers(
|
internal data class TypeAndDefaultQualifiers(
|
||||||
val type: FirTypeRef?, // null denotes '*' here
|
val type: FirTypeRef?, // null denotes '*' here
|
||||||
val defaultQualifiers: JavaTypeQualifiers?
|
val defaultQualifiers: JavaDefaultQualifiers?
|
||||||
)
|
)
|
||||||
|
|
||||||
internal fun FirTypeRef.typeArguments(): List<FirTypeProjection> =
|
internal fun FirTypeRef.typeArguments(): List<FirTypeProjection> =
|
||||||
|
|||||||
+10
-5
@@ -9,6 +9,11 @@ import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifier
|
|||||||
import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifierWithMigrationStatus
|
import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifierWithMigrationStatus
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
|
data class JavaDefaultQualifiers(
|
||||||
|
val nullabilityQualifier: NullabilityQualifierWithMigrationStatus,
|
||||||
|
val qualifierApplicabilityTypes: Collection<AnnotationQualifierApplicabilityType>
|
||||||
|
)
|
||||||
|
|
||||||
val TYPE_QUALIFIER_NICKNAME_FQNAME = FqName("javax.annotation.meta.TypeQualifierNickname")
|
val TYPE_QUALIFIER_NICKNAME_FQNAME = FqName("javax.annotation.meta.TypeQualifierNickname")
|
||||||
val TYPE_QUALIFIER_FQNAME = FqName("javax.annotation.meta.TypeQualifier")
|
val TYPE_QUALIFIER_FQNAME = FqName("javax.annotation.meta.TypeQualifier")
|
||||||
val TYPE_QUALIFIER_DEFAULT_FQNAME = FqName("javax.annotation.meta.TypeQualifierDefault")
|
val TYPE_QUALIFIER_DEFAULT_FQNAME = FqName("javax.annotation.meta.TypeQualifierDefault")
|
||||||
@@ -24,25 +29,25 @@ val DEFAULT_JSPECIFY_APPLICABILITY = listOf(
|
|||||||
|
|
||||||
val BUILT_IN_TYPE_QUALIFIER_DEFAULT_ANNOTATIONS = mapOf(
|
val BUILT_IN_TYPE_QUALIFIER_DEFAULT_ANNOTATIONS = mapOf(
|
||||||
FqName("javax.annotation.ParametersAreNullableByDefault") to
|
FqName("javax.annotation.ParametersAreNullableByDefault") to
|
||||||
NullabilityQualifierWithApplicability(
|
JavaDefaultQualifiers(
|
||||||
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE),
|
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE),
|
||||||
listOf(AnnotationQualifierApplicabilityType.VALUE_PARAMETER)
|
listOf(AnnotationQualifierApplicabilityType.VALUE_PARAMETER)
|
||||||
),
|
),
|
||||||
FqName("javax.annotation.ParametersAreNonnullByDefault") to
|
FqName("javax.annotation.ParametersAreNonnullByDefault") to
|
||||||
NullabilityQualifierWithApplicability(
|
JavaDefaultQualifiers(
|
||||||
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL),
|
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL),
|
||||||
listOf(AnnotationQualifierApplicabilityType.VALUE_PARAMETER)
|
listOf(AnnotationQualifierApplicabilityType.VALUE_PARAMETER)
|
||||||
),
|
),
|
||||||
|
|
||||||
JSPECIFY_DEFAULT_NULLABLE to NullabilityQualifierWithApplicability(
|
JSPECIFY_DEFAULT_NULLABLE to JavaDefaultQualifiers(
|
||||||
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE),
|
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE),
|
||||||
DEFAULT_JSPECIFY_APPLICABILITY
|
DEFAULT_JSPECIFY_APPLICABILITY
|
||||||
),
|
),
|
||||||
JSPECIFY_DEFAULT_NOT_NULL to NullabilityQualifierWithApplicability(
|
JSPECIFY_DEFAULT_NOT_NULL to JavaDefaultQualifiers(
|
||||||
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL),
|
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL),
|
||||||
DEFAULT_JSPECIFY_APPLICABILITY
|
DEFAULT_JSPECIFY_APPLICABILITY
|
||||||
),
|
),
|
||||||
JSPECIFY_DEFAULT_NULLNESS_UNKNOWN to NullabilityQualifierWithApplicability(
|
JSPECIFY_DEFAULT_NULLNESS_UNKNOWN to JavaDefaultQualifiers(
|
||||||
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.FORCE_FLEXIBILITY),
|
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.FORCE_FLEXIBILITY),
|
||||||
DEFAULT_JSPECIFY_APPLICABILITY
|
DEFAULT_JSPECIFY_APPLICABILITY
|
||||||
)
|
)
|
||||||
|
|||||||
+8
-13
@@ -5,20 +5,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.load.java
|
package org.jetbrains.kotlin.load.java
|
||||||
|
|
||||||
import org.jetbrains.kotlin.load.java.typeEnhancement.JavaTypeQualifiers
|
|
||||||
import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifierWithMigrationStatus
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
typealias QualifierByApplicabilityType = EnumMap<AnnotationQualifierApplicabilityType, NullabilityQualifierWithMigrationStatus?>
|
typealias QualifierByApplicabilityType =
|
||||||
|
EnumMap<AnnotationQualifierApplicabilityType, JavaDefaultQualifiers?>
|
||||||
|
|
||||||
class JavaTypeQualifiersByElementType(val nullabilityQualifiers: QualifierByApplicabilityType) {
|
class JavaTypeQualifiersByElementType(val defaultQualifiers: QualifierByApplicabilityType) {
|
||||||
operator fun get(applicabilityType: AnnotationQualifierApplicabilityType?): JavaTypeQualifiers? {
|
operator fun get(
|
||||||
val nullabilityQualifierWithMigrationStatus = nullabilityQualifiers[applicabilityType] ?: return null
|
applicabilityType: AnnotationQualifierApplicabilityType?
|
||||||
|
): JavaDefaultQualifiers? {
|
||||||
return JavaTypeQualifiers(
|
return defaultQualifiers[applicabilityType]
|
||||||
nullabilityQualifierWithMigrationStatus.qualifier, null,
|
|
||||||
isNotNullTypeParameter = false,
|
|
||||||
isNullabilityQualifierForWarning = nullabilityQualifierWithMigrationStatus.isForWarningOnly
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+5
-3
@@ -78,14 +78,16 @@ class AnnotationTypeQualifierResolver(storageManager: StorageManager, private va
|
|||||||
return resolveTypeQualifierNickname(annotationClass)
|
return resolveTypeQualifierNickname(annotationClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resolveQualifierBuiltInDefaultAnnotation(annotationDescriptor: AnnotationDescriptor): NullabilityQualifierWithApplicability? {
|
fun resolveQualifierBuiltInDefaultAnnotation(annotationDescriptor: AnnotationDescriptor): JavaDefaultQualifiers? {
|
||||||
if (jsr305State.disabled) {
|
if (jsr305State.disabled) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
return BUILT_IN_TYPE_QUALIFIER_DEFAULT_ANNOTATIONS[annotationDescriptor.fqName]?.let { (qualifier, applicability) ->
|
return BUILT_IN_TYPE_QUALIFIER_DEFAULT_ANNOTATIONS[annotationDescriptor.fqName]?.let { qualifierForDefaultingAnnotation ->
|
||||||
val state = resolveJsr305AnnotationState(annotationDescriptor).takeIf { it != ReportLevel.IGNORE } ?: return null
|
val state = resolveJsr305AnnotationState(annotationDescriptor).takeIf { it != ReportLevel.IGNORE } ?: return null
|
||||||
return NullabilityQualifierWithApplicability(qualifier.copy(isForWarningOnly = state.isWarning), applicability)
|
return qualifierForDefaultingAnnotation.copy(
|
||||||
|
nullabilityQualifier = qualifierForDefaultingAnnotation.nullabilityQualifier.copy(isForWarningOnly = state.isWarning)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ 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.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.NullabilityQualifier
|
||||||
|
import org.jetbrains.kotlin.load.java.typeEnhancement.NullabilityQualifierWithMigrationStatus
|
||||||
import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement
|
import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement
|
||||||
import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver
|
import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
|
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
|
||||||
@@ -39,6 +41,7 @@ import org.jetbrains.kotlin.resolve.sam.SamConversionResolver
|
|||||||
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
|
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
|
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
class JavaResolverComponents(
|
class JavaResolverComponents(
|
||||||
val storageManager: StorageManager,
|
val storageManager: StorageManager,
|
||||||
@@ -129,29 +132,29 @@ fun LazyJavaResolverContext.computeNewDefaultTypeQualifiers(
|
|||||||
): JavaTypeQualifiersByElementType? {
|
): JavaTypeQualifiersByElementType? {
|
||||||
if (components.annotationTypeQualifierResolver.disabled) return defaultTypeQualifiers
|
if (components.annotationTypeQualifierResolver.disabled) return defaultTypeQualifiers
|
||||||
|
|
||||||
val nullabilityQualifiersWithApplicability =
|
val defaultQualifiers =
|
||||||
additionalAnnotations.mapNotNull(this::extractDefaultNullabilityQualifier)
|
additionalAnnotations.mapNotNull(this::extractDefaultNullabilityQualifier)
|
||||||
|
|
||||||
if (nullabilityQualifiersWithApplicability.isEmpty()) return defaultTypeQualifiers
|
if (defaultQualifiers.isEmpty()) return defaultTypeQualifiers
|
||||||
|
|
||||||
val nullabilityQualifiersByType =
|
val defaultQualifiersByType =
|
||||||
defaultTypeQualifiers?.nullabilityQualifiers?.let(::QualifierByApplicabilityType)
|
defaultTypeQualifiers?.defaultQualifiers?.let(::QualifierByApplicabilityType)
|
||||||
?: QualifierByApplicabilityType(AnnotationQualifierApplicabilityType::class.java)
|
?: QualifierByApplicabilityType(AnnotationQualifierApplicabilityType::class.java)
|
||||||
|
|
||||||
var wasUpdate = false
|
var wasUpdate = false
|
||||||
for ((nullability, applicableTo) in nullabilityQualifiersWithApplicability) {
|
for (qualifier in defaultQualifiers) {
|
||||||
for (applicabilityType in applicableTo) {
|
for (applicabilityType in qualifier.qualifierApplicabilityTypes) {
|
||||||
nullabilityQualifiersByType[applicabilityType] = nullability
|
defaultQualifiersByType[applicabilityType] = qualifier
|
||||||
wasUpdate = true
|
wasUpdate = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (!wasUpdate) defaultTypeQualifiers else JavaTypeQualifiersByElementType(nullabilityQualifiersByType)
|
return if (!wasUpdate) defaultTypeQualifiers else JavaTypeQualifiersByElementType(defaultQualifiersByType)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun LazyJavaResolverContext.extractDefaultNullabilityQualifier(
|
private fun LazyJavaResolverContext.extractDefaultNullabilityQualifier(
|
||||||
annotationDescriptor: AnnotationDescriptor
|
annotationDescriptor: AnnotationDescriptor
|
||||||
): NullabilityQualifierWithApplicability? {
|
): JavaDefaultQualifiers? {
|
||||||
val typeQualifierResolver = components.annotationTypeQualifierResolver
|
val typeQualifierResolver = components.annotationTypeQualifierResolver
|
||||||
typeQualifierResolver.resolveQualifierBuiltInDefaultAnnotation(annotationDescriptor)?.let { return it }
|
typeQualifierResolver.resolveQualifierBuiltInDefaultAnnotation(annotationDescriptor)?.let { return it }
|
||||||
|
|
||||||
@@ -173,7 +176,7 @@ private fun LazyJavaResolverContext.extractDefaultNullabilityQualifier(
|
|||||||
?.copy(isForWarningOnly = jsr305State.isWarning)
|
?.copy(isForWarningOnly = jsr305State.isWarning)
|
||||||
?: return null
|
?: return null
|
||||||
|
|
||||||
return NullabilityQualifierWithApplicability(nullabilityQualifier, applicability)
|
return JavaDefaultQualifiers(nullabilityQualifier, applicability)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LazyJavaResolverContext.replaceComponents(
|
fun LazyJavaResolverContext.replaceComponents(
|
||||||
|
|||||||
+10
-10
@@ -236,7 +236,7 @@ class SignatureEnhancement(
|
|||||||
return bounds.map { bound ->
|
return bounds.map { bound ->
|
||||||
SignatureParts(
|
SignatureParts(
|
||||||
typeParameter, bound, emptyList(), false, context,
|
typeParameter, bound, emptyList(), false, context,
|
||||||
AnnotationTypeQualifierResolver.QualifierApplicabilityType.TYPE_PARAMETER_BOUNDS,
|
AnnotationQualifierApplicabilityType.TYPE_PARAMETER_BOUNDS,
|
||||||
typeParameterBounds = true
|
typeParameterBounds = true
|
||||||
).enhance().type
|
).enhance().type
|
||||||
}
|
}
|
||||||
@@ -258,7 +258,7 @@ class SignatureEnhancement(
|
|||||||
private val fromOverridden: Collection<KotlinType>,
|
private val fromOverridden: Collection<KotlinType>,
|
||||||
private val isCovariant: Boolean,
|
private val isCovariant: Boolean,
|
||||||
private val containerContext: LazyJavaResolverContext,
|
private val containerContext: LazyJavaResolverContext,
|
||||||
private val containerApplicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType,
|
private val containerApplicabilityType: AnnotationQualifierApplicabilityType,
|
||||||
private val typeParameterBounds: Boolean = false
|
private val typeParameterBounds: Boolean = false
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@@ -311,7 +311,7 @@ class SignatureEnhancement(
|
|||||||
|
|
||||||
private fun KotlinType.extractQualifiersFromAnnotations(
|
private fun KotlinType.extractQualifiersFromAnnotations(
|
||||||
isHeadTypeConstructor: Boolean,
|
isHeadTypeConstructor: Boolean,
|
||||||
defaultQualifiersForType: JavaTypeQualifiers?
|
defaultQualifiersForType: JavaDefaultQualifiers?
|
||||||
): JavaTypeQualifiers {
|
): JavaTypeQualifiers {
|
||||||
val composedAnnotation =
|
val composedAnnotation =
|
||||||
if (isHeadTypeConstructor && typeContainer != null)
|
if (isHeadTypeConstructor && typeContainer != null)
|
||||||
@@ -332,10 +332,10 @@ class SignatureEnhancement(
|
|||||||
|
|
||||||
val nullabilityInfo =
|
val nullabilityInfo =
|
||||||
composedAnnotation.extractNullability()
|
composedAnnotation.extractNullability()
|
||||||
?: defaultTypeQualifier?.nullability?.let {
|
?: defaultTypeQualifier?.nullabilityQualifier?.let { nullabilityQualifierWithMigrationStatus ->
|
||||||
NullabilityQualifierWithMigrationStatus(
|
NullabilityQualifierWithMigrationStatus(
|
||||||
defaultTypeQualifier.nullability!!,
|
nullabilityQualifierWithMigrationStatus.qualifier,
|
||||||
defaultTypeQualifier.isNullabilityQualifierForWarning
|
nullabilityQualifierWithMigrationStatus.isForWarningOnly
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,9 +397,9 @@ class SignatureEnhancement(
|
|||||||
c.defaultTypeQualifiers
|
c.defaultTypeQualifiers
|
||||||
?.get(
|
?.get(
|
||||||
if (typeParameterBounds)
|
if (typeParameterBounds)
|
||||||
AnnotationTypeQualifierResolver.QualifierApplicabilityType.TYPE_PARAMETER_BOUNDS
|
AnnotationQualifierApplicabilityType.TYPE_PARAMETER_BOUNDS
|
||||||
else
|
else
|
||||||
AnnotationTypeQualifierResolver.QualifierApplicabilityType.TYPE_USE
|
AnnotationQualifierApplicabilityType.TYPE_USE
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -420,7 +420,7 @@ class SignatureEnhancement(
|
|||||||
|
|
||||||
private fun KotlinType.computeQualifiersForOverride(
|
private fun KotlinType.computeQualifiersForOverride(
|
||||||
fromSupertypes: Collection<KotlinType>,
|
fromSupertypes: Collection<KotlinType>,
|
||||||
defaultQualifiersForType: JavaTypeQualifiers?,
|
defaultQualifiersForType: JavaDefaultQualifiers?,
|
||||||
isHeadTypeConstructor: Boolean
|
isHeadTypeConstructor: Boolean
|
||||||
): JavaTypeQualifiers {
|
): JavaTypeQualifiers {
|
||||||
val superQualifiers = fromSupertypes.map { it.extractQualifiers() }
|
val superQualifiers = fromSupertypes.map { it.extractQualifiers() }
|
||||||
@@ -514,5 +514,5 @@ class SignatureEnhancement(
|
|||||||
|
|
||||||
private data class TypeAndDefaultQualifiers(
|
private data class TypeAndDefaultQualifiers(
|
||||||
val type: KotlinType,
|
val type: KotlinType,
|
||||||
val defaultQualifiers: JavaTypeQualifiers?
|
val defaultQualifiers: JavaDefaultQualifiers?
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user