From b6d2d23f41ccd5c2cd98ec0258f479d2674b1a0d Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 20 Dec 2023 12:25:24 +0100 Subject: [PATCH] K2: use API instead of FirJavaMethod(Constructor) subtyping in enhancement FirJavaMethod and FirJavaConstructor are implementation classes. It's anyway not good to check subtyping using them, because it makes the code implementation-dependent. This commit begins to check Java origin instead. --- .../java/enhancement/SignatureEnhancement.kt | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 4a306d884de..8443e122052 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -162,18 +162,20 @@ class FirSignatureEnhancement( is FirSyntheticProperty -> { val accessorSymbol = firElement.symbol val getterDelegate = firElement.getter.delegate - val enhancedGetterSymbol = if (getterDelegate is FirJavaMethod) { + val enhancedGetterSymbol = if (getterDelegate.isJava) { enhancementsCache.enhancedFunctions.getValue(getterDelegate.symbol, this to getterDelegate.name) } else { getterDelegate.symbol } val setterDelegate = firElement.setter?.delegate - val enhancedSetterSymbol = if (setterDelegate is FirJavaMethod) { + val enhancedSetterSymbol = if (setterDelegate?.isJava == true) { enhancementsCache.enhancedFunctions.getValue(setterDelegate.symbol, this to setterDelegate.name) } else { setterDelegate?.symbol } - if (getterDelegate !is FirJavaMethod && setterDelegate !is FirJavaMethod) return original + if (!getterDelegate.isJava && setterDelegate?.isJava != true) { + return original + } return buildSyntheticProperty { moduleData = this@FirSignatureEnhancement.moduleData this.name = name @@ -200,7 +202,7 @@ class FirSignatureEnhancement( ): FirFunctionSymbol<*> { val firMethod = original.fir - if (firMethod !is FirJavaMethod && firMethod !is FirJavaConstructor) { + if (!firMethod.isJava) { return original } @@ -236,10 +238,10 @@ class FirSignatureEnhancement( val overriddenMembers = (firMethod as? FirSimpleFunction)?.overridden().orEmpty() val hasReceiver = overriddenMembers.any { it.receiverParameter != null } - val newReceiverTypeRef = if (firMethod is FirJavaMethod && hasReceiver) { + val newReceiverTypeRef = if (firMethod is FirSimpleFunction && hasReceiver) { enhanceReceiverType(firMethod, overriddenMembers, defaultQualifiers) } else null - val newReturnTypeRef = if (firMethod is FirJavaMethod) { + val newReturnTypeRef = if (firMethod is FirSimpleFunction) { enhanceReturnType(firMethod, overriddenMembers, defaultQualifiers, predefinedEnhancementInfo) } else { firMethod.returnTypeRef @@ -263,7 +265,7 @@ class FirSignatureEnhancement( var typeParameterSubstitutor: ConeSubstitutorByMap? = null val function = when (firMethod) { - is FirJavaConstructor -> { + is FirConstructor -> { val symbol = FirConstructorSymbol(methodId).also { functionSymbol = it } if (firMethod.isPrimary) { FirPrimaryConstructorBuilder().apply { @@ -303,7 +305,7 @@ class FirSignatureEnhancement( this.typeParameters += (enhancedTypeParameters ?: firMethod.typeParameters) } } - is FirJavaMethod -> { + is FirSimpleFunction -> { isJavaRecordComponent = firMethod.isJavaRecordComponent == true FirSimpleFunctionBuilder().apply { source = firMethod.source @@ -568,7 +570,7 @@ class FirSignatureEnhancement( // ================================================================================================ private fun enhanceReceiverType( - ownerFunction: FirJavaMethod, + ownerFunction: FirSimpleFunction, overriddenMembers: List, defaultQualifiers: JavaTypeQualifiersByElementType? ): FirResolvedTypeRef { @@ -632,14 +634,16 @@ class FirSignatureEnhancement( object Receiver : TypeInSignature() { override fun getTypeRef(member: FirCallableDeclaration): FirTypeRef { - if (member is FirJavaMethod) return member.valueParameters[0].returnTypeRef + if (member is FirSimpleFunction && member.isJava) { + return member.valueParameters[0].returnTypeRef + } return member.receiverParameter?.typeRef!! } } class ValueParameter(val hasReceiver: Boolean, val index: Int) : TypeInSignature() { override fun getTypeRef(member: FirCallableDeclaration): FirTypeRef { - if (hasReceiver && member is FirJavaMethod) { + if (hasReceiver && member is FirSimpleFunction && member.isJava) { return member.valueParameters[index + 1].returnTypeRef } return (member as FirFunction).valueParameters[index].returnTypeRef