diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 24b1673fe49..6b46f2834f7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.resolve.calls.CallResolverUtil; import org.jetbrains.kotlin.resolve.constants.ArrayValue; import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant; import org.jetbrains.kotlin.resolve.constants.JavaClassValue; +import org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature; @@ -75,8 +76,7 @@ import static org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.callableDescr import static org.jetbrains.kotlin.resolve.DescriptorUtils.isFunctionLiteral; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE; -import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.OtherOrigin; -import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.Synthetic; +import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.*; import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class FunctionCodegen { @@ -799,7 +799,7 @@ public class FunctionCodegen { ) { int flags = ACC_PUBLIC | ACC_BRIDGE | ACC_SYNTHETIC; // TODO. - MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, delegateTo.getName(), bridge.getDescriptor(), null, null); + MethodVisitor mv = v.newMethod(DiagnosticsPackage.Bridge(descriptor, origin), flags, delegateTo.getName(), bridge.getDescriptor(), null, null); if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; mv.visitCode(); @@ -836,7 +836,7 @@ public class FunctionCodegen { final StackValue field ) { generateMethod( - OtherOrigin(delegateFunction), delegateFunction, + Delegation(null, delegateFunction), delegateFunction, new FunctionGenerationStrategy() { @Override public void generateBody( 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 ff61d17a8b7..627a2f01bf0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt @@ -32,6 +32,11 @@ import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.diagnostics.DiagnosticSink +private val EXTERNAL_SOURCES_KINDS = array( + JvmDeclarationOriginKind.DELEGATION_TO_TRAIT_IMPL, + JvmDeclarationOriginKind.DELEGATION, + JvmDeclarationOriginKind.BRIDGE) + class BuilderFactoryForDuplicateSignatureDiagnostics( builderFactory: ClassBuilderFactory, bindingContext: BindingContext, @@ -42,15 +47,20 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( private val typeMapper = JetTypeMapper(bindingContext, ClassBuilderMode.LIGHT_CLASSES) override fun handleClashingSignatures(data: ConflictingJvmDeclarationsData) { - val allDelegatedToTraitImpls = data.signatureOrigins.all { it.originKind == JvmDeclarationOriginKind.DELEGATION_TO_TRAIT_IMPL } + val noOwnImplementations = data.signatureOrigins.all { it.originKind in EXTERNAL_SOURCES_KINDS } val elements = LinkedHashSet() - for (origin in data.signatureOrigins) { - var element = origin.element - if (element == null || allDelegatedToTraitImpls) { - element = data.classOrigin.element + if (noOwnImplementations) { + elements.addIfNotNull(data.classOrigin.element) + } + else { + for (origin in data.signatureOrigins) { + var element = origin.element + if (element == null || origin.originKind in EXTERNAL_SOURCES_KINDS) { + element = data.classOrigin.element + } + elements.addIfNotNull(element) } - elements.addIfNotNull(element) } for (element in elements) { @@ -141,4 +151,4 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( return descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE && descriptor.getOverriddenDescriptors().all { isOrOverridesSamAdapter(it) } } -} +} \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt index a7cbf765833..275abfaff3b 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.psi.JetClassOrObject import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind.* import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils public enum class MemberKind { FIELD METHOD } @@ -36,6 +37,8 @@ public enum class JvmDeclarationOriginKind { PACKAGE_PART TRAIT_IMPL DELEGATION_TO_TRAIT_IMPL + DELEGATION + BRIDGE SYNTHETIC // this means that there's no proper descriptor for this jvm declaration } @@ -58,11 +61,16 @@ public fun OtherOrigin(element: PsiElement): JvmDeclarationOrigin = OtherOrigin( public fun OtherOrigin(descriptor: DeclarationDescriptor): JvmDeclarationOrigin = OtherOrigin(null, descriptor) +public fun Bridge(descriptor: DeclarationDescriptor, element: PsiElement? = DescriptorToSourceUtils.descriptorToDeclaration(descriptor)): JvmDeclarationOrigin = + JvmDeclarationOrigin(BRIDGE, element, descriptor) + public fun PackageFacade(descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_FACADE, null, descriptor) public fun PackagePart(file: JetFile, descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_PART, file, descriptor) public fun TraitImpl(element: JetClassOrObject, descriptor: ClassDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(TRAIT_IMPL, element, descriptor) -public fun DelegationToTraitImpl(element: PsiElement?, descriptor: FunctionDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(DELEGATION_TO_TRAIT_IMPL, element, descriptor) +public fun DelegationToTraitImpl(element: PsiElement?, descriptor: FunctionDescriptor): JvmDeclarationOrigin = + JvmDeclarationOrigin(DELEGATION_TO_TRAIT_IMPL, element, descriptor) -public fun Synthetic(element: PsiElement?, descriptor: CallableMemberDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(SYNTHETIC, element, descriptor) +public fun Delegation(element: PsiElement?, descriptor: FunctionDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(DELEGATION, element, descriptor) +public fun Synthetic(element: PsiElement?, descriptor: CallableMemberDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(SYNTHETIC, element, descriptor) \ No newline at end of file diff --git a/compiler/testData/cli/jvm/signatureClash.out b/compiler/testData/cli/jvm/signatureClash.out index 12ffca2e30f..7600e656965 100644 --- a/compiler/testData/cli/jvm/signatureClash.out +++ b/compiler/testData/cli/jvm/signatureClash.out @@ -14,7 +14,7 @@ ERROR: compiler/testData/cli/jvm/signatureClash.kt: (12, 1) Platform declaration ERROR: compiler/testData/cli/jvm/signatureClash.kt: (13, 1) Platform declaration clash: The following declarations have the same JVM signature (getB()I): fun (): kotlin.Int fun getB(): kotlin.Int -ERROR: compiler/testData/cli/jvm/signatureClash.kt: (16, 5) Platform declaration clash: The following declarations have the same JVM signature (getTr()I): +ERROR: compiler/testData/cli/jvm/signatureClash.kt: (19, 7) Platform declaration clash: The following declarations have the same JVM signature (getTr()I): fun (): kotlin.Int fun getTr(): kotlin.Int ERROR: compiler/testData/cli/jvm/signatureClash.kt: (20, 5) Platform declaration clash: The following declarations have the same JVM signature (getTr()I): diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/overridesNothing.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/overridesNothing.kt index f9ddf9704d2..6c012b7706a 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/overridesNothing.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/overridesNothing.kt @@ -2,6 +2,6 @@ trait B { fun getX() = 1 } -class C : B { +class C : B { override val x = 1 } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitFunctionOverriddenByProperty.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitFunctionOverriddenByProperty.kt index 9f4e06890c5..51c5ab88129 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitFunctionOverriddenByProperty.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitFunctionOverriddenByProperty.kt @@ -2,7 +2,7 @@ trait T { fun getX() = 1 } -class C : T { +class C : T { val x: Int get() = 1 } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitPropertyOverriddenByFunction.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitPropertyOverriddenByFunction.kt index 64c0136faa5..db45ec43175 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitPropertyOverriddenByFunction.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitPropertyOverriddenByFunction.kt @@ -3,6 +3,6 @@ trait T { get() = 1 } -class C : T { +class C : T { fun getX() = 1 } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt index fe09bc45cdf..c684dce2dcb 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt @@ -8,6 +8,6 @@ trait Bar { fun foo(l: List) {} } -class Baz(): Foo, Bar { +class Baz(): Foo, Bar { fun foo(l: List) {} } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/oneTrait.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/oneTrait.kt index f8bb39a3159..e5d4ed3fa70 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/oneTrait.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/oneTrait.kt @@ -2,6 +2,6 @@ trait T { fun getX() = 1 } -class C : T { +class C : T { val x = 1 } \ No newline at end of file