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
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.ClassOrPackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.SupertypeLoopChecker
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.incremental.components.LookupTracker
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.SignaturePropagator
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.structure.JavaTypeParameterListOwner
import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement
@@ -131,55 +129,8 @@ fun LazyJavaResolverContext.child(
fun LazyJavaResolverContext.computeNewDefaultTypeQualifiers(
additionalAnnotations: Annotations
): JavaTypeQualifiersByElementType? {
if (components.javaTypeEnhancementState.disabledDefaultAnnotations) return defaultTypeQualifiers
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)
}
): JavaTypeQualifiersByElementType? =
components.annotationTypeQualifierResolver.extractAndMergeDefaultQualifiers(defaultTypeQualifiers, additionalAnnotations)
fun LazyJavaResolverContext.replaceComponents(
components: JavaResolverComponents