From 37876313c906e7e4621ffdaca747399ddf946bc1 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 15 Jun 2023 13:45:33 -0700 Subject: [PATCH] SLC: add nullity annotation when force-boxing return type ^KT-57579 Fixed --- .../methods/SymbolLightAccessorMethod.kt | 24 +++++++--- .../symbol/methods/SymbolLightSimpleMethod.kt | 44 +++++++++++-------- .../IntOverridesAny.fir.java | 2 + 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt index 8a3fcd9d81e..eb02b9da38f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt @@ -211,7 +211,11 @@ internal class SymbolLightAccessorMethod private constructor( if (nullabilityApplicable) { withPropertySymbol { propertySymbol -> - if (propertySymbol.isLateInit) NullabilityType.NotNull else getTypeNullability(propertySymbol.returnType) + when { + propertySymbol.isLateInit -> NullabilityType.NotNull + forceBoxedReturnType(propertySymbol) -> NullabilityType.NotNull + else -> getTypeNullability(propertySymbol.returnType) + } } } else { NullabilityType.Unknown @@ -238,18 +242,24 @@ internal class SymbolLightAccessorMethod private constructor( override fun getNameIdentifier(): PsiIdentifier = KtLightIdentifier(this, containingPropertyDeclaration) + context(KtAnalysisSession) + private fun forceBoxedReturnType(propertySymbol: KtPropertySymbol): Boolean { + return propertySymbol.returnType.isPrimitive && + propertySymbol.getAllOverriddenSymbols().any { overriddenSymbol -> + !overriddenSymbol.returnType.isPrimitive + } + } + private val _returnedType: PsiType by lazyPub { if (!isGetter) return@lazyPub PsiType.VOID withPropertySymbol { propertySymbol -> val ktType = propertySymbol.returnType - val forceBoxedReturnType = ktType.isPrimitive && - propertySymbol.getAllOverriddenSymbols().any { overriddenSymbol -> - !overriddenSymbol.returnType.isPrimitive - } - - val typeMappingMode = if (forceBoxedReturnType) KtTypeMappingMode.RETURN_TYPE_BOXED else KtTypeMappingMode.RETURN_TYPE + val typeMappingMode = if (forceBoxedReturnType(propertySymbol)) + KtTypeMappingMode.RETURN_TYPE_BOXED + else + KtTypeMappingMode.RETURN_TYPE ktType.asPsiType( this@SymbolLightAccessorMethod, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt index 571244d5879..d0931a70c03 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt @@ -154,11 +154,17 @@ internal class SymbolLightSimpleMethod( NullabilityType.Unknown } else { withFunctionSymbol { functionSymbol -> - if (functionSymbol.isSuspend) { // Any? - NullabilityType.Nullable - } else { - val returnType = functionSymbol.returnType - if (returnType.isVoidType) NullabilityType.Unknown else getTypeNullability(returnType) + when { + functionSymbol.isSuspend -> { // Any? + NullabilityType.Nullable + } + forceBoxedReturnType(functionSymbol) -> { + NullabilityType.NotNull + } + else -> { + val returnType = functionSymbol.returnType + if (returnType.isVoidType) NullabilityType.Unknown else getTypeNullability(returnType) + } } } } @@ -180,19 +186,18 @@ internal class SymbolLightSimpleMethod( } // Inspired by KotlinTypeMapper#forceBoxedReturnType - private fun forceBoxedReturnType(): Boolean { - return withFunctionSymbol { functionSymbol -> - val returnType = functionSymbol.returnType - // 'invoke' methods for lambdas, function literals, and callable references - // implicitly override generic 'invoke' from a corresponding base class. - if (functionSymbol.isBuiltinFunctionInvoke && returnType.isInlineClassType) - return@withFunctionSymbol true + context(KtAnalysisSession) + private fun forceBoxedReturnType(functionSymbol: KtFunctionSymbol): Boolean { + val returnType = functionSymbol.returnType + // 'invoke' methods for lambdas, function literals, and callable references + // implicitly override generic 'invoke' from a corresponding base class. + if (functionSymbol.isBuiltinFunctionInvoke && returnType.isInlineClassType) + return true - returnType.isPrimitive && - functionSymbol.getAllOverriddenSymbols().any { overriddenSymbol -> - !overriddenSymbol.returnType.isPrimitive - } - } + return returnType.isPrimitive && + functionSymbol.getAllOverriddenSymbols().any { overriddenSymbol -> + !overriddenSymbol.returnType.isPrimitive + } } private val KtType.isInlineClassType: Boolean @@ -208,7 +213,10 @@ internal class SymbolLightSimpleMethod( functionSymbol.returnType.takeUnless { it.isVoidType } ?: return@withFunctionSymbol PsiType.VOID } - val typeMappingMode = if (forceBoxedReturnType()) KtTypeMappingMode.RETURN_TYPE_BOXED else KtTypeMappingMode.RETURN_TYPE + val typeMappingMode = if (forceBoxedReturnType(functionSymbol)) + KtTypeMappingMode.RETURN_TYPE_BOXED + else + KtTypeMappingMode.RETURN_TYPE ktType.asPsiTypeElement( this@SymbolLightSimpleMethod, diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/IntOverridesAny.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/IntOverridesAny.fir.java index e0a166d8bd8..7938ec197ab 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/IntOverridesAny.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/IntOverridesAny.fir.java @@ -2,9 +2,11 @@ public final class C /* C*/ implements Tr { private final int v; @java.lang.Override() + @org.jetbrains.annotations.NotNull() public java.lang.Integer foo();// foo() @java.lang.Override() + @org.jetbrains.annotations.NotNull() public java.lang.Integer getV();// getV() public C();// .ctor()