JVM_IR KT-43611 report signature clash on private interface members
This commit is contained in:
+28
-20
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor
|
import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor
|
||||||
@@ -68,10 +69,6 @@ class JvmSignatureClashDetector(
|
|||||||
origin in SPECIAL_BRIDGES_AND_OVERRIDES
|
origin in SPECIAL_BRIDGES_AND_OVERRIDES
|
||||||
|
|
||||||
fun reportErrors(classOrigin: JvmDeclarationOrigin) {
|
fun reportErrors(classOrigin: JvmDeclarationOrigin) {
|
||||||
// Class IFoo$DefaultImpls has conflicting signatures if and only if corresponding interface IFoo has conflicting signatures.
|
|
||||||
// Do not report these diagnostics twice.
|
|
||||||
if (irClass.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS) return
|
|
||||||
|
|
||||||
reportMethodSignatureConflicts(classOrigin)
|
reportMethodSignatureConflicts(classOrigin)
|
||||||
reportPredefinedMethodSignatureConflicts(classOrigin)
|
reportPredefinedMethodSignatureConflicts(classOrigin)
|
||||||
reportFieldSignatureConflicts(classOrigin)
|
reportFieldSignatureConflicts(classOrigin)
|
||||||
@@ -89,25 +86,36 @@ class JvmSignatureClashDetector(
|
|||||||
|
|
||||||
when {
|
when {
|
||||||
realMethodsCount == 0 && (fakeOverridesCount > 1 || specialOverridesCount > 1) ->
|
realMethodsCount == 0 && (fakeOverridesCount > 1 || specialOverridesCount > 1) ->
|
||||||
reportJvmSignatureClash(
|
if (irClass.origin != JvmLoweredDeclarationOrigin.DEFAULT_IMPLS) {
|
||||||
ErrorsJvm.CONFLICTING_INHERITED_JVM_DECLARATIONS,
|
reportJvmSignatureClash(
|
||||||
listOf(irClass),
|
ErrorsJvm.CONFLICTING_INHERITED_JVM_DECLARATIONS,
|
||||||
conflictingJvmDeclarationsData
|
listOf(irClass),
|
||||||
)
|
conflictingJvmDeclarationsData
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fakeOverridesCount == 0 && specialOverridesCount == 0 ->
|
fakeOverridesCount == 0 && specialOverridesCount == 0 -> {
|
||||||
reportJvmSignatureClash(
|
// In IFoo$DefaultImpls we should report errors only if there are private methods among conflicting ones
|
||||||
ErrorsJvm.CONFLICTING_JVM_DECLARATIONS,
|
// (otherwise such errors would be reported twice: once for IFoo and once for IFoo$DefaultImpls).
|
||||||
methods,
|
if (irClass.origin != JvmLoweredDeclarationOrigin.DEFAULT_IMPLS ||
|
||||||
conflictingJvmDeclarationsData
|
methods.any { DescriptorVisibilities.isPrivate(it.visibility) }
|
||||||
)
|
) {
|
||||||
|
reportJvmSignatureClash(
|
||||||
|
ErrorsJvm.CONFLICTING_JVM_DECLARATIONS,
|
||||||
|
methods,
|
||||||
|
conflictingJvmDeclarationsData
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else ->
|
else ->
|
||||||
reportJvmSignatureClash(
|
if (irClass.origin != JvmLoweredDeclarationOrigin.DEFAULT_IMPLS) {
|
||||||
ErrorsJvm.ACCIDENTAL_OVERRIDE,
|
reportJvmSignatureClash(
|
||||||
methods.filter { !it.isFakeOverride && !it.isSpecialOverride() },
|
ErrorsJvm.ACCIDENTAL_OVERRIDE,
|
||||||
conflictingJvmDeclarationsData
|
methods.filter { !it.isFakeOverride && !it.isSpecialOverride() },
|
||||||
)
|
conflictingJvmDeclarationsData
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
interface A {
|
||||||
|
<!CONFLICTING_JVM_DECLARATIONS!>fun f(a: List<Int>): String<!> = TODO()
|
||||||
|
<!CONFLICTING_JVM_DECLARATIONS!>private fun f(<!UNUSED_PARAMETER!>a<!>: List<String>): String<!> = TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
class B : A
|
||||||
Vendored
+18
@@ -0,0 +1,18 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public interface A {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open fun f(/*0*/ a: kotlin.collections.List<kotlin.Int>): kotlin.String
|
||||||
|
private final fun f(/*0*/ a: kotlin.collections.List<kotlin.String>): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class B : A {
|
||||||
|
public constructor B()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun f(/*0*/ a: kotlin.collections.List<kotlin.Int>): kotlin.String
|
||||||
|
invisible_fake final override /*1*/ /*fake_override*/ fun f(/*0*/ a: kotlin.collections.List<kotlin.String>): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
Generated
+5
@@ -552,6 +552,11 @@ public class DiagnosticsTestWithJvmIrBackendGenerated extends AbstractDiagnostic
|
|||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/defaultVsNonDefault_ir.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/defaultVsNonDefault_ir.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt43611.kt")
|
||||||
|
public void testKt43611() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/kt43611.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("oneTrait_ir.kt")
|
@TestMetadata("oneTrait_ir.kt")
|
||||||
public void testOneTrait_ir() throws Exception {
|
public void testOneTrait_ir() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/oneTrait_ir.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/oneTrait_ir.kt");
|
||||||
|
|||||||
Generated
+5
@@ -542,6 +542,11 @@ public class DiagnosticsTestWithOldJvmBackendGenerated extends AbstractDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/defaultVsNonDefault_old.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/defaultVsNonDefault_old.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt43611.kt")
|
||||||
|
public void testKt43611() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/kt43611.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("oneTrait_old.kt")
|
@TestMetadata("oneTrait_old.kt")
|
||||||
public void testOneTrait_old() throws Exception {
|
public void testOneTrait_old() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/oneTrait_old.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/traitImpl/oneTrait_old.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user