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
@@ -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);
}
};