From eb7dc87225e6f8f96c84dbed24b613b82842c721 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 13 Jun 2013 20:40:31 +0400 Subject: [PATCH] Ignore SAM adapters when finding abstract members. --- .../java/sam/SingleAbstractMethodUtils.java | 5 +++-- .../lang/resolve/calls/CallResolverUtil.java | 16 +++++++++++++++- .../resolve/calls/tasks/TaskPrioritizer.java | 19 +++---------------- .../adapter/InheritedSimple.java | 10 ++++++++++ .../adapter/InheritedSimple.txt | 19 +++++++++++++++++++ .../jvm/compiler/LoadJavaTestGenerated.java | 5 +++++ 6 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.java create mode 100644 compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.txt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java index 7134388ac38..09df97a0c74 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java @@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.descriptors.impl.ConstructorDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; +import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesUtil; import org.jetbrains.jet.lang.resolve.name.Name; @@ -45,8 +46,8 @@ public class SingleAbstractMethodUtils { List abstractMembers = Lists.newArrayList(); for (DeclarationDescriptor member : type.getMemberScope().getAllDescriptors()) { if (member instanceof CallableMemberDescriptor && - ((CallableMemberDescriptor) member).getModality() == Modality.ABSTRACT && - ((CallableMemberDescriptor) member).getKind() != CallableMemberDescriptor.Kind.SYNTHESIZED) { + ((CallableMemberDescriptor) member).getModality() == Modality.ABSTRACT && + !CallResolverUtil.isOrOverridesSynthesized((CallableMemberDescriptor) member)) { abstractMembers.add((CallableMemberDescriptor) member); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java index f9467fffa71..fedaced4525 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java @@ -35,7 +35,6 @@ import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.jet.lang.resolve.calls.tasks.ResolutionCandidate; import org.jetbrains.jet.lang.types.*; -import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.Collections; @@ -171,4 +170,19 @@ public class CallResolverUtil { receiverType.getAnnotations(), receiverType.getConstructor(), receiverType.isNullable(), fakeTypeArguments, ErrorUtils.createErrorScope("Error scope for erased receiver type", /*throwExceptions=*/true)); } + + public static boolean isOrOverridesSynthesized(@NotNull CallableMemberDescriptor descriptor) { + if (descriptor.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) { + return true; + } + if (descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + for (CallableMemberDescriptor overridden : descriptor.getOverriddenDescriptors()) { + if (!isOrOverridesSynthesized(overridden)) { + return false; + } + } + return true; + } + return false; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java index 85db61fa34f..26ace9a4d62 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java @@ -41,6 +41,7 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject; +import static org.jetbrains.jet.lang.resolve.calls.CallResolverUtil.*; import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue.NO_RECEIVER; public class TaskPrioritizer { @@ -106,22 +107,8 @@ public class TaskPrioritizer { private boolean isSynthesized(ResolutionCandidate call) { D descriptor = call.getDescriptor(); - return descriptor instanceof CallableMemberDescriptor && isOrOverridesSynthesized((CallableMemberDescriptor) descriptor); - } - - private boolean isOrOverridesSynthesized(CallableMemberDescriptor descriptor) { - if (descriptor.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) { - return true; - } - if (descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - for (CallableMemberDescriptor overridden : descriptor.getOverriddenDescriptors()) { - if (!isOrOverridesSynthesized(overridden)) { - return false; - } - } - return true; - } - return false; + return descriptor instanceof CallableMemberDescriptor && + isOrOverridesSynthesized((CallableMemberDescriptor) descriptor); } }; diff --git a/compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.java b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.java new file mode 100644 index 00000000000..66c7a3c1988 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.java @@ -0,0 +1,10 @@ +package test; + +public interface InheritedSimple { + public interface Super { + void foo(Runnable r); + } + + public interface Sub extends Super { + } +} \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.txt b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.txt new file mode 100644 index 00000000000..10534b8b49e --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.txt @@ -0,0 +1,19 @@ +package test + +public trait InheritedSimple : java.lang.Object { + + public trait Sub : test.InheritedSimple.Super { + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ p0: (() -> jet.Unit)?): jet.Unit + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ p0: java.lang.Runnable?): jet.Unit + } + + public trait Super : java.lang.Object { + public abstract /*synthesized*/ fun foo(/*0*/ p0: (() -> jet.Unit)?): jet.Unit + public abstract fun foo(/*0*/ p0: java.lang.Runnable?): jet.Unit + } +} + +package InheritedSimple { + public /*synthesized*/ fun Sub(/*0*/ function: (java.lang.Runnable?) -> jet.Unit): test.InheritedSimple.Sub + public /*synthesized*/ fun Super(/*0*/ function: (java.lang.Runnable?) -> jet.Unit): test.InheritedSimple.Super +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 544c3e4295a..36030874f3d 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -1254,6 +1254,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledJava("compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/DeepSamLoop.java"); } + @TestMetadata("InheritedSimple.java") + public void testInheritedSimple() throws Exception { + doTestCompiledJava("compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/InheritedSimple.java"); + } + @TestMetadata("NonTrivialFunctionType.java") public void testNonTrivialFunctionType() throws Exception { doTestCompiledJava("compiler/testData/loadJava/compiledJava/singleAbstractMethod/adapter/NonTrivialFunctionType.java");