[FIR] Fix overloading of renamed jvm methods

#KT-48102 Fixed
This commit is contained in:
Andrey Zinovyev
2021-08-06 14:11:40 +03:00
committed by TeamCityServer
parent cd99c35649
commit 1b81018b69
14 changed files with 86 additions and 93 deletions
@@ -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 {
@@ -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 {
@@ -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
}
}
}