Ignore SAM adapters when finding abstract members.

This commit is contained in:
Evgeny Gerashchenko
2013-06-13 20:40:31 +04:00
parent d78f36a780
commit eb7dc87225
6 changed files with 55 additions and 19 deletions
@@ -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<CallableMemberDescriptor> 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);
}
}
@@ -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;
}
}
@@ -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<D> 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);
}
};
@@ -0,0 +1,10 @@
package test;
public interface InheritedSimple {
public interface Super {
void foo(Runnable r);
}
public interface Sub extends Super {
}
}
@@ -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
}
@@ -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");