diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt index 2c689fec4c5..e2e626de173 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt @@ -27,19 +27,19 @@ import org.jetbrains.org.objectweb.asm.commons.Method import java.util.* private val EXTERNAL_SOURCES_KINDS = arrayOf( - JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL, - JvmDeclarationOriginKind.DEFAULT_IMPL_DELEGATION_TO_SUPERINTERFACE_DEFAULT_IMPL, - JvmDeclarationOriginKind.DELEGATION, - JvmDeclarationOriginKind.BRIDGE + JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL, + JvmDeclarationOriginKind.DEFAULT_IMPL_DELEGATION_TO_SUPERINTERFACE_DEFAULT_IMPL, + JvmDeclarationOriginKind.DELEGATION, + JvmDeclarationOriginKind.BRIDGE ) private val PREDEFINED_SIGNATURES = listOf( - "getClass()Ljava/lang/Class;", - "notify()V", - "notifyAll()V", - "wait()V", - "wait(J)V", - "wait(JI)V" + "getClass()Ljava/lang/Class;", + "notify()V", + "notifyAll()V", + "wait()V", + "wait(J)V", + "wait(JI)V" ).map { signature -> RawSignature(signature.substringBefore('('), signature.substring(signature.indexOf('(')), MemberKind.METHOD) } @@ -77,8 +77,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( val elements = LinkedHashSet() if (noOwnImplementations) { elements.addIfNotNull(data.classOrigin.element) - } - else { + } else { for (origin in data.signatureOrigins) { var element = origin.element @@ -96,9 +95,9 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( } override fun onClassDone( - classOrigin: JvmDeclarationOrigin, - classInternalName: String, - signatures: MultiMap + classOrigin: JvmDeclarationOrigin, + classInternalName: String, + signatures: MultiMap ) { reportDiagnosticsTasks.add { reportClashingWithPredefinedSignatures(classOrigin, classInternalName, signatures) @@ -107,9 +106,9 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( } private fun reportClashingWithPredefinedSignatures( - classOrigin: JvmDeclarationOrigin, - classInternalName: String, - signatures: MultiMap + classOrigin: JvmDeclarationOrigin, + classInternalName: String, + signatures: MultiMap ) { for (predefinedSignature in PREDEFINED_SIGNATURES) { if (!signatures.containsKey(predefinedSignature)) continue @@ -122,9 +121,9 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( } private fun reportClashingSignaturesInHierarchy( - classOrigin: JvmDeclarationOrigin, - classInternalName: String, - signatures: MultiMap + classOrigin: JvmDeclarationOrigin, + classInternalName: String, + signatures: MultiMap ) { val descriptor = classOrigin.descriptor if (descriptor !is ClassDescriptor) return @@ -141,9 +140,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( for ((rawSignature, origins) in groupedBySignature.entrySet()) { if (origins.size <= 1) continue - val diagnostic = computeDiagnosticToReport(classOrigin, classInternalName, rawSignature, origins) - - when (diagnostic) { + when (val diagnostic = computeDiagnosticToReport(classOrigin, classInternalName, rawSignature, origins)) { is ConflictingDeclarationError.AccidentalOverride -> { diagnostics.report(ErrorsJvm.ACCIDENTAL_OVERRIDE.on(diagnostic.element, diagnostic.data)) } @@ -156,16 +153,17 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( private sealed class ConflictingDeclarationError(val element: PsiElement, val data: ConflictingJvmDeclarationsData) { class AccidentalOverride(element: PsiElement, data: ConflictingJvmDeclarationsData) : - ConflictingDeclarationError(element, data) + ConflictingDeclarationError(element, data) + class ConflictingInheritedJvmDeclarations(element: PsiElement, data: ConflictingJvmDeclarationsData) : - ConflictingDeclarationError(element, data) + ConflictingDeclarationError(element, data) } private fun computeDiagnosticToReport( - classOrigin: JvmDeclarationOrigin, - classInternalName: String, - rawSignature: RawSignature, - origins: Collection + classOrigin: JvmDeclarationOrigin, + classInternalName: String, + rawSignature: RawSignature, + origins: Collection ): ConflictingDeclarationError? { var memberElement: PsiElement? = null var ownNonFakeCount = 0 @@ -211,19 +209,17 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( if (member is PropertyDescriptor) { processMember(member.getter) processMember(member.setter) - } - else if (member is FunctionDescriptor) { + } else if (member is FunctionDescriptor) { val signatures = - if (member.kind == FAKE_OVERRIDE) - member.overriddenTreeUniqueAsSequence(useOriginal = true) - // drop the root (itself) - .drop(1) - .mapTo(HashSet()) { it.asRawSignature() } - else - setOf(member.asRawSignature()) + if (member.kind == FAKE_OVERRIDE) + member.overriddenTreeUniqueAsSequence(useOriginal = true) + // drop the root (itself) + .drop(1) + .mapTo(HashSet()) { it.asRawSignature() } + else + setOf(member.asRawSignature()) - signatures.forEach { - rawSignature -> + signatures.forEach { rawSignature -> groupedBySignature.putValue(rawSignature, OtherOrigin(member)) } } @@ -232,10 +228,10 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( descriptor.defaultType.memberScope.getContributedDescriptors().forEach(::processMember) descriptor.getParentJavaStaticClassScope()?.run { getContributedDescriptors(DescriptorKindFilter.FUNCTIONS) - .filter { - it is FunctionDescriptor && DescriptorVisibilities.isVisibleIgnoringReceiver(it, descriptor) - } - .forEach(::processMember) + .filter { + it is FunctionDescriptor && DescriptorVisibilities.isVisibleIgnoringReceiver(it, descriptor) + } + .forEach(::processMember) } return groupedBySignature diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index 0661fc5564b..ba87e6e0869 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -238,6 +238,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/classes/kt43217.kt"); } + @Test + @TestMetadata("kt45853.kt") + public void testKt45853() throws Exception { + runTest("compiler/testData/ir/irText/classes/kt45853.kt"); + } + @Test @TestMetadata("lambdaInDataClassDefaultParameter.kt") public void testLambdaInDataClassDefaultParameter() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 74e1a012eaa..fc8b3039b71 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -696,4 +696,8 @@ fun IrExpression?.isPure( } return false -} \ No newline at end of file +} + +fun IrDeclaration.isFromJava(): Boolean = + origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB || + parent is IrDeclaration && (parent as IrDeclaration).isFromJava() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 0208d5af628..27f506abd77 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen +import org.jetbrains.kotlin.backend.common.ir.isFromJava import org.jetbrains.kotlin.backend.common.lower.BOUND_RECEIVER_PARAMETER import org.jetbrains.kotlin.backend.common.lower.SYNTHESIZED_INIT_BLOCK import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin @@ -12,7 +13,6 @@ import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.backend.jvm.intrinsics.JavaClassProperty import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound -import org.jetbrains.kotlin.backend.jvm.ir.isFromJava import org.jetbrains.kotlin.backend.jvm.ir.isInlineClassType import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry import org.jetbrains.kotlin.backend.jvm.lower.constantValue diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index a2a986d16b3..4c400d30d52 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen import org.jetbrains.kotlin.backend.common.ir.allOverridden +import org.jetbrains.kotlin.backend.common.ir.isFromJava import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny import org.jetbrains.kotlin.backend.common.ir.isTopLevel import org.jetbrains.kotlin.backend.common.lower.parentsWithSelf diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt index 0ec44a2618d..7155a005d74 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt @@ -349,10 +349,6 @@ val IrDeclaration.isStaticInlineClassReplacement: Boolean get() = origin == JvmLoweredDeclarationOrigin.STATIC_INLINE_CLASS_REPLACEMENT || origin == JvmLoweredDeclarationOrigin.STATIC_INLINE_CLASS_CONSTRUCTOR -fun IrDeclaration.isFromJava(): Boolean = - origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB || - parent is IrDeclaration && (parent as IrDeclaration).isFromJava() - val IrType.upperBound: IrType get() = erasedUpperBound.symbol.starProjectedType diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index cefb279c15f..31806050ced 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.ir.allOverridden -import org.jetbrains.kotlin.backend.common.ir.copyTo -import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny -import org.jetbrains.kotlin.backend.common.ir.isStatic +import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt index c80dd401a2d..619a78a04cf 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt @@ -6,11 +6,11 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass +import org.jetbrains.kotlin.backend.common.ir.isFromJava import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface -import org.jetbrains.kotlin.backend.jvm.ir.isFromJava import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt index ca692a7965b..45d4e60ba5a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt @@ -6,13 +6,13 @@ package org.jetbrains.kotlin.backend.jvm.lower.indy import org.jetbrains.kotlin.backend.common.ir.allOverridden +import org.jetbrains.kotlin.backend.common.ir.isFromJava import org.jetbrains.kotlin.backend.common.lower.VariableRemapper import org.jetbrains.kotlin.backend.common.lower.parents import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound import org.jetbrains.kotlin.backend.jvm.ir.getSingleAbstractMethod import org.jetbrains.kotlin.backend.jvm.ir.isCompiledToJvmDefault -import org.jetbrains.kotlin.backend.jvm.ir.isFromJava import org.jetbrains.kotlin.backend.jvm.lower.findInterfaceImplementation import org.jetbrains.kotlin.backend.jvm.lower.isPrivate import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt index 1fe8815e2bf..77c40a00971 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt @@ -5,17 +5,13 @@ package org.jetbrains.kotlin.backend.jvm.lower.inlineclasses -import org.jetbrains.kotlin.backend.common.ir.copyTo -import org.jetbrains.kotlin.backend.common.ir.copyTypeParameters -import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom -import org.jetbrains.kotlin.backend.common.ir.createDispatchReceiverParameter +import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.codegen.classFileContainsMethod import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.codegen.parentClassId import org.jetbrains.kotlin.backend.jvm.ir.isCompiledToJvmDefault -import org.jetbrains.kotlin.backend.jvm.ir.isFromJava import org.jetbrains.kotlin.backend.jvm.ir.isStaticInlineClassReplacement import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.InlineClassAbi.mangledNameFor import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt index 13c61d365dc..3a16d547fee 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt @@ -80,6 +80,8 @@ abstract class DescriptorMangleComputer(protected val builder: StringBuilder, pr protected open fun addReturnType(): Boolean = false + protected open fun addReturnTypeSpecialCase(functionDescriptor: FunctionDescriptor): Boolean = false + open fun FunctionDescriptor.specialValueParamPrefix(param: ValueParameterDescriptor): String = "" private val CallableDescriptor.isRealStatic: Boolean @@ -125,7 +127,7 @@ abstract class DescriptorMangleComputer(protected val builder: StringBuilder, pr .collectForMangler(builder, MangleConstant.TYPE_PARAMETERS) { mangleTypeParameter(this, it) } returnType?.run { - if (!isCtor && !isUnit() && addReturnType()) { + if (!isCtor && !isUnit() && (addReturnType() || addReturnTypeSpecialCase(this@mangleSignature))) { mangleType(builder, this) } } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt index e111038fd4f..6a139ef05ad 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt @@ -33,6 +33,8 @@ abstract class IrMangleComputer(protected val builder: StringBuilder, private va open fun addReturnType(): Boolean = false + protected open fun addReturnTypeSpecialCase(irFunction: IrFunction): Boolean = false + abstract override fun copy(newMode: MangleMode): IrMangleComputer private fun StringBuilder.appendName(s: String) { @@ -121,7 +123,7 @@ abstract class IrMangleComputer(protected val builder: StringBuilder, private va typeParameters.collectForMangler(builder, MangleConstant.TYPE_PARAMETERS) { mangleTypeParameter(this, it) } - if (!isCtor && !returnType.isUnit() && addReturnType()) { + if (!isCtor && !returnType.isUnit() && (addReturnType() || addReturnTypeSpecialCase(this))) { mangleType(builder, returnType) } } diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt index 63411ea4f0a..b6dbce10e83 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.ir.backend.jvm.serialization +import org.jetbrains.kotlin.backend.common.ir.isFromJava import org.jetbrains.kotlin.backend.common.serialization.mangle.KotlinExportChecker import org.jetbrains.kotlin.backend.common.serialization.mangle.KotlinMangleComputer import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleConstant @@ -20,6 +21,8 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField abstract class AbstractJvmManglerIr : IrBasedKotlinManglerImpl() { @@ -33,7 +36,11 @@ abstract class AbstractJvmManglerIr : IrBasedKotlinManglerImpl() { } private class JvmIrManglerComputer(builder: StringBuilder, mode: MangleMode) : IrMangleComputer(builder, mode) { - override fun copy(newMode: MangleMode): IrMangleComputer = JvmIrManglerComputer(builder, newMode) + override fun copy(newMode: MangleMode): IrMangleComputer = + JvmIrManglerComputer(builder, newMode) + + override fun addReturnTypeSpecialCase(irFunction: IrFunction): Boolean = + irFunction.isFromJava() } override fun getExportChecker(): KotlinExportChecker = exportChecker @@ -55,8 +62,14 @@ abstract class AbstractJvmDescriptorMangler(private val mainDetector: MainFuncti override fun DeclarationDescriptor.isPlatformSpecificExported() = false } - private class JvmDescriptorManglerComputer(builder: StringBuilder, private val mainDetector: MainFunctionDetector?, mode: MangleMode) : - DescriptorMangleComputer(builder, mode) { + private class JvmDescriptorManglerComputer( + builder: StringBuilder, + private val mainDetector: MainFunctionDetector?, + mode: MangleMode + ) : DescriptorMangleComputer(builder, mode) { + override fun addReturnTypeSpecialCase(functionDescriptor: FunctionDescriptor): Boolean = + functionDescriptor is JavaMethodDescriptor + override fun copy(newMode: MangleMode): DescriptorMangleComputer = JvmDescriptorManglerComputer(builder, mainDetector, newMode) diff --git a/compiler/testData/codegen/bytecodeListing/kt45853.kt b/compiler/testData/codegen/bytecodeListing/kt45853.kt new file mode 100644 index 00000000000..59146a32b8b --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/kt45853.kt @@ -0,0 +1,18 @@ +// FILE: kt45853.kt +open class MyProblem() : ThrowableProblem() { + override fun getCause(): Exceptional? = super.cause +} + +// FILE: Exceptional.java +public interface Exceptional { + Exceptional getCause(); +} + +// FILE: ThrowableProblem.java +public abstract class ThrowableProblem extends RuntimeException implements Exceptional { + @Override + public ThrowableProblem getCause() { + // cast is safe, since the only way to set this is our constructor + return (ThrowableProblem) super.getCause(); + } +} diff --git a/compiler/testData/codegen/bytecodeListing/kt45853.txt b/compiler/testData/codegen/bytecodeListing/kt45853.txt new file mode 100644 index 00000000000..e07d6739cd0 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/kt45853.txt @@ -0,0 +1,6 @@ +@kotlin.Metadata +public class MyProblem { + // source: 'kt45853.kt' + public method (): void + public @org.jetbrains.annotations.Nullable method getCause(): Exceptional +} diff --git a/compiler/testData/codegen/bytecodeListing/kt45853a.kt b/compiler/testData/codegen/bytecodeListing/kt45853a.kt new file mode 100644 index 00000000000..7a9ab1bb9ad --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/kt45853a.kt @@ -0,0 +1,21 @@ +// FILE: kt45853a.kt +abstract class A { + open val a: A? get() = null +} + +class B() : AX() { + override fun getA(): X? = super.a +} + +// FILE: X.java +public interface X { + X getA(); +} + +// FILE: AX.java +public abstract class AX extends A implements X { + @Override + public AX getA() { + return (AX) super.getA(); + } +} diff --git a/compiler/testData/codegen/bytecodeListing/kt45853a.txt b/compiler/testData/codegen/bytecodeListing/kt45853a.txt new file mode 100644 index 00000000000..6ca08fd11f3 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/kt45853a.txt @@ -0,0 +1,13 @@ +@kotlin.Metadata +public abstract class A { + // source: 'kt45853a.kt' + public method (): void + public @org.jetbrains.annotations.Nullable method getA(): A +} + +@kotlin.Metadata +public final class B { + // source: 'kt45853a.kt' + public method (): void + public @org.jetbrains.annotations.Nullable method getA(): X +} diff --git a/compiler/testData/ir/irText/classes/kt45853.kt b/compiler/testData/ir/irText/classes/kt45853.kt new file mode 100644 index 00000000000..3cb6c1627d5 --- /dev/null +++ b/compiler/testData/ir/irText/classes/kt45853.kt @@ -0,0 +1,25 @@ +// SKIP_KT_DUMP +// DUMP_EXTERNAL_CLASS: X +// DUMP_EXTERNAL_CLASS: AX +// FILE: kt45853.kt + +abstract class A { + abstract val a: A? +} + +class B() : AX() { + override fun getA(): X? = super.a +} + +// FILE: X.java +public interface X { + X getA(); +} + +// FILE: AX.java +public abstract class AX extends A implements X { + @Override + public AX getA() { + return (AX) super.getA(); + } +} diff --git a/compiler/testData/ir/irText/classes/kt45853.txt b/compiler/testData/ir/irText/classes/kt45853.txt new file mode 100644 index 00000000000..3cd72032934 --- /dev/null +++ b/compiler/testData/ir/irText/classes/kt45853.txt @@ -0,0 +1,59 @@ +FILE fqName: fileName:/kt45853.kt + CLASS CLASS name:A modality:ABSTRACT visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + CONSTRUCTOR visibility:public <> () returnType:.A [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A modality:ABSTRACT visibility:public superTypes:[kotlin.Any]' + PROPERTY name:a visibility:public modality:ABSTRACT [val] + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT <> ($this:.A) returnType:.A? + correspondingProperty: PROPERTY name:a visibility:public modality:ABSTRACT [val] + $this: VALUE_PARAMETER name: type:.A + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.AX] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.B + CONSTRUCTOR visibility:public <> () returnType:.B [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in .AX' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.AX]' + FUN name:getA visibility:public modality:OPEN <> ($this:.B) returnType:.X? + overridden: + public abstract fun getA (): @[FlexibleNullability] .X? [fake_override] declared in .AX + $this: VALUE_PARAMETER name: type:.B + BLOCK_BODY + RETURN type=kotlin.Nothing from='public open fun getA (): .X? declared in .B' + CALL 'public open fun (): @[EnhancedNullability] .AX? declared in .AX' superQualifier='CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:AX modality:ABSTRACT visibility:public superTypes:[.A; .X]' type=@[EnhancedNullability] .AX? origin=GET_PROPERTY + $this: GET_VAR ': .B declared in .B.getA' type=.B origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .AX + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .AX + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .AX + $this: VALUE_PARAMETER name: type:kotlin.Any + PROPERTY FAKE_OVERRIDE name:a visibility:public modality:OPEN [fake_override,val] + FUN FAKE_OVERRIDE name: visibility:public modality:OPEN <> ($this:.AX) returnType:@[EnhancedNullability] .AX? [fake_override] + annotations: + Override + correspondingProperty: PROPERTY FAKE_OVERRIDE name:a visibility:public modality:OPEN [fake_override,val] + overridden: + public open fun (): @[EnhancedNullability] .AX? declared in .AX + $this: VALUE_PARAMETER name: type:.AX diff --git a/compiler/testData/ir/irText/classes/kt45853__AX.txt b/compiler/testData/ir/irText/classes/kt45853__AX.txt new file mode 100644 index 00000000000..281e3ab2d77 --- /dev/null +++ b/compiler/testData/ir/irText/classes/kt45853__AX.txt @@ -0,0 +1,31 @@ +CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:AX modality:ABSTRACT visibility:public superTypes:[; .X] + $this: VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name: type:.AX + CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB visibility:public <> () returnType:.AX [primary] + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType: [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): [fake_override,operator] declared in .A + public open fun equals (other: kotlin.Any?): [fake_override,operator] declared in .X + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType: [fake_override] + overridden: + public open fun hashCode (): [fake_override] declared in .A + public open fun hashCode (): [fake_override] declared in .X + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType: [fake_override] + overridden: + public open fun toString (): [fake_override] declared in .A + public open fun toString (): [fake_override] declared in .X + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:getA visibility:public modality:ABSTRACT <> ($this:.X) returnType:.X? [fake_override] + overridden: + public abstract fun getA (): .X? declared in .X + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.X + PROPERTY IR_EXTERNAL_DECLARATION_STUB name:a visibility:public modality:OPEN [val] + FUN IR_EXTERNAL_DECLARATION_STUB name: visibility:public modality:OPEN <> ($this:.AX) returnType:.AX? + annotations: + + correspondingProperty: PROPERTY IR_EXTERNAL_DECLARATION_STUB name:a visibility:public modality:OPEN [val] + overridden: + public abstract fun (): .A? declared in .A + $this: VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name: type:.AX diff --git a/compiler/testData/ir/irText/classes/kt45853__X.txt b/compiler/testData/ir/irText/classes/kt45853__X.txt new file mode 100644 index 00000000000..87105027c2d --- /dev/null +++ b/compiler/testData/ir/irText/classes/kt45853__X.txt @@ -0,0 +1,17 @@ +CLASS IR_EXTERNAL_DECLARATION_STUB INTERFACE name:X modality:ABSTRACT visibility:public superTypes:[] + $this: VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name: type:.X + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:, other:?) returnType: [fake_override,operator] + overridden: + public open fun equals (other: ?): [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType: [fake_override] + overridden: + public open fun hashCode (): declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType: [fake_override] + overridden: + public open fun toString (): declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN IR_EXTERNAL_DECLARATION_STUB name:getA visibility:public modality:ABSTRACT <> ($this:.X) returnType:.X? + $this: VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name: type:.X diff --git a/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.kt b/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.kt index 0017d149080..7fd8fc5c8ab 100644 --- a/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.kt +++ b/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.kt @@ -1,5 +1,5 @@ +// DUMP_EXTERNAL_CLASS: J1 // FILE: constructorWithOwnTypeParametersCall.kt -// DUMP_EXTERNAL_CLASS J1 fun testKotlin() = K1().K2() diff --git a/compiler/testData/ir/irText/stubs/constFromBuiltins.kt b/compiler/testData/ir/irText/stubs/constFromBuiltins.kt index ca0a7834371..ae04771280b 100644 --- a/compiler/testData/ir/irText/stubs/constFromBuiltins.kt +++ b/compiler/testData/ir/irText/stubs/constFromBuiltins.kt @@ -1,4 +1,4 @@ // FIR_IDENTICAL -// DUMP_EXTERNAL_CLASS kotlin.Int +// DUMP_EXTERNAL_CLASS: kotlin.Int val test = Int.MIN_VALUE \ No newline at end of file diff --git a/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.kt b/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.kt index b65da0bc371..b520fc3b3ee 100644 --- a/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.kt +++ b/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.kt @@ -1,5 +1,5 @@ +// DUMP_EXTERNAL_CLASS: J1 // FILE: javaConstructorWithTypeParameters.kt -// DUMP_EXTERNAL_CLASS J1 fun test1() = J1() diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index ee9d85fac82..32e22a487e0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -238,6 +238,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/classes/kt43217.kt"); } + @Test + @TestMetadata("kt45853.kt") + public void testKt45853() throws Exception { + runTest("compiler/testData/ir/irText/classes/kt45853.kt"); + } + @Test @TestMetadata("lambdaInDataClassDefaultParameter.kt") public void testLambdaInDataClassDefaultParameter() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 687351fa05d..befda0b112d 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -170,6 +170,16 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/kt43440.kt"); } + @TestMetadata("kt45853.kt") + public void testKt45853() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/kt45853.kt"); + } + + @TestMetadata("kt45853a.kt") + public void testKt45853a() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/kt45853a.kt"); + } + @TestMetadata("localFunction.kt") public void testLocalFunction() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/localFunction.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java index 7542fdb0c9e..511a09af7b1 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java @@ -170,6 +170,16 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/kt43440.kt"); } + @TestMetadata("kt45853.kt") + public void testKt45853() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/kt45853.kt"); + } + + @TestMetadata("kt45853a.kt") + public void testKt45853a() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/kt45853a.kt"); + } + @TestMetadata("localFunction.kt") public void testLocalFunction() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/localFunction.kt");