Support type enhancement on freshly supported module level annotations

^KT-45189 Fixed
This commit is contained in:
Victor Petukhov
2021-04-15 15:09:02 +03:00
parent bc5e92033b
commit b9536a25d6
53 changed files with 1781 additions and 93 deletions
@@ -19,10 +19,7 @@ package org.jetbrains.kotlin.load.java.typeEnhancement
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMapper
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.annotations.composeAnnotations
import org.jetbrains.kotlin.descriptors.annotations.*
import org.jetbrains.kotlin.load.java.*
import org.jetbrains.kotlin.load.java.descriptors.*
import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext
@@ -36,8 +33,7 @@ import org.jetbrains.kotlin.load.kotlin.signature
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.constants.EnumValue
import org.jetbrains.kotlin.resolve.deprecation.DEPRECATED_FUNCTION_KEY
import org.jetbrains.kotlin.resolve.descriptorUtil.firstArgument
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
import org.jetbrains.kotlin.resolve.descriptorUtil.*
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.typeUtil.contains
@@ -152,6 +148,18 @@ class SignatureEnhancement(
}
}
private fun <D : CallableMemberDescriptor> D.getDefaultAnnotations(c: LazyJavaResolverContext): Annotations {
val topLevelClassifier = getTopLevelContainingClassifier() ?: return annotations
val classId = topLevelClassifier.classId ?: return annotations
val moduleAnnotations = c.components.javaModuleResolver.getModuleAnnotations(classId)
if (moduleAnnotations.isNullOrEmpty()) return annotations
val moduleAnnotationDescriptors = moduleAnnotations.map { LazyJavaAnnotationDescriptor(c, it, isFreshlySupportedAnnotation = true) }
return Annotations.create(annotations + moduleAnnotationDescriptors)
}
private fun <D : CallableMemberDescriptor> D.enhanceSignature(c: LazyJavaResolverContext): D {
// TODO type parameters
// TODO use new type parameters while enhancing other types
@@ -162,7 +170,7 @@ class SignatureEnhancement(
// Fake overrides with one overridden has been enhanced before
if (kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE && original.overriddenDescriptors.size == 1) return this
val memberContext = c.copyWithNewDefaultTypeQualifiers(annotations)
val memberContext = c.copyWithNewDefaultTypeQualifiers(getDefaultAnnotations(c))
// When loading method as an override for a property, all annotations are stick to its getter
val annotationOwnerForMember =
@@ -58,6 +58,20 @@ fun DeclarationDescriptor.isTopLevelInPackage(name: String, packageName: String)
return packageName == packageFqName
}
fun DeclarationDescriptor.isTopLevelInPackage() = containingDeclaration is PackageFragmentDescriptor
fun DeclarationDescriptor.getTopLevelContainingClassifier(): ClassifierDescriptor? {
val containingDeclaration = containingDeclaration
if (containingDeclaration == null || this is PackageFragmentDescriptor) return null
return if (!containingDeclaration.isTopLevelInPackage()) {
containingDeclaration.getTopLevelContainingClassifier()
} else if (containingDeclaration is ClassifierDescriptor) {
containingDeclaration
} else null
}
fun CallableDescriptor.isSupportedForCallableReference() = this is PropertyDescriptor || this is FunctionDescriptor
@OptIn(ExperimentalContracts::class)