diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt index af4e5ee8bde..c85dd246446 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt @@ -26,8 +26,10 @@ import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature. import org.jetbrains.kotlin.load.java.isFromBuiltins import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.JavaToKotlinClassMap +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.NonReportingOverrideStrategy -import org.jetbrains.kotlin.resolve.OverrideResolver +import org.jetbrains.kotlin.resolve.OverridingStrategy +import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeUniqueAsSequence @@ -206,7 +208,7 @@ class CollectionStubMethodGenerator( ): List { val result = ArrayList() - OverrideResolver.generateOverridesInAClass(klass, listOf(), object : NonReportingOverrideStrategy() { + generateOverridesInAClass(klass, object : NonReportingOverrideStrategy() { override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) { if (fakeOverride !is FunctionDescriptor) return val foundOverriddenFromDirectSuperClass = fakeOverride.findOverriddenFromDirectSuperClass(mutableCollectionClass) ?: return @@ -262,6 +264,20 @@ class CollectionStubMethodGenerator( } } + private fun generateOverridesInAClass(classDescriptor: ClassDescriptor, strategy: OverridingStrategy) { + @Suppress("UNCHECKED_CAST") + val membersFromSupertypesByName = + classDescriptor.typeConstructor.supertypes.flatMapTo(linkedSetOf()) { type -> + DescriptorUtils.getAllDescriptors(type.memberScope).filter { + it is PropertyDescriptor || it is SimpleFunctionDescriptor + } as List + }.groupBy { it.name } + + for ((name, fromSupertypes) in membersFromSupertypesByName) { + OverridingUtil.generateOverridesInFunctionGroup(name, fromSupertypes, emptyList(), classDescriptor, strategy) + } + } + private fun createSyntheticSubclass(): Pair> { val child = MutableClassDescriptor(descriptor.containingDeclaration, ClassKind.CLASS, false, Name.special(""), descriptor.source) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java index 28f9c168763..ba835793ca2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java @@ -16,14 +16,11 @@ package org.jetbrains.kotlin.resolve; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.psi.PsiElement; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.LinkedMultiMap; -import com.intellij.util.containers.MultiMap; import com.intellij.util.containers.SmartHashSet; import com.intellij.util.containers.hash.EqualityPolicy; import kotlin.Unit; @@ -37,7 +34,6 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2; import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.lexer.KtTokens; -import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.calls.callResolverUtil.CallResolverUtilKt; import org.jetbrains.kotlin.resolve.dataClassUtils.DataClassUtilsKt; @@ -68,27 +64,6 @@ public class OverrideResolver { checkParameterOverridesForAllClasses(c); } - public static void generateOverridesInAClass( - @NotNull ClassDescriptor classDescriptor, - @NotNull Collection membersFromCurrent, - @NotNull OverridingStrategy strategy - ) { - List membersFromSupertypes = getCallableMembersFromSupertypes(classDescriptor); - MultiMap membersFromCurrentByName = groupDescriptorsByName(membersFromCurrent); - MultiMap membersFromSupertypesByName = groupDescriptorsByName(membersFromSupertypes); - - Set memberNames = new LinkedHashSet(); - memberNames.addAll(membersFromSupertypesByName.keySet()); - memberNames.addAll(membersFromCurrentByName.keySet()); - - for (Name memberName : memberNames) { - Collection fromSupertypes = membersFromSupertypesByName.get(memberName); - Collection fromCurrent = membersFromCurrentByName.get(memberName); - - OverridingUtil.generateOverridesInFunctionGroup(memberName, fromSupertypes, fromCurrent, classDescriptor, strategy); - } - } - public static void resolveUnknownVisibilities( @NotNull Collection descriptors, @NotNull BindingTrace trace @@ -218,32 +193,6 @@ public class OverrideResolver { return false; } - private static MultiMap groupDescriptorsByName(Collection properties) { - MultiMap r = new LinkedMultiMap(); - for (T property : properties) { - r.putValue(property.getName(), property); - } - return r; - } - - - private static List getCallableMembersFromSupertypes(ClassDescriptor classDescriptor) { - Set r = Sets.newLinkedHashSet(); - for (KotlinType supertype : classDescriptor.getTypeConstructor().getSupertypes()) { - r.addAll(getCallableMembersFromType(supertype)); - } - return new ArrayList(r); - } - - private static List getCallableMembersFromType(KotlinType type) { - List r = Lists.newArrayList(); - for (DeclarationDescriptor decl : DescriptorUtils.getAllDescriptors(type.getMemberScope())) { - if (decl instanceof PropertyDescriptor || decl instanceof SimpleFunctionDescriptor) { - r.add((CallableMemberDescriptor) decl); - } - } - return r; - } private void checkOverrides(@NotNull TopDownAnalysisContext c) { for (Map.Entry entry : c.getDeclaredClasses().entrySet()) {