BuilderFactoryForDuplicateSignatureDiagnostics code cleaned up
This commit is contained in:
+43
-39
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user