diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt index 73fa013271c..d22e8bb671b 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter import org.jetbrains.kotlin.load.kotlin.TypeMappingMode +import org.jetbrains.kotlin.load.kotlin.getOptimalModeForReturnType import org.jetbrains.kotlin.load.kotlin.getOptimalModeForValueParameter import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.types.* @@ -41,6 +42,11 @@ internal class KtFe10PsiTypeProvider(override val analysisSession: KtFe10Analysi return asPsiType(simplifyType(kotlinType), useSitePosition, mode) } + override fun getOptimalModeForReturnType(type: KtType, isAnnotationMethod: Boolean): TypeMappingMode = withValidityAssertion { + require(type is KtFe10Type) + typeMapper.typeContext.getOptimalModeForReturnType(type.type, isAnnotationMethod) + } + override fun getOptimalModeForValueParameter(type: KtType): TypeMappingMode = withValidityAssertion { require(type is KtFe10Type) typeMapper.typeContext.getOptimalModeForValueParameter(type.type) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt index 3424ea938b9..db76a6ae666 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.load.kotlin.TypeMappingMode +import org.jetbrains.kotlin.load.kotlin.getOptimalModeForReturnType import org.jetbrains.kotlin.load.kotlin.getOptimalModeForValueParameter import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi @@ -59,6 +60,11 @@ internal class KtFirPsiTypeProvider( type.coneType.asPsiType(rootModuleSession, analysisSession.firResolveState, mode, useSitePosition) } + override fun getOptimalModeForReturnType(type: KtType, isAnnotationMethod: Boolean): TypeMappingMode = withValidityAssertion { + require(type is KtFirType) + rootModuleSession.jvmTypeMapper.typeContext.getOptimalModeForReturnType(type.coneType, isAnnotationMethod) + } + override fun getOptimalModeForValueParameter(type: KtType): TypeMappingMode = withValidityAssertion { require(type is KtFirType) rootModuleSession.jvmTypeMapper.typeContext.getOptimalModeForValueParameter(type.coneType) diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt index 4fa4608d21e..83bcd59a41c 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.load.kotlin.TypeMappingMode public abstract class KtPsiTypeProvider : KtAnalysisSessionComponent() { public abstract fun asPsiType(type: KtType, useSitePosition: PsiElement, mode: TypeMappingMode): PsiType? + public abstract fun getOptimalModeForReturnType(type: KtType, isAnnotationMethod: Boolean): TypeMappingMode public abstract fun getOptimalModeForValueParameter(type: KtType): TypeMappingMode } @@ -38,6 +39,9 @@ public interface KtPsiTypeProviderMixIn : KtAnalysisSessionMixIn { ): PsiType? = analysisSession.psiTypeProvider.asPsiType(this, useSitePosition, mode) + public fun KtType.getOptimalModeForReturnType(isAnnotationMethod: Boolean): TypeMappingMode = + analysisSession.psiTypeProvider.getOptimalModeForReturnType(this, isAnnotationMethod) + public fun KtType.getOptimalModeForValueParameter(): TypeMappingMode = analysisSession.psiTypeProvider.getOptimalModeForValueParameter(this) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt index e5584d595d3..699a5cb3f39 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt @@ -34,10 +34,19 @@ internal class FirLightFieldForPropertySymbol( when { isDelegated -> (kotlinOrigin as? KtProperty)?.delegateExpression?.let { - it.getKtType()?.asPsiType(this@FirLightFieldForPropertySymbol) + val ktType = it.getKtType() + ktType?.asPsiType( + this@FirLightFieldForPropertySymbol, + ktType.getOptimalModeForReturnType(containingClass.isAnnotationType) + ) } - else -> - propertySymbol.annotatedType.type.asPsiType(this@FirLightFieldForPropertySymbol) + else -> { + val ktType = propertySymbol.annotatedType.type + ktType.asPsiType( + this@FirLightFieldForPropertySymbol, + ktType.getOptimalModeForReturnType(containingClass.isAnnotationType) + ) + } } } ?: nonExistentType() } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt index 2d05e7e0752..d9ee57fe6f7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt @@ -150,9 +150,12 @@ internal class FirLightAccessorMethodForSymbol( private val _returnedType: PsiType by lazyPub { if (!isGetter) return@lazyPub PsiType.VOID analyzeWithSymbolAsContext(containingPropertySymbol) { - containingPropertySymbol.annotatedType.type.asPsiType(this@FirLightAccessorMethodForSymbol) - ?: this@FirLightAccessorMethodForSymbol.nonExistentType() - } + val ktType = containingPropertySymbol.annotatedType.type + ktType.asPsiType( + this@FirLightAccessorMethodForSymbol, + ktType.getOptimalModeForReturnType(containingClass.isAnnotationType) + ) + } ?: nonExistentType() } override fun getReturnType(): PsiType = _returnedType diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt index 9a219f372b4..87de39d14d9 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt @@ -145,7 +145,10 @@ internal class FirLightSimpleMethodForSymbol( else -> functionSymbol.annotatedType.type } - ktType.asPsiType(this@FirLightSimpleMethodForSymbol) + ktType.asPsiType( + this@FirLightSimpleMethodForSymbol, + ktType.getOptimalModeForReturnType(containingClass.isAnnotationType) + ) } ?: nonExistentType() } diff --git a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/PlatformTypes.kt b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/PlatformTypes.kt index 31d49c2199f..18aa68dfe57 100644 --- a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/PlatformTypes.kt +++ b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/PlatformTypes.kt @@ -6,4 +6,6 @@ class PlatformTypes { fun simplyPlatform() = Collections.singletonList("")[0] fun bothNullable() = Collections.emptyList() ?: null fun bothNotNull() = Collections.emptyList()!! -} \ No newline at end of file +} + +// FIR_COMPARISON diff --git a/compiler/testData/asJava/ultraLightClasses/wildcardOptimization.kt b/compiler/testData/asJava/ultraLightClasses/wildcardOptimization.kt index 28118caf952..803419a6a59 100644 --- a/compiler/testData/asJava/ultraLightClasses/wildcardOptimization.kt +++ b/compiler/testData/asJava/ultraLightClasses/wildcardOptimization.kt @@ -51,3 +51,5 @@ class Container { fun typeParameter(x: Out, y: In) {} } + +// FIR_COMPARISON