diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 926418f25f9..68b13498a04 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -26,13 +26,6 @@ import kotlin.Function1; import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.org.objectweb.asm.AnnotationVisitor; -import org.jetbrains.org.objectweb.asm.Label; -import org.jetbrains.org.objectweb.asm.MethodVisitor; -import org.jetbrains.org.objectweb.asm.Type; -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; -import org.jetbrains.org.objectweb.asm.commons.Method; -import org.jetbrains.org.objectweb.asm.util.TraceMethodVisitor; import org.jetbrains.jet.codegen.binding.CodegenBinding; import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.context.MethodContext; @@ -53,12 +46,18 @@ import org.jetbrains.jet.lang.resolve.constants.JavaClassValue; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.utils.DFS; +import org.jetbrains.org.objectweb.asm.AnnotationVisitor; +import org.jetbrains.org.objectweb.asm.Label; +import org.jetbrains.org.objectweb.asm.MethodVisitor; +import org.jetbrains.org.objectweb.asm.Type; +import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; +import org.jetbrains.org.objectweb.asm.commons.Method; +import org.jetbrains.org.objectweb.asm.util.TraceMethodVisitor; import java.io.PrintWriter; import java.io.StringWriter; import java.util.*; -import static org.jetbrains.org.objectweb.asm.Opcodes.*; import static org.jetbrains.jet.codegen.AsmUtil.*; import static org.jetbrains.jet.codegen.JvmSerializationBindings.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.asmTypeForAnonymousClass; @@ -69,6 +68,7 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isFunctionLiteral; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTrait; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.OLD_JET_VALUE_PARAMETER_ANNOTATION; +import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class FunctionCodegen extends ParentCodegenAwareImpl { private final CodegenContext owner; @@ -485,7 +485,7 @@ public class FunctionCodegen extends ParentCodegenAwareImpl { new DFS.NodeHandlerWithListResult() { @Override public void afterChildren(FunctionDescriptor current) { - if (current.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { + if (current.getKind().isReal()) { result.add(typeMapper.mapSignature(current).getAsmMethod()); } } @@ -504,7 +504,7 @@ public class FunctionCodegen extends ParentCodegenAwareImpl { throw new IllegalArgumentException("Only non-abstract functions have implementations: " + descriptor); } - if (descriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + if (descriptor.getKind().isReal()) { return descriptor; } diff --git a/compiler/testData/codegen/box/bridges/fakeOverrideWithSynthesizedImplementation.kt b/compiler/testData/codegen/box/bridges/fakeOverrideWithSynthesizedImplementation.kt new file mode 100644 index 00000000000..a4d0a21e5f9 --- /dev/null +++ b/compiler/testData/codegen/box/bridges/fakeOverrideWithSynthesizedImplementation.kt @@ -0,0 +1,14 @@ +open data class A(val value: String) + +trait B { + fun component1(): Any +} + +class C(value: String) : A(value), B + +fun box(): String { + val c = C("OK") + if ((c : B).component1() != "OK") return "Fail 1" + if ((c : A).component1() != "OK") return "Fail 2" + return c.component1() +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index f52e6a382ff..1f1f0be6187 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -320,6 +320,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/bridges/fakeOverrideWithSeveralSuperDeclarations.kt"); } + @TestMetadata("fakeOverrideWithSynthesizedImplementation.kt") + public void testFakeOverrideWithSynthesizedImplementation() throws Exception { + doTest("compiler/testData/codegen/box/bridges/fakeOverrideWithSynthesizedImplementation.kt"); + } + @TestMetadata("kt1939.kt") public void testKt1939() throws Exception { doTest("compiler/testData/codegen/box/bridges/kt1939.kt"); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java index c0152a6d21d..5a5e73cb1a2 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java @@ -41,13 +41,14 @@ public interface CallableMemberDescriptor extends CallableDescriptor, MemberDesc ; public boolean isReal() { - return this == DECLARATION || this == DELEGATION || this == SYNTHESIZED; + return this != FAKE_OVERRIDE; } } /** * Is this a real function or function projection. */ + @NotNull Kind getKind(); @NotNull diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/FunctionDescriptorImpl.java index 99a819c03f9..7640fd7d609 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/FunctionDescriptorImpl.java @@ -170,6 +170,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo return original == this ? this : original.getOriginal(); } + @NotNull @Override public Kind getKind() { return kind; diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyAccessorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyAccessorDescriptorImpl.java index cfdb71cbd64..73e89fe437e 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyAccessorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyAccessorDescriptorImpl.java @@ -66,6 +66,7 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript return isDefault; } + @NotNull @Override public Kind getKind() { return kind; diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java index 0af85feacba..c382714b2b8 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java @@ -316,6 +316,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorImpl implements Pr return original == this ? this : original.getOriginal(); } + @NotNull @Override public Kind getKind() { return kind;