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.
This commit is contained in:
committed by
Space Team
parent
2f29738989
commit
b6d2d23f41
+15
-11
@@ -162,18 +162,20 @@ class FirSignatureEnhancement(
|
|||||||
is FirSyntheticProperty -> {
|
is FirSyntheticProperty -> {
|
||||||
val accessorSymbol = firElement.symbol
|
val accessorSymbol = firElement.symbol
|
||||||
val getterDelegate = firElement.getter.delegate
|
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)
|
enhancementsCache.enhancedFunctions.getValue(getterDelegate.symbol, this to getterDelegate.name)
|
||||||
} else {
|
} else {
|
||||||
getterDelegate.symbol
|
getterDelegate.symbol
|
||||||
}
|
}
|
||||||
val setterDelegate = firElement.setter?.delegate
|
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)
|
enhancementsCache.enhancedFunctions.getValue(setterDelegate.symbol, this to setterDelegate.name)
|
||||||
} else {
|
} else {
|
||||||
setterDelegate?.symbol
|
setterDelegate?.symbol
|
||||||
}
|
}
|
||||||
if (getterDelegate !is FirJavaMethod && setterDelegate !is FirJavaMethod) return original
|
if (!getterDelegate.isJava && setterDelegate?.isJava != true) {
|
||||||
|
return original
|
||||||
|
}
|
||||||
return buildSyntheticProperty {
|
return buildSyntheticProperty {
|
||||||
moduleData = this@FirSignatureEnhancement.moduleData
|
moduleData = this@FirSignatureEnhancement.moduleData
|
||||||
this.name = name
|
this.name = name
|
||||||
@@ -200,7 +202,7 @@ class FirSignatureEnhancement(
|
|||||||
): FirFunctionSymbol<*> {
|
): FirFunctionSymbol<*> {
|
||||||
val firMethod = original.fir
|
val firMethod = original.fir
|
||||||
|
|
||||||
if (firMethod !is FirJavaMethod && firMethod !is FirJavaConstructor) {
|
if (!firMethod.isJava) {
|
||||||
return original
|
return original
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,10 +238,10 @@ class FirSignatureEnhancement(
|
|||||||
val overriddenMembers = (firMethod as? FirSimpleFunction)?.overridden().orEmpty()
|
val overriddenMembers = (firMethod as? FirSimpleFunction)?.overridden().orEmpty()
|
||||||
val hasReceiver = overriddenMembers.any { it.receiverParameter != null }
|
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)
|
enhanceReceiverType(firMethod, overriddenMembers, defaultQualifiers)
|
||||||
} else null
|
} else null
|
||||||
val newReturnTypeRef = if (firMethod is FirJavaMethod) {
|
val newReturnTypeRef = if (firMethod is FirSimpleFunction) {
|
||||||
enhanceReturnType(firMethod, overriddenMembers, defaultQualifiers, predefinedEnhancementInfo)
|
enhanceReturnType(firMethod, overriddenMembers, defaultQualifiers, predefinedEnhancementInfo)
|
||||||
} else {
|
} else {
|
||||||
firMethod.returnTypeRef
|
firMethod.returnTypeRef
|
||||||
@@ -263,7 +265,7 @@ class FirSignatureEnhancement(
|
|||||||
var typeParameterSubstitutor: ConeSubstitutorByMap? = null
|
var typeParameterSubstitutor: ConeSubstitutorByMap? = null
|
||||||
|
|
||||||
val function = when (firMethod) {
|
val function = when (firMethod) {
|
||||||
is FirJavaConstructor -> {
|
is FirConstructor -> {
|
||||||
val symbol = FirConstructorSymbol(methodId).also { functionSymbol = it }
|
val symbol = FirConstructorSymbol(methodId).also { functionSymbol = it }
|
||||||
if (firMethod.isPrimary) {
|
if (firMethod.isPrimary) {
|
||||||
FirPrimaryConstructorBuilder().apply {
|
FirPrimaryConstructorBuilder().apply {
|
||||||
@@ -303,7 +305,7 @@ class FirSignatureEnhancement(
|
|||||||
this.typeParameters += (enhancedTypeParameters ?: firMethod.typeParameters)
|
this.typeParameters += (enhancedTypeParameters ?: firMethod.typeParameters)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is FirJavaMethod -> {
|
is FirSimpleFunction -> {
|
||||||
isJavaRecordComponent = firMethod.isJavaRecordComponent == true
|
isJavaRecordComponent = firMethod.isJavaRecordComponent == true
|
||||||
FirSimpleFunctionBuilder().apply {
|
FirSimpleFunctionBuilder().apply {
|
||||||
source = firMethod.source
|
source = firMethod.source
|
||||||
@@ -568,7 +570,7 @@ class FirSignatureEnhancement(
|
|||||||
// ================================================================================================
|
// ================================================================================================
|
||||||
|
|
||||||
private fun enhanceReceiverType(
|
private fun enhanceReceiverType(
|
||||||
ownerFunction: FirJavaMethod,
|
ownerFunction: FirSimpleFunction,
|
||||||
overriddenMembers: List<FirCallableDeclaration>,
|
overriddenMembers: List<FirCallableDeclaration>,
|
||||||
defaultQualifiers: JavaTypeQualifiersByElementType?
|
defaultQualifiers: JavaTypeQualifiersByElementType?
|
||||||
): FirResolvedTypeRef {
|
): FirResolvedTypeRef {
|
||||||
@@ -632,14 +634,16 @@ class FirSignatureEnhancement(
|
|||||||
|
|
||||||
object Receiver : TypeInSignature() {
|
object Receiver : TypeInSignature() {
|
||||||
override fun getTypeRef(member: FirCallableDeclaration): FirTypeRef {
|
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!!
|
return member.receiverParameter?.typeRef!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ValueParameter(val hasReceiver: Boolean, val index: Int) : TypeInSignature() {
|
class ValueParameter(val hasReceiver: Boolean, val index: Int) : TypeInSignature() {
|
||||||
override fun getTypeRef(member: FirCallableDeclaration): FirTypeRef {
|
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.valueParameters[index + 1].returnTypeRef
|
||||||
}
|
}
|
||||||
return (member as FirFunction).valueParameters[index].returnTypeRef
|
return (member as FirFunction).valueParameters[index].returnTypeRef
|
||||||
|
|||||||
Reference in New Issue
Block a user