Report the error when a declaration in Kotlin accidentally overrides a static member from Java
This commit is contained in:
+15
-7
@@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user