From 0498c3b765421c6fe8d214fe0325441b27bb608d Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Tue, 29 May 2018 14:35:36 +0200 Subject: [PATCH] Don't copy descriptor for delegation generation Actually source element for DEFAULT_IMPL_DELEGATION_TO_SUPERINTERFACE_DEFAULT_IMPL was always null cause descriptor was copies with new kind=DECLARATION. That causes element recalculation in DiagnosticFactory: element = data.classOrigin.element So DEFAULT_IMPL_DELEGATION_TO_SUPERINTERFACE_DEFAULT_IMPL is added to EXTERNAL_SOURCES_KINDS --- .../codegen/InterfaceImplBodyCodegen.kt | 12 +++------ .../kotlin/codegen/MemberCodegen.java | 25 ++----------------- ...FactoryForDuplicateSignatureDiagnostics.kt | 1 + 3 files changed, 6 insertions(+), 32 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt index bf76be8dc9a..d9624ffd991 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt @@ -72,23 +72,17 @@ class InterfaceImplBodyCodegen( // If implementation is a default interface method (JVM 8 only) if (implementation.isDefinitelyNotDefaultImplsMethod()) continue - // TODO: we need to copy descriptor otherwise declaration clash diagnostic is missed, see testTraitFunctionOverriddenByPropertyInTrait - val copy = memberDescriptor.copy( - memberDescriptor.containingDeclaration, Modality.OPEN, memberDescriptor.visibility, - CallableMemberDescriptor.Kind.DECLARATION, true - ) - if (memberDescriptor is FunctionDescriptor) { - generateDelegationToSuperDefaultImpls(copy as FunctionDescriptor, implementation as FunctionDescriptor) + generateDelegationToSuperDefaultImpls(memberDescriptor, implementation as FunctionDescriptor) } else if (memberDescriptor is PropertyDescriptor) { implementation as PropertyDescriptor - val getter = (copy as PropertyDescriptor).getter + val getter = memberDescriptor.getter val implGetter = implementation.getter if (getter != null && implGetter != null) { generateDelegationToSuperDefaultImpls(getter, implGetter) } - val setter = copy.setter + val setter = memberDescriptor.setter val implSetter = implementation.setter if (setter != null && implSetter != null) { generateDelegationToSuperDefaultImpls(setter, implSetter) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index e3107eab594..65a224a0712 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -9,7 +9,6 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.psi.PsiElement; import kotlin.Unit; import kotlin.jvm.functions.Function0; -import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.backend.common.CodegenUtil; @@ -45,7 +44,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.jvm.AsmTypes; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter; import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.serialization.DescriptorSerializer; import org.jetbrains.kotlin.storage.LockBasedStorageManager; @@ -728,23 +726,12 @@ public abstract class MemberCodegen existingDescriptors = - ((ClassDescriptor) directMember.getContainingDeclaration()).getUnsubstitutedMemberScope() - .getContributedDescriptors( - DescriptorKindFilter.CALLABLES, name -> name.equals(directMember.getName())); - if (!existingDescriptors.contains(original)) { - //TODO: don't try to copy descriptros in InterfaceImplBodyCodegen.generateSyntheticPartsAfterBody, - // investigate problem with diagnostic and remove this HACK code - descriptor = unwrapFakeOverrideSkipFirst(original).getOriginal(); + FunctionDescriptor descriptor = unwrapFakeOverrideToAnyDeclaration(original).getOriginal(); + if (descriptor != original) { descriptor = descriptor .copy(original.getContainingDeclaration(), descriptor.getModality(), descriptor.getVisibility(), descriptor.getKind(), false); } - else { - descriptor = original; - } generateMethodCallTo(descriptor, accessor, codegen.v).coerceTo(signature.getReturnType(), null, codegen.v); } else { @@ -906,12 +893,4 @@ public abstract class MemberCodegen D unwrapFakeOverrideSkipFirst(@NotNull D descriptor) { - Collection overridden = descriptor.getOverriddenDescriptors(); - if (overridden.isEmpty()) { - throw new IllegalStateException("Fake override should have at least one overridden descriptor: " + descriptor); - } - descriptor = (D) overridden.iterator().next(); - return unwrapFakeOverride(descriptor); - } } 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 894134ae46e..b4cf1a59f44 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt @@ -26,6 +26,7 @@ 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 )