Report the error when a declaration in Kotlin accidentally overrides a static member from Java

This commit is contained in:
Zalim Bashorov
2015-10-09 21:40:33 +03:00
parent 72a686f9e0
commit 79d38a6c8f
26 changed files with 756 additions and 14 deletions
@@ -29,11 +29,14 @@ import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider
import org.jetbrains.kotlin.fileClasses.isInsideJvmMultifileClassFile
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor
import org.jetbrains.kotlin.load.java.descriptors.getParentJavaStaticClassScope
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.psi.JetNamedFunction
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.jvm.diagnostics.*
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.utils.addIfNotNull
import java.util.*
@@ -105,14 +108,14 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
if (origins.size() <= 1) continue
var memberElement: PsiElement? = null
var nonFakeCount = 0
var ownNonFakeCount = 0
for (origin in origins) {
val member = origin.descriptor as? CallableMemberDescriptor?
if (member != null && member.getKind() != FAKE_OVERRIDE) {
nonFakeCount++
if (member != null && member.containingDeclaration == classOrigin.descriptor && member.getKind() != FAKE_OVERRIDE) {
ownNonFakeCount++
// If there's more than one real element, the clashing signature is already reported.
// Only clashes between fake overrides are interesting here
if (nonFakeCount > 1) continue@signatures
if (ownNonFakeCount > 1) continue@signatures
if (member.getKind() != DELEGATION) {
// Delegates don't have declarations in the code
@@ -158,8 +161,13 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
}
}
for (member in descriptor.getDefaultType().getMemberScope().getDescriptors()) {
processMember(member)
descriptor.defaultType.memberScope.getDescriptors().forEach(::processMember)
descriptor.getParentJavaStaticClassScope()?.run {
getDescriptors(DescriptorKindFilter.FUNCTIONS)
.filter {
it is FunctionDescriptor && Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, it, descriptor)
}
.forEach(::processMember)
}
return groupedBySignature
@@ -171,4 +179,4 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
return descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE
&& descriptor.getOverriddenDescriptors().all { isOrOverridesSamAdapter(it) }
}
}
}