From 05685bea5b478399da1c70da50a075940e7d113e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 6 Jun 2014 15:02:36 +0400 Subject: [PATCH] BuilderFactoryForDuplicateSignatureDiagnostics code cleaned up --- ...factoryForDuplicateSignatureDiagnostics.kt | 82 ++++++++++--------- .../jet/codegen/state/GenerationState.java | 2 +- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/BuilderfactoryForDuplicateSignatureDiagnostics.kt b/compiler/backend/src/org/jetbrains/jet/codegen/state/BuilderfactoryForDuplicateSignatureDiagnostics.kt index 0eb0c8e87d1..935ab599a2f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/BuilderfactoryForDuplicateSignatureDiagnostics.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/BuilderfactoryForDuplicateSignatureDiagnostics.kt @@ -18,22 +18,21 @@ package org.jetbrains.jet.codegen.state import com.intellij.psi.PsiElement import com.intellij.util.containers.MultiMap -import kotlin.Function1 -import org.jetbrains.annotations.Nullable import org.jetbrains.jet.codegen.ClassBuilderFactory import org.jetbrains.jet.codegen.SignatureCollectingClassBuilderFactory import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.diagnostics.DiagnosticHolder import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContextUtils -import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil import org.jetbrains.jet.lang.resolve.java.diagnostics.* -import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodSignature import java.util.* import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DELEGATION import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE +import org.jetbrains.jet.utils.addIfNotNull +import org.jetbrains.jet.codegen.ClassBuilderMode +import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor -class BuilderfactoryForDuplicateSignatureDiagnostics( +class BuilderFactoryForDuplicateSignatureDiagnostics( builderFactory: ClassBuilderFactory, private val typeMapper: JetTypeMapper, private val bindingContext: BindingContext, @@ -49,9 +48,7 @@ class BuilderfactoryForDuplicateSignatureDiagnostics( if (element == null || allDelegatedToTraitImpls) { element = data.classOrigin.element } - if (element != null) { - elements.add(element!!) - } + elements.addIfNotNull(element) } for (element in elements) { @@ -63,34 +60,7 @@ class BuilderfactoryForDuplicateSignatureDiagnostics( val descriptor = classOrigin.descriptor if (descriptor !is ClassDescriptor) return - val groupedBySignature = MultiMap.create() - val queue = LinkedList(descriptor.getDefaultType().getMemberScope().getAllDescriptors()) - while (!queue.isEmpty()) { - val member = queue.poll() - if (member is DeclarationDescriptorWithVisibility && member.getVisibility() == Visibilities.INVISIBLE_FAKE) { - // a member of super is not visible: no override - continue - } - if (member is CallableMemberDescriptor && CallResolverUtil.isOrOverridesSynthesized(member)) { - // if a signature clashes with a SAM-adapter or something like that, there's no harm - continue - } - if (member is PropertyDescriptor) { - val getter = member.getGetter() - if (getter != null) { - queue.add(getter) - } - val setter = member.getSetter() - if (setter != null) { - queue.add(setter) - } - } - else if (member is FunctionDescriptor) { - val methodSignature = typeMapper.mapSignature(member) - val rawSignature = RawSignature(methodSignature.getAsmMethod().getName()!!, methodSignature.getAsmMethod().getDescriptor()!!, MemberKind.METHOD) - groupedBySignature.putValue(rawSignature, member) - } - } + val groupedBySignature = groupDescriptorsBySignature(descriptor) @signatures for ((rawSignature, members) in groupedBySignature.entrySet()!!) { @@ -116,11 +86,45 @@ class BuilderfactoryForDuplicateSignatureDiagnostics( } val elementToReportOn = memberElement ?: classOrigin.element - if (elementToReportOn == null) return + if (elementToReportOn == null) return // TODO: it'd be better to report this error without any element at all - val origins = members.map { OtherOrigin(it) } - val data = ConflictingJvmDeclarationsData(classInternalName, classOrigin, rawSignature, origins) + val data = ConflictingJvmDeclarationsData(classInternalName, classOrigin, rawSignature, members.map { OtherOrigin(it) }) diagnostics.report(ErrorsJvm.ACCIDENTAL_OVERRIDE.on(elementToReportOn, data)) } } + + private fun groupDescriptorsBySignature(descriptor: ClassDescriptor): MultiMap { + val groupedBySignature = MultiMap.create() + + fun processMember(member: DeclarationDescriptor?) { + // a member of super is not visible: no override + if (member is DeclarationDescriptorWithVisibility && member.getVisibility() == Visibilities.INVISIBLE_FAKE) return + // if a signature clashes with a SAM-adapter or something like that, there's no harm + if (member is CallableMemberDescriptor && isOrOverridesSamAdapter(member)) return + + if (member is PropertyDescriptor) { + processMember(member.getGetter()) + processMember(member.getSetter()) + } + else if (member is FunctionDescriptor) { + val methodSignature = typeMapper.mapSignature(member) + val rawSignature = RawSignature( + methodSignature.getAsmMethod().getName()!!, methodSignature.getAsmMethod().getDescriptor()!!, MemberKind.METHOD) + groupedBySignature.putValue(rawSignature, member) + } + } + + for (member in descriptor.getDefaultType().getMemberScope().getAllDescriptors()) { + processMember(member) + } + + return groupedBySignature + } + + public fun isOrOverridesSamAdapter(descriptor: CallableMemberDescriptor): Boolean { + if (descriptor is SamAdapterDescriptor<*>) return true + + return descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE + && descriptor.getOverriddenDescriptors().all { isOrOverridesSamAdapter(it) } + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java index 27637df19e8..0e2c2ab9add 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java @@ -145,7 +145,7 @@ public class GenerationState { this.typeMapper = new JetTypeMapper(this.bindingContext, classBuilderMode); this.intrinsics = new IntrinsicMethods(); - this.classFileFactory = new ClassFileFactory(this, new BuilderfactoryForDuplicateSignatureDiagnostics( + this.classFileFactory = new ClassFileFactory(this, new BuilderFactoryForDuplicateSignatureDiagnostics( builderFactory, typeMapper, bindingContext, diagnostics)); this.generateNotNullAssertions = generateNotNullAssertions;