diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt index 171e53919f3..9872e5c5d00 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt @@ -91,6 +91,12 @@ class BinaryJavaClass( val translatedPath = BinaryJavaAnnotation.translatePath(typePath) when (typeReference.sort) { + TypeReference.CLASS_EXTENDS -> { + val baseType: JavaType = if (typeReference.superTypeIndex == -1) superclass!! else interfaces[typeReference.superTypeIndex] + val targetType = BinaryJavaAnnotation.computeTargetType(baseType, translatedPath) + + return BinaryJavaAnnotation.addAnnotation(targetType as JavaPlainType, descriptor, context, signatureParser) + } TypeReference.CLASS_TYPE_PARAMETER_BOUND -> { val baseType = computeTypeParameterBound(typeParameters, typeReference) val targetType = BinaryJavaAnnotation.computeTargetType(baseType, translatedPath) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt index 233bf329a67..9658d39233b 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt @@ -208,16 +208,17 @@ class LazyJavaClassDescriptor( for (javaType in javaTypes) { val kotlinType = c.typeResolver.transformJavaType(javaType, TypeUsage.SUPERTYPE.toAttributes()) - if (kotlinType.constructor.declarationDescriptor is NotFoundClasses.MockClassDescriptor) { + val enhancedKotlinType = c.components.signatureEnhancement.enhanceSuperType(kotlinType, c) + if (enhancedKotlinType.constructor.declarationDescriptor is NotFoundClasses.MockClassDescriptor) { incomplete.add(javaType) } - if (kotlinType.constructor == purelyImplementedSupertype?.constructor) { + if (enhancedKotlinType.constructor == purelyImplementedSupertype?.constructor) { continue } - if (!KotlinBuiltIns.isAnyOrNullableAny(kotlinType)) { - result.add(kotlinType) + if (!KotlinBuiltIns.isAnyOrNullableAny(enhancedKotlinType)) { + result.add(enhancedKotlinType) } } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index 5be3f2d4b27..38e6ecdbc04 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -245,6 +245,17 @@ class SignatureEnhancement( } } + /* + * This method should be only used for type enhancement of base classes' type arguments: + * class A extends B<@NotNull Integer> {} + */ + fun enhanceSuperType(type: KotlinType, context: LazyJavaResolverContext) = + SignatureParts( + null, type, emptyList(), false, context, + AnnotationQualifierApplicabilityType.TYPE_USE, + typeParameterBounds = true + ).enhance().type + private fun ValueParameterDescriptor.hasDefaultValueInAnnotation(type: KotlinType) = when (val defaultValue = getDefaultValueFromAnnotation()) { is StringDefaultValue -> type.lexicalCastFrom(defaultValue.value) != null