Refactor: Move and rename OverridingUtil.DescriptorSink -> OverridingStrategy

This commit is contained in:
Pavel V. Talanov
2016-02-08 17:52:48 +03:00
parent c9bb020d6e
commit 7e78e8d8ab
9 changed files with 53 additions and 33 deletions
@@ -20,12 +20,11 @@ import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.SpecialSignatureInfo
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.isBuiltinWithSpecialDescriptorInJvm import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.isBuiltinWithSpecialDescriptorInJvm
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.OverrideResolver import org.jetbrains.kotlin.resolve.OverrideResolver
import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.OverridingStrategy
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
@@ -33,9 +32,7 @@ import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.org.objectweb.asm.Opcodes.* import org.jetbrains.org.objectweb.asm.Opcodes.*
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import java.util.ArrayList import java.util.*
import java.util.HashSet
import java.util.LinkedHashSet
/** /**
* Generates exception-throwing stubs for methods from mutable collection classes not implemented in Kotlin classes which inherit only from * Generates exception-throwing stubs for methods from mutable collection classes not implemented in Kotlin classes which inherit only from
@@ -194,7 +191,7 @@ class CollectionStubMethodGenerator(
): List<FunctionDescriptor> { ): List<FunctionDescriptor> {
val result = ArrayList<FunctionDescriptor>() val result = ArrayList<FunctionDescriptor>()
OverrideResolver.generateOverridesInAClass(klass, listOf(), object : OverridingUtil.DescriptorSink { OverrideResolver.generateOverridesInAClass(klass, listOf(), object : OverridingStrategy {
override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) { override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) {
if (fakeOverride !is FunctionDescriptor) return if (fakeOverride !is FunctionDescriptor) return
if (fakeOverride.findOverriddenFromDirectSuperClass(mutableCollectionClass)?.kind == DECLARATION) { if (fakeOverride.findOverriddenFromDirectSuperClass(mutableCollectionClass)?.kind == DECLARATION) {
@@ -69,7 +69,7 @@ public class OverrideResolver {
public static void generateOverridesInAClass( public static void generateOverridesInAClass(
@NotNull ClassDescriptor classDescriptor, @NotNull ClassDescriptor classDescriptor,
@NotNull Collection<CallableMemberDescriptor> membersFromCurrent, @NotNull Collection<CallableMemberDescriptor> membersFromCurrent,
@NotNull OverridingUtil.DescriptorSink sink @NotNull OverridingStrategy strategy
) { ) {
List<CallableMemberDescriptor> membersFromSupertypes = getCallableMembersFromSupertypes(classDescriptor); List<CallableMemberDescriptor> membersFromSupertypes = getCallableMembersFromSupertypes(classDescriptor);
MultiMap<Name, CallableMemberDescriptor> membersFromCurrentByName = groupDescriptorsByName(membersFromCurrent); MultiMap<Name, CallableMemberDescriptor> membersFromCurrentByName = groupDescriptorsByName(membersFromCurrent);
@@ -83,7 +83,7 @@ public class OverrideResolver {
Collection<CallableMemberDescriptor> fromSupertypes = membersFromSupertypesByName.get(memberName); Collection<CallableMemberDescriptor> fromSupertypes = membersFromSupertypesByName.get(memberName);
Collection<CallableMemberDescriptor> fromCurrent = membersFromCurrentByName.get(memberName); Collection<CallableMemberDescriptor> fromCurrent = membersFromCurrentByName.get(memberName);
OverridingUtil.generateOverridesInFunctionGroup(memberName, fromSupertypes, fromCurrent, classDescriptor, sink); OverridingUtil.generateOverridesInFunctionGroup(memberName, fromSupertypes, fromCurrent, classDescriptor, strategy);
} }
} }
@@ -99,7 +99,7 @@ open class LazyClassMemberScope(
} }
private fun <D : CallableMemberDescriptor> generateFakeOverrides(name: Name, fromSupertypes: Collection<D>, result: MutableCollection<D>, exactDescriptorClass: Class<out D>) { private fun <D : CallableMemberDescriptor> generateFakeOverrides(name: Name, fromSupertypes: Collection<D>, result: MutableCollection<D>, exactDescriptorClass: Class<out D>) {
OverridingUtil.generateOverridesInFunctionGroup(name, fromSupertypes, ArrayList(result), thisDescriptor, object : OverridingUtil.DescriptorSink { OverridingUtil.generateOverridesInFunctionGroup(name, fromSupertypes, ArrayList(result), thisDescriptor, object : OverridingStrategy {
override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) { override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) {
assert(exactDescriptorClass.isInstance(fakeOverride)) { "Wrong descriptor type in an override: " + fakeOverride + " while expecting " + exactDescriptorClass.simpleName } assert(exactDescriptorClass.isInstance(fakeOverride)) { "Wrong descriptor type in an override: " + fakeOverride + " while expecting " + exactDescriptorClass.simpleName }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.load.java.structure.*; import org.jetbrains.kotlin.load.java.structure.*;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.OverridingStrategy;
import org.jetbrains.kotlin.resolve.OverridingUtil; import org.jetbrains.kotlin.resolve.OverridingUtil;
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter; import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter;
@@ -48,7 +49,7 @@ public final class DescriptorResolverUtils {
OverridingUtil.generateOverridesInFunctionGroup( OverridingUtil.generateOverridesInFunctionGroup(
name, membersFromSupertypes, membersFromCurrent, classDescriptor, name, membersFromSupertypes, membersFromCurrent, classDescriptor,
new OverridingUtil.DescriptorSink() { new OverridingStrategy() {
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void addFakeOverride(@NotNull CallableMemberDescriptor fakeOverride) { public void addFakeOverride(@NotNull CallableMemberDescriptor fakeOverride) {
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.resolve.OverridingStrategy
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.toReadOnlyList import org.jetbrains.kotlin.utils.toReadOnlyList
@@ -66,7 +67,7 @@ class FunctionClassScope(
/* membersFromSupertypes = */ descriptors, /* membersFromSupertypes = */ descriptors,
/* membersFromCurrent = */ if (isFunction && name == invoke?.name) listOf(invoke) else listOf(), /* membersFromCurrent = */ if (isFunction && name == invoke?.name) listOf(invoke) else listOf(),
functionClass, functionClass,
object : OverridingUtil.DescriptorSink { object : OverridingStrategy {
override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) { override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) {
OverridingUtil.resolveUnknownVisibilityForMember(fakeOverride, null) OverridingUtil.resolveUnknownVisibilityForMember(fakeOverride, null)
result.add(fakeOverride) result.add(fakeOverride)
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation;
import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.DescriptorFactory; import org.jetbrains.kotlin.resolve.DescriptorFactory;
import org.jetbrains.kotlin.resolve.OverridingStrategy;
import org.jetbrains.kotlin.resolve.OverridingUtil; import org.jetbrains.kotlin.resolve.OverridingUtil;
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter; import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.resolve.scopes.MemberScope;
@@ -245,7 +246,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
OverridingUtil.generateOverridesInFunctionGroup( OverridingUtil.generateOverridesInFunctionGroup(
name, fromSupertypes, Collections.<D>emptySet(), EnumEntrySyntheticClassDescriptor.this, name, fromSupertypes, Collections.<D>emptySet(), EnumEntrySyntheticClassDescriptor.this,
new OverridingUtil.DescriptorSink() { new OverridingStrategy() {
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void addFakeOverride(@NotNull CallableMemberDescriptor fakeOverride) { public void addFakeOverride(@NotNull CallableMemberDescriptor fakeOverride) {
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
interface OverridingStrategy {
fun addFakeOverride(fakeOverride: CallableMemberDescriptor)
fun conflict(fromSuper: CallableMemberDescriptor, fromCurrent: CallableMemberDescriptor)
}
@@ -16,8 +16,8 @@
package org.jetbrains.kotlin.resolve; package org.jetbrains.kotlin.resolve;
import kotlin.collections.CollectionsKt;
import kotlin.Unit; import kotlin.Unit;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.Mutable; import org.jetbrains.annotations.Mutable;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -274,24 +274,24 @@ public class OverridingUtil {
@NotNull Collection<? extends CallableMemberDescriptor> membersFromSupertypes, @NotNull Collection<? extends CallableMemberDescriptor> membersFromSupertypes,
@NotNull Collection<? extends CallableMemberDescriptor> membersFromCurrent, @NotNull Collection<? extends CallableMemberDescriptor> membersFromCurrent,
@NotNull ClassDescriptor current, @NotNull ClassDescriptor current,
@NotNull DescriptorSink sink @NotNull OverridingStrategy strategy
) { ) {
Collection<CallableMemberDescriptor> notOverridden = new LinkedHashSet<CallableMemberDescriptor>(membersFromSupertypes); Collection<CallableMemberDescriptor> notOverridden = new LinkedHashSet<CallableMemberDescriptor>(membersFromSupertypes);
for (CallableMemberDescriptor fromCurrent : membersFromCurrent) { for (CallableMemberDescriptor fromCurrent : membersFromCurrent) {
Collection<CallableMemberDescriptor> bound = Collection<CallableMemberDescriptor> bound =
extractAndBindOverridesForMember(fromCurrent, membersFromSupertypes, current, sink); extractAndBindOverridesForMember(fromCurrent, membersFromSupertypes, current, strategy);
notOverridden.removeAll(bound); notOverridden.removeAll(bound);
} }
createAndBindFakeOverrides(current, notOverridden, sink); createAndBindFakeOverrides(current, notOverridden, strategy);
} }
private static Collection<CallableMemberDescriptor> extractAndBindOverridesForMember( private static Collection<CallableMemberDescriptor> extractAndBindOverridesForMember(
@NotNull CallableMemberDescriptor fromCurrent, @NotNull CallableMemberDescriptor fromCurrent,
@NotNull Collection<? extends CallableMemberDescriptor> descriptorsFromSuper, @NotNull Collection<? extends CallableMemberDescriptor> descriptorsFromSuper,
@NotNull ClassDescriptor current, @NotNull ClassDescriptor current,
@NotNull DescriptorSink sink @NotNull OverridingStrategy strategy
) { ) {
Collection<CallableMemberDescriptor> bound = new ArrayList<CallableMemberDescriptor>(descriptorsFromSuper.size()); Collection<CallableMemberDescriptor> bound = new ArrayList<CallableMemberDescriptor>(descriptorsFromSuper.size());
Collection<CallableMemberDescriptor> overridden = SmartSet.create(); Collection<CallableMemberDescriptor> overridden = SmartSet.create();
@@ -308,7 +308,7 @@ public class OverridingUtil {
break; break;
case CONFLICT: case CONFLICT:
if (isVisible) { if (isVisible) {
sink.conflict(fromSupertype, fromCurrent); strategy.conflict(fromSupertype, fromCurrent);
} }
bound.add(fromSupertype); bound.add(fromSupertype);
break; break;
@@ -337,13 +337,13 @@ public class OverridingUtil {
private static void createAndBindFakeOverrides( private static void createAndBindFakeOverrides(
@NotNull ClassDescriptor current, @NotNull ClassDescriptor current,
@NotNull Collection<CallableMemberDescriptor> notOverridden, @NotNull Collection<CallableMemberDescriptor> notOverridden,
@NotNull DescriptorSink sink @NotNull OverridingStrategy strategy
) { ) {
// Optimization: If all notOverridden descriptors have the same containing declaration, // Optimization: If all notOverridden descriptors have the same containing declaration,
// then we can just create fake overrides for them, because they should be matched correctly in their containing declaration // then we can just create fake overrides for them, because they should be matched correctly in their containing declaration
if (allHasSameContainingDeclaration(notOverridden)) { if (allHasSameContainingDeclaration(notOverridden)) {
for (CallableMemberDescriptor descriptor : notOverridden) { for (CallableMemberDescriptor descriptor : notOverridden) {
createAndBindFakeOverride(Collections.singleton(descriptor), current, sink); createAndBindFakeOverride(Collections.singleton(descriptor), current, strategy);
} }
return; return;
} }
@@ -352,8 +352,8 @@ public class OverridingUtil {
while (!fromSuperQueue.isEmpty()) { while (!fromSuperQueue.isEmpty()) {
CallableMemberDescriptor notOverriddenFromSuper = VisibilityUtilKt.findMemberWithMaxVisibility(fromSuperQueue); CallableMemberDescriptor notOverriddenFromSuper = VisibilityUtilKt.findMemberWithMaxVisibility(fromSuperQueue);
Collection<CallableMemberDescriptor> overridables = Collection<CallableMemberDescriptor> overridables =
extractMembersOverridableInBothWays(notOverriddenFromSuper, fromSuperQueue, sink); extractMembersOverridableInBothWays(notOverriddenFromSuper, fromSuperQueue, strategy);
createAndBindFakeOverride(overridables, current, sink); createAndBindFakeOverride(overridables, current, strategy);
} }
} }
@@ -476,7 +476,7 @@ public class OverridingUtil {
private static void createAndBindFakeOverride( private static void createAndBindFakeOverride(
@NotNull Collection<CallableMemberDescriptor> overridables, @NotNull Collection<CallableMemberDescriptor> overridables,
@NotNull ClassDescriptor current, @NotNull ClassDescriptor current,
@NotNull DescriptorSink sink @NotNull OverridingStrategy strategy
) { ) {
Collection<CallableMemberDescriptor> visibleOverridables = filterVisibleFakeOverrides(current, overridables); Collection<CallableMemberDescriptor> visibleOverridables = filterVisibleFakeOverrides(current, overridables);
boolean allInvisible = visibleOverridables.isEmpty(); boolean allInvisible = visibleOverridables.isEmpty();
@@ -502,7 +502,7 @@ public class OverridingUtil {
CallableMemberDescriptor fakeOverride = CallableMemberDescriptor fakeOverride =
mostSpecific.copy(current, modality, visibility, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false); mostSpecific.copy(current, modality, visibility, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false);
fakeOverride.setOverriddenDescriptors(effectiveOverridden); fakeOverride.setOverriddenDescriptors(effectiveOverridden);
sink.addFakeOverride(fakeOverride); strategy.addFakeOverride(fakeOverride);
} }
@NotNull @NotNull
@@ -584,7 +584,7 @@ public class OverridingUtil {
private static Collection<CallableMemberDescriptor> extractMembersOverridableInBothWays( private static Collection<CallableMemberDescriptor> extractMembersOverridableInBothWays(
@NotNull final CallableMemberDescriptor overrider, @NotNull final CallableMemberDescriptor overrider,
@NotNull Queue<CallableMemberDescriptor> extractFrom, @NotNull Queue<CallableMemberDescriptor> extractFrom,
@NotNull final DescriptorSink sink @NotNull final OverridingStrategy strategy
) { ) {
return extractMembersOverridableInBothWays(overrider, extractFrom, return extractMembersOverridableInBothWays(overrider, extractFrom,
// ID // ID
@@ -597,7 +597,7 @@ public class OverridingUtil {
new Function1<CallableMemberDescriptor, Unit>() { new Function1<CallableMemberDescriptor, Unit>() {
@Override @Override
public Unit invoke(CallableMemberDescriptor descriptor) { public Unit invoke(CallableMemberDescriptor descriptor) {
sink.conflict(overrider, descriptor); strategy.conflict(overrider, descriptor);
return Unit.INSTANCE; return Unit.INSTANCE;
} }
}); });
@@ -698,12 +698,6 @@ public class OverridingUtil {
return maxVisibility; return maxVisibility;
} }
public interface DescriptorSink {
void addFakeOverride(@NotNull CallableMemberDescriptor fakeOverride);
void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent);
}
public static class OverrideCompatibilityInfo { public static class OverrideCompatibilityInfo {
public enum Result { public enum Result {
OVERRIDABLE, OVERRIDABLE,
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.OverridingStrategy
import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
@@ -219,7 +220,7 @@ class DeserializedClassDescriptor(
private fun <D : CallableMemberDescriptor> generateFakeOverrides(name: Name, fromSupertypes: Collection<D>, result: MutableCollection<D>) { private fun <D : CallableMemberDescriptor> generateFakeOverrides(name: Name, fromSupertypes: Collection<D>, result: MutableCollection<D>) {
val fromCurrent = ArrayList<CallableMemberDescriptor>(result) val fromCurrent = ArrayList<CallableMemberDescriptor>(result)
OverridingUtil.generateOverridesInFunctionGroup(name, fromSupertypes, fromCurrent, classDescriptor, object : OverridingUtil.DescriptorSink { OverridingUtil.generateOverridesInFunctionGroup(name, fromSupertypes, fromCurrent, classDescriptor, object : OverridingStrategy {
override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) { override fun addFakeOverride(fakeOverride: CallableMemberDescriptor) {
// TODO: report "cannot infer visibility" // TODO: report "cannot infer visibility"
OverridingUtil.resolveUnknownVisibilityForMember(fakeOverride, null) OverridingUtil.resolveUnknownVisibilityForMember(fakeOverride, null)