BuilderFactoryForDuplicateSignatureDiagnostics code cleaned up

This commit is contained in:
Andrey Breslav
2014-06-06 15:02:36 +04:00
parent 42aa9e2378
commit 05685bea5b
2 changed files with 44 additions and 40 deletions
@@ -18,22 +18,21 @@ package org.jetbrains.jet.codegen.state
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.util.containers.MultiMap 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.ClassBuilderFactory
import org.jetbrains.jet.codegen.SignatureCollectingClassBuilderFactory import org.jetbrains.jet.codegen.SignatureCollectingClassBuilderFactory
import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.diagnostics.DiagnosticHolder import org.jetbrains.jet.lang.diagnostics.DiagnosticHolder
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.resolve.BindingContextUtils 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.diagnostics.*
import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodSignature
import java.util.* import java.util.*
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DELEGATION import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DELEGATION
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE 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, builderFactory: ClassBuilderFactory,
private val typeMapper: JetTypeMapper, private val typeMapper: JetTypeMapper,
private val bindingContext: BindingContext, private val bindingContext: BindingContext,
@@ -49,9 +48,7 @@ class BuilderfactoryForDuplicateSignatureDiagnostics(
if (element == null || allDelegatedToTraitImpls) { if (element == null || allDelegatedToTraitImpls) {
element = data.classOrigin.element element = data.classOrigin.element
} }
if (element != null) { elements.addIfNotNull(element)
elements.add(element!!)
}
} }
for (element in elements) { for (element in elements) {
@@ -63,34 +60,7 @@ class BuilderfactoryForDuplicateSignatureDiagnostics(
val descriptor = classOrigin.descriptor val descriptor = classOrigin.descriptor
if (descriptor !is ClassDescriptor) return if (descriptor !is ClassDescriptor) return
val groupedBySignature = MultiMap.create<RawSignature, CallableMemberDescriptor>() val groupedBySignature = groupDescriptorsBySignature(descriptor)
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)
}
}
@signatures @signatures
for ((rawSignature, members) in groupedBySignature.entrySet()!!) { for ((rawSignature, members) in groupedBySignature.entrySet()!!) {
@@ -116,11 +86,45 @@ class BuilderfactoryForDuplicateSignatureDiagnostics(
} }
val elementToReportOn = memberElement ?: classOrigin.element 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, members.map { OtherOrigin(it) })
val data = ConflictingJvmDeclarationsData(classInternalName, classOrigin, rawSignature, origins)
diagnostics.report(ErrorsJvm.ACCIDENTAL_OVERRIDE.on(elementToReportOn, data)) diagnostics.report(ErrorsJvm.ACCIDENTAL_OVERRIDE.on(elementToReportOn, data))
} }
} }
private fun groupDescriptorsBySignature(descriptor: ClassDescriptor): MultiMap<RawSignature, CallableMemberDescriptor> {
val groupedBySignature = MultiMap.create<RawSignature, CallableMemberDescriptor>()
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) }
}
} }
@@ -145,7 +145,7 @@ public class GenerationState {
this.typeMapper = new JetTypeMapper(this.bindingContext, classBuilderMode); this.typeMapper = new JetTypeMapper(this.bindingContext, classBuilderMode);
this.intrinsics = new IntrinsicMethods(); this.intrinsics = new IntrinsicMethods();
this.classFileFactory = new ClassFileFactory(this, new BuilderfactoryForDuplicateSignatureDiagnostics( this.classFileFactory = new ClassFileFactory(this, new BuilderFactoryForDuplicateSignatureDiagnostics(
builderFactory, typeMapper, bindingContext, diagnostics)); builderFactory, typeMapper, bindingContext, diagnostics));
this.generateNotNullAssertions = generateNotNullAssertions; this.generateNotNullAssertions = generateNotNullAssertions;