[FIR] Fix overloading of renamed jvm methods
#KT-48102 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
cd99c35649
commit
1b81018b69
+6
@@ -7495,6 +7495,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
||||
runTest("compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mappedFunctionNotImplemented.kt")
|
||||
public void testMappedFunctionNotImplemented() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/declarationChecks/mappedFunctionNotImplemented.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mulitpleVarargParameters.kt")
|
||||
public void testMulitpleVarargParameters() throws Exception {
|
||||
|
||||
+6
@@ -7495,6 +7495,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
||||
runTest("compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mappedFunctionNotImplemented.kt")
|
||||
public void testMappedFunctionNotImplemented() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/declarationChecks/mappedFunctionNotImplemented.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mulitpleVarargParameters.kt")
|
||||
public void testMulitpleVarargParameters() throws Exception {
|
||||
|
||||
+13
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInterface
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isOperator
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||
@@ -299,6 +300,13 @@ class JavaClassUseSiteMemberScope(
|
||||
): FirNamedFunctionSymbol? {
|
||||
val overriddenBuiltin = symbol.getOverriddenBuiltinWithDifferentJvmName() ?: return null
|
||||
|
||||
//if (unrelated) method with special name is already defined, we don't add renamed method at all
|
||||
//otherwise we get methods ambiguity
|
||||
val alreadyDefined = declaredMemberScope.getFunctions(name).any { declaredSymbol ->
|
||||
overrideChecker.isOverriddenFunction(declaredSymbol.fir, symbol.fir)
|
||||
}
|
||||
if (alreadyDefined) return null
|
||||
|
||||
val nameInJava =
|
||||
SpecialGenericSignatures.SIGNATURE_TO_JVM_REPRESENTATION_NAME[overriddenBuiltin.fir.computeJvmSignature() ?: return null]
|
||||
?: return null
|
||||
@@ -308,6 +316,7 @@ class JavaClassUseSiteMemberScope(
|
||||
val renamedCopy = buildJavaMethodCopy(candidateFir) {
|
||||
this.name = name
|
||||
this.symbol = FirNamedFunctionSymbol(CallableId(candidateFir.symbol.callableId.classId!!, name))
|
||||
this.status = candidateFir.status.copy(isOperator = symbol.isOperator)
|
||||
}.apply {
|
||||
initialSignatureAttr = candidateFir
|
||||
}
|
||||
@@ -415,6 +424,10 @@ class JavaClassUseSiteMemberScope(
|
||||
private fun FirNamedFunctionSymbol.getOverriddenBuiltinWithDifferentJvmName(): FirNamedFunctionSymbol? {
|
||||
var result: FirNamedFunctionSymbol? = null
|
||||
|
||||
if (SpecialGenericSignatures.SIGNATURE_TO_JVM_REPRESENTATION_NAME.containsKey(this.fir.computeJvmSignature())) {
|
||||
return this
|
||||
}
|
||||
|
||||
superTypesScope.processOverriddenFunctions(this) {
|
||||
if (!it.isFromBuiltInClass(session)) return@processOverriddenFunctions ProcessorAction.NEXT
|
||||
if (SpecialGenericSignatures.SIGNATURE_TO_JVM_REPRESENTATION_NAME.containsKey(it.fir.computeJvmSignature())) {
|
||||
|
||||
@@ -179,9 +179,10 @@ fun FirDeclarationStatus.copy(
|
||||
isExpect: Boolean = this.isExpect,
|
||||
newModality: Modality? = null,
|
||||
newVisibility: Visibility? = null,
|
||||
newEffectiveVisibility: EffectiveVisibility? = null
|
||||
newEffectiveVisibility: EffectiveVisibility? = null,
|
||||
isOperator: Boolean = this.isOperator
|
||||
): FirDeclarationStatus {
|
||||
return if (this.isExpect == isExpect && newModality == null && newVisibility == null) {
|
||||
return if (this.isExpect == isExpect && newModality == null && newVisibility == null && this.isOperator == isOperator) {
|
||||
this
|
||||
} else {
|
||||
require(this is FirDeclarationStatusImpl) { "Unexpected class ${this::class}" }
|
||||
@@ -191,6 +192,7 @@ fun FirDeclarationStatus.copy(
|
||||
newEffectiveVisibility ?: EffectiveVisibility.Public
|
||||
).apply {
|
||||
this.isExpect = isExpect
|
||||
this.isOperator = isOperator
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user