K2 Java: fix 'value' annotation constructor parameter type to Array<out>
#KT-61100 Fixed
This commit is contained in:
committed by
Space Team
parent
8e4a6759a4
commit
af58b30e5f
@@ -16,13 +16,11 @@ import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
|||||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.jvm.buildJavaTypeRef
|
import org.jetbrains.kotlin.fir.types.jvm.buildJavaTypeRef
|
||||||
import org.jetbrains.kotlin.fir.utils.exceptions.withConeTypeEntry
|
|
||||||
import org.jetbrains.kotlin.load.java.structure.*
|
import org.jetbrains.kotlin.load.java.structure.*
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
import org.jetbrains.kotlin.name.StandardClassIds
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.runUnless
|
|
||||||
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
|
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
|
||||||
|
|
||||||
private fun ClassId.toConeFlexibleType(
|
private fun ClassId.toConeFlexibleType(
|
||||||
@@ -37,8 +35,10 @@ private fun ClassId.toConeFlexibleType(
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum class FirJavaTypeConversionMode {
|
enum class FirJavaTypeConversionMode {
|
||||||
DEFAULT, ANNOTATION_MEMBER, SUPERTYPE,
|
DEFAULT, ANNOTATION_MEMBER, ANNOTATION_CONSTRUCTOR_PARAMETER, SUPERTYPE,
|
||||||
TYPE_PARAMETER_BOUND_FIRST_ROUND, TYPE_PARAMETER_BOUND_AFTER_FIRST_ROUND
|
TYPE_PARAMETER_BOUND_FIRST_ROUND, TYPE_PARAMETER_BOUND_AFTER_FIRST_ROUND;
|
||||||
|
|
||||||
|
val insideAnnotation: Boolean get() = this == ANNOTATION_MEMBER || this == ANNOTATION_CONSTRUCTOR_PARAMETER
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirTypeRef.resolveIfJavaType(
|
fun FirTypeRef.resolveIfJavaType(
|
||||||
@@ -105,7 +105,7 @@ private fun JavaType?.toConeTypeProjection(
|
|||||||
return when (this) {
|
return when (this) {
|
||||||
is JavaClassifierType -> {
|
is JavaClassifierType -> {
|
||||||
val lowerBound = toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, mode, attributes)
|
val lowerBound = toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, mode, attributes)
|
||||||
if (mode == FirJavaTypeConversionMode.ANNOTATION_MEMBER) {
|
if (mode.insideAnnotation) {
|
||||||
return lowerBound
|
return lowerBound
|
||||||
}
|
}
|
||||||
val upperBound = toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, mode, attributes, lowerBound)
|
val upperBound = toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, mode, attributes, lowerBound)
|
||||||
@@ -133,11 +133,14 @@ private fun JavaType?.toConeTypeProjection(
|
|||||||
else ->
|
else ->
|
||||||
StandardClassIds.Array to arrayOf(componentType.toConeKotlinType(session, javaTypeParameterStack, mode))
|
StandardClassIds.Array to arrayOf(componentType.toConeKotlinType(session, javaTypeParameterStack, mode))
|
||||||
}
|
}
|
||||||
if (mode == FirJavaTypeConversionMode.ANNOTATION_MEMBER) {
|
val argumentsWithOutProjection = Array(arguments.size) { ConeKotlinTypeProjectionOut(arguments[it]) }
|
||||||
classId.constructClassLikeType(arguments, isNullable = false, attributes)
|
when (mode) {
|
||||||
} else {
|
FirJavaTypeConversionMode.ANNOTATION_CONSTRUCTOR_PARAMETER ->
|
||||||
val argumentsForUpper = Array(arguments.size) { ConeKotlinTypeProjectionOut(arguments[it]) }
|
classId.constructClassLikeType(argumentsWithOutProjection, isNullable = false, attributes)
|
||||||
classId.toConeFlexibleType(arguments, argumentsForUpper, attributes)
|
FirJavaTypeConversionMode.ANNOTATION_MEMBER ->
|
||||||
|
classId.constructClassLikeType(arguments, isNullable = false, attributes)
|
||||||
|
else ->
|
||||||
|
classId.toConeFlexibleType(arguments, typeArgumentsForUpper = argumentsWithOutProjection, attributes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +178,7 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound(
|
|||||||
): ConeLookupTagBasedType {
|
): ConeLookupTagBasedType {
|
||||||
return when (val classifier = classifier) {
|
return when (val classifier = classifier) {
|
||||||
is JavaClass -> {
|
is JavaClass -> {
|
||||||
var classId = if (mode == FirJavaTypeConversionMode.ANNOTATION_MEMBER) {
|
var classId = if (mode.insideAnnotation) {
|
||||||
JavaToKotlinClassMap.mapJavaToKotlinIncludingClassMapping(classifier.fqName!!)
|
JavaToKotlinClassMap.mapJavaToKotlinIncludingClassMapping(classifier.fqName!!)
|
||||||
} else {
|
} else {
|
||||||
JavaToKotlinClassMap.mapJavaToKotlin(classifier.fqName!!)
|
JavaToKotlinClassMap.mapJavaToKotlin(classifier.fqName!!)
|
||||||
@@ -195,8 +198,8 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound(
|
|||||||
lookupTag.takeIf { lowerBound == null && mode != FirJavaTypeConversionMode.TYPE_PARAMETER_BOUND_FIRST_ROUND }
|
lookupTag.takeIf { lowerBound == null && mode != FirJavaTypeConversionMode.TYPE_PARAMETER_BOUND_FIRST_ROUND }
|
||||||
?.toFirRegularClassSymbol(session)?.typeParameterSymbols
|
?.toFirRegularClassSymbol(session)?.typeParameterSymbols
|
||||||
// Given `C<T : X>`, `C` -> `C<X>..C<*>?`.
|
// Given `C<T : X>`, `C` -> `C<X>..C<*>?`.
|
||||||
when (mode) {
|
when {
|
||||||
FirJavaTypeConversionMode.ANNOTATION_MEMBER -> Array(classifier.allTypeParametersNumber()) { ConeStarProjection }
|
mode.insideAnnotation -> Array(classifier.allTypeParametersNumber()) { ConeStarProjection }
|
||||||
else -> typeParameterSymbols?.getProjectionsForRawType(session)
|
else -> typeParameterSymbols?.getProjectionsForRawType(session)
|
||||||
?: Array(classifier.allTypeParametersNumber()) { ConeStarProjection }
|
?: Array(classifier.allTypeParametersNumber()) { ConeStarProjection }
|
||||||
}
|
}
|
||||||
@@ -208,7 +211,7 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound(
|
|||||||
?.toFirRegularClassSymbol(session)?.typeParameterSymbols
|
?.toFirRegularClassSymbol(session)?.typeParameterSymbols
|
||||||
Array(typeArguments.size) { index ->
|
Array(typeArguments.size) { index ->
|
||||||
// TODO: check this
|
// TODO: check this
|
||||||
val newMode = if (mode == FirJavaTypeConversionMode.ANNOTATION_MEMBER) FirJavaTypeConversionMode.DEFAULT else mode
|
val newMode = if (mode.insideAnnotation) FirJavaTypeConversionMode.DEFAULT else mode
|
||||||
val argument = typeArguments[index]
|
val argument = typeArguments[index]
|
||||||
val variance = typeParameterSymbols?.getOrNull(index)?.fir?.variance ?: Variance.INVARIANT
|
val variance = typeParameterSymbols?.getOrNull(index)?.fir?.variance ?: Variance.INVARIANT
|
||||||
argument.toConeTypeProjection(session, javaTypeParameterStack, variance, newMode)
|
argument.toConeTypeProjection(session, javaTypeParameterStack, variance, newMode)
|
||||||
|
|||||||
+11
-2
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.java.enhancement
|
package org.jetbrains.kotlin.fir.java.enhancement
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
|
import org.jetbrains.kotlin.builtins.StandardNames.DEFAULT_VALUE_PARAMETER
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.fakeElement
|
import org.jetbrains.kotlin.fakeElement
|
||||||
@@ -43,6 +44,7 @@ import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
|||||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||||
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
|
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
|
||||||
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType
|
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType
|
||||||
|
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType.VALUE_PARAMETER
|
||||||
import org.jetbrains.kotlin.load.java.FakePureImplementationsProvider
|
import org.jetbrains.kotlin.load.java.FakePureImplementationsProvider
|
||||||
import org.jetbrains.kotlin.load.java.JavaTypeQualifiersByElementType
|
import org.jetbrains.kotlin.load.java.JavaTypeQualifiersByElementType
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||||
@@ -647,7 +649,7 @@ class FirSignatureEnhancement(
|
|||||||
parameterContainer?.let {
|
parameterContainer?.let {
|
||||||
typeQualifierResolver.extractAndMergeDefaultQualifiers(defaultQualifiers, it.annotations)
|
typeQualifierResolver.extractAndMergeDefaultQualifiers(defaultQualifiers, it.annotations)
|
||||||
} ?: defaultQualifiers,
|
} ?: defaultQualifiers,
|
||||||
AnnotationQualifierApplicabilityType.VALUE_PARAMETER,
|
VALUE_PARAMETER,
|
||||||
typeInSignature,
|
typeInSignature,
|
||||||
predefined,
|
predefined,
|
||||||
forAnnotationMember
|
forAnnotationMember
|
||||||
@@ -665,7 +667,14 @@ class FirSignatureEnhancement(
|
|||||||
): FirResolvedTypeRef {
|
): FirResolvedTypeRef {
|
||||||
val typeRef = typeInSignature.getTypeRef(this)
|
val typeRef = typeInSignature.getTypeRef(this)
|
||||||
val typeRefsFromOverridden = overriddenMembers.map { typeInSignature.getTypeRef(it) }
|
val typeRefsFromOverridden = overriddenMembers.map { typeInSignature.getTypeRef(it) }
|
||||||
val mode = if (forAnnotationMember) FirJavaTypeConversionMode.ANNOTATION_MEMBER else FirJavaTypeConversionMode.DEFAULT
|
val mode = when {
|
||||||
|
!forAnnotationMember ->
|
||||||
|
FirJavaTypeConversionMode.DEFAULT
|
||||||
|
containerApplicabilityType == VALUE_PARAMETER && (typeContainer as? FirValueParameter)?.name == DEFAULT_VALUE_PARAMETER ->
|
||||||
|
FirJavaTypeConversionMode.ANNOTATION_CONSTRUCTOR_PARAMETER
|
||||||
|
else ->
|
||||||
|
FirJavaTypeConversionMode.ANNOTATION_MEMBER
|
||||||
|
}
|
||||||
return EnhancementSignatureParts(
|
return EnhancementSignatureParts(
|
||||||
session, typeQualifierResolver, typeContainer, isCovariant, forceOnlyHeadTypeConstructor = false,
|
session, typeQualifierResolver, typeContainer, isCovariant, forceOnlyHeadTypeConstructor = false,
|
||||||
containerApplicabilityType, containerQualifiers
|
containerApplicabilityType, containerQualifiers
|
||||||
|
|||||||
+1
-1
@@ -16,7 +16,7 @@ public abstract interface AnnotationInParam : R|kotlin/Any| {
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final annotation class MyAnnotation2 : R|kotlin/Annotation| {
|
public final annotation class MyAnnotation2 : R|kotlin/Annotation| {
|
||||||
public constructor(vararg value: R|kotlin/Array<kotlin/String>|): R|test/AnnotationInParam.MyAnnotation2|
|
public constructor(vararg value: R|kotlin/Array<out kotlin/String>|): R|test/AnnotationInParam.MyAnnotation2|
|
||||||
|
|
||||||
}
|
}
|
||||||
public final annotation class MyAnnotation3 : R|kotlin/Annotation| {
|
public final annotation class MyAnnotation3 : R|kotlin/Annotation| {
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ public abstract interface ArrayOfStringInParam : R|kotlin/Any| {
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final annotation class MyAnnotation : R|kotlin/Annotation| {
|
public final annotation class MyAnnotation : R|kotlin/Annotation| {
|
||||||
public constructor(vararg value: R|kotlin/Array<kotlin/String>|): R|test/ArrayOfStringInParam.MyAnnotation|
|
public constructor(vararg value: R|kotlin/Array<out kotlin/String>|): R|test/ArrayOfStringInParam.MyAnnotation|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@ public open class ClassObjectArrayInParam : R|kotlin/Any| {
|
|||||||
public constructor(): R|test/ClassObjectArrayInParam|
|
public constructor(): R|test/ClassObjectArrayInParam|
|
||||||
|
|
||||||
public final annotation class Anno : R|kotlin/Annotation| {
|
public final annotation class Anno : R|kotlin/Annotation| {
|
||||||
public constructor(vararg value: R|kotlin/Array<kotlin/reflect/KClass<*>>|): R|test/ClassObjectArrayInParam.Anno|
|
public constructor(vararg value: R|kotlin/Array<out kotlin/reflect/KClass<*>>|): R|test/ClassObjectArrayInParam.Anno|
|
||||||
|
|
||||||
}
|
}
|
||||||
@R|test/ClassObjectArrayInParam.Anno|(value = <implicitArrayOf>(<getClass>(<getClass>(R|test/ClassObjectArrayInParam!|)), <getClass>(<getClass>(R|test/ClassObjectArrayInParam.Nested!|)), <getClass>(<getClass>(R|kotlin/String!|)), <getClass>(<getClass>(R|ft<Raw type kotlin/collections/MutableList<kotlin/Any?>, kotlin/collections/List<*>?>|)), <getClass>(<getClass>(R|ft<kotlin/Array<ft<kotlin/Array<kotlin/String!>, kotlin/Array<out kotlin/String!>?>>, kotlin/Array<out ft<kotlin/Array<kotlin/String!>, kotlin/Array<out kotlin/String!>?>>?>|)), <getClass>(<getClass>(R|ft<kotlin/Array<kotlin/IntArray!>, kotlin/Array<out kotlin/IntArray!>?>|)), <getClass>(<getClass>(R|kotlin/Unit|)))) public open class Nested : R|kotlin/Any| {
|
@R|test/ClassObjectArrayInParam.Anno|(value = <implicitArrayOf>(<getClass>(<getClass>(R|test/ClassObjectArrayInParam!|)), <getClass>(<getClass>(R|test/ClassObjectArrayInParam.Nested!|)), <getClass>(<getClass>(R|kotlin/String!|)), <getClass>(<getClass>(R|ft<Raw type kotlin/collections/MutableList<kotlin/Any?>, kotlin/collections/List<*>?>|)), <getClass>(<getClass>(R|ft<kotlin/Array<ft<kotlin/Array<kotlin/String!>, kotlin/Array<out kotlin/String!>?>>, kotlin/Array<out ft<kotlin/Array<kotlin/String!>, kotlin/Array<out kotlin/String!>?>>?>|)), <getClass>(<getClass>(R|ft<kotlin/Array<kotlin/IntArray!>, kotlin/Array<out kotlin/IntArray!>?>|)), <getClass>(<getClass>(R|kotlin/Unit|)))) public open class Nested : R|kotlin/Any| {
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ public abstract interface EmptyArrayInParam : R|kotlin/Any| {
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final annotation class MyAnnotation : R|kotlin/Annotation| {
|
public final annotation class MyAnnotation : R|kotlin/Annotation| {
|
||||||
public constructor(vararg value: R|kotlin/Array<kotlin/String>|): R|test/EmptyArrayInParam.MyAnnotation|
|
public constructor(vararg value: R|kotlin/Array<out kotlin/String>|): R|test/EmptyArrayInParam.MyAnnotation|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ public open class EnumArgumentWithCustomToString : R|kotlin/Any| {
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final annotation class EnumArrayAnno : R|kotlin/Annotation| {
|
public final annotation class EnumArrayAnno : R|kotlin/Annotation| {
|
||||||
public constructor(vararg value: R|kotlin/Array<test/EnumArgumentWithCustomToString.E>|): R|test/EnumArgumentWithCustomToString.EnumArrayAnno|
|
public constructor(vararg value: R|kotlin/Array<out test/EnumArgumentWithCustomToString.E>|): R|test/EnumArgumentWithCustomToString.EnumArrayAnno|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user