From 1ff0ffbac69088ff9ab24f44cb1b124c96fb9312 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 25 Oct 2013 13:48:09 +0400 Subject: [PATCH] Map jet.Hashable to java.lang.Object, to avoid NoClassDefFound exceptions --- .../testData/codegen/box/typeMapping/hashable.kt | 6 ++++++ .../regressions/implicitlyCastToHashable.kt | 11 +++++++++++ .../generated/BlackBoxCodegenTestGenerated.java | 16 +++++++++++++++- .../BlackBoxWithStdlibCodegenTestGenerated.java | 5 +++++ .../mapping/JavaToKotlinClassMapBuilder.java | 1 + .../jet/lang/types/lang/KotlinBuiltIns.java | 5 +++++ 6 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/typeMapping/hashable.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/regressions/implicitlyCastToHashable.kt diff --git a/compiler/testData/codegen/box/typeMapping/hashable.kt b/compiler/testData/codegen/box/typeMapping/hashable.kt new file mode 100644 index 00000000000..dbd74a0d5e3 --- /dev/null +++ b/compiler/testData/codegen/box/typeMapping/hashable.kt @@ -0,0 +1,6 @@ +fun foo(): Hashable = 1 + +fun box(): String { + if (foo() == 1) return "OK" + return "Fail" +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithStdlib/regressions/implicitlyCastToHashable.kt b/compiler/testData/codegen/boxWithStdlib/regressions/implicitlyCastToHashable.kt new file mode 100644 index 00000000000..4f46a05f730 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/regressions/implicitlyCastToHashable.kt @@ -0,0 +1,11 @@ +fun box(): String { + val a = true + val x = if (a) { + listOf(1) + } + else { + 1 + } + // The result of the if() above is implicitly cast to jet.Hashable, which failed before we started to map Hashable to j.l.Object + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 8bc94eb96c6..1c2c18cd03b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.codegen.generated.AbstractBlackBoxCodegenTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("compiler/testData/codegen/box") -@InnerTestClasses({BlackBoxCodegenTestGenerated.Arrays.class, BlackBoxCodegenTestGenerated.Bridges.class, BlackBoxCodegenTestGenerated.BuiltinStubMethods.class, BlackBoxCodegenTestGenerated.CallableReference.class, BlackBoxCodegenTestGenerated.Casts.class, BlackBoxCodegenTestGenerated.Classes.class, BlackBoxCodegenTestGenerated.Closures.class, BlackBoxCodegenTestGenerated.Constants.class, BlackBoxCodegenTestGenerated.ControlStructures.class, BlackBoxCodegenTestGenerated.DefaultArguments.class, BlackBoxCodegenTestGenerated.DelegatedProperty.class, BlackBoxCodegenTestGenerated.Elvis.class, BlackBoxCodegenTestGenerated.Enum.class, BlackBoxCodegenTestGenerated.ExclExcl.class, BlackBoxCodegenTestGenerated.ExtensionFunctions.class, BlackBoxCodegenTestGenerated.ExtensionProperties.class, BlackBoxCodegenTestGenerated.FieldRename.class, BlackBoxCodegenTestGenerated.Finally.class, BlackBoxCodegenTestGenerated.Functions.class, BlackBoxCodegenTestGenerated.InnerNested.class, BlackBoxCodegenTestGenerated.Instructions.class, BlackBoxCodegenTestGenerated.Intrinsics.class, BlackBoxCodegenTestGenerated.Labels.class, BlackBoxCodegenTestGenerated.LocalClasses.class, BlackBoxCodegenTestGenerated.MultiDecl.class, BlackBoxCodegenTestGenerated.Namespace.class, BlackBoxCodegenTestGenerated.Objects.class, BlackBoxCodegenTestGenerated.OperatorConventions.class, BlackBoxCodegenTestGenerated.PrimitiveTypes.class, BlackBoxCodegenTestGenerated.Properties.class, BlackBoxCodegenTestGenerated.Reflection.class, BlackBoxCodegenTestGenerated.SafeCall.class, BlackBoxCodegenTestGenerated.SamConstructors.class, BlackBoxCodegenTestGenerated.Strings.class, BlackBoxCodegenTestGenerated.Super.class, BlackBoxCodegenTestGenerated.ToArray.class, BlackBoxCodegenTestGenerated.Traits.class, BlackBoxCodegenTestGenerated.TypeInfo.class, BlackBoxCodegenTestGenerated.Unit.class, BlackBoxCodegenTestGenerated.Vararg.class, BlackBoxCodegenTestGenerated.When.class}) +@InnerTestClasses({BlackBoxCodegenTestGenerated.Arrays.class, BlackBoxCodegenTestGenerated.Bridges.class, BlackBoxCodegenTestGenerated.BuiltinStubMethods.class, BlackBoxCodegenTestGenerated.CallableReference.class, BlackBoxCodegenTestGenerated.Casts.class, BlackBoxCodegenTestGenerated.Classes.class, BlackBoxCodegenTestGenerated.Closures.class, BlackBoxCodegenTestGenerated.Constants.class, BlackBoxCodegenTestGenerated.ControlStructures.class, BlackBoxCodegenTestGenerated.DefaultArguments.class, BlackBoxCodegenTestGenerated.DelegatedProperty.class, BlackBoxCodegenTestGenerated.Elvis.class, BlackBoxCodegenTestGenerated.Enum.class, BlackBoxCodegenTestGenerated.ExclExcl.class, BlackBoxCodegenTestGenerated.ExtensionFunctions.class, BlackBoxCodegenTestGenerated.ExtensionProperties.class, BlackBoxCodegenTestGenerated.FieldRename.class, BlackBoxCodegenTestGenerated.Finally.class, BlackBoxCodegenTestGenerated.Functions.class, BlackBoxCodegenTestGenerated.InnerNested.class, BlackBoxCodegenTestGenerated.Instructions.class, BlackBoxCodegenTestGenerated.Intrinsics.class, BlackBoxCodegenTestGenerated.Labels.class, BlackBoxCodegenTestGenerated.LocalClasses.class, BlackBoxCodegenTestGenerated.MultiDecl.class, BlackBoxCodegenTestGenerated.Namespace.class, BlackBoxCodegenTestGenerated.Objects.class, BlackBoxCodegenTestGenerated.OperatorConventions.class, BlackBoxCodegenTestGenerated.PrimitiveTypes.class, BlackBoxCodegenTestGenerated.Properties.class, BlackBoxCodegenTestGenerated.Reflection.class, BlackBoxCodegenTestGenerated.SafeCall.class, BlackBoxCodegenTestGenerated.SamConstructors.class, BlackBoxCodegenTestGenerated.Strings.class, BlackBoxCodegenTestGenerated.Super.class, BlackBoxCodegenTestGenerated.ToArray.class, BlackBoxCodegenTestGenerated.Traits.class, BlackBoxCodegenTestGenerated.TypeInfo.class, BlackBoxCodegenTestGenerated.TypeMapping.class, BlackBoxCodegenTestGenerated.Unit.class, BlackBoxCodegenTestGenerated.Vararg.class, BlackBoxCodegenTestGenerated.When.class}) public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInBox() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box"), Pattern.compile("^(.+)\\.kt$"), true); @@ -4341,6 +4341,19 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } + @TestMetadata("compiler/testData/codegen/box/typeMapping") + public static class TypeMapping extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInTypeMapping() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/typeMapping"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("hashable.kt") + public void testHashable() throws Exception { + doTest("compiler/testData/codegen/box/typeMapping/hashable.kt"); + } + + } + @TestMetadata("compiler/testData/codegen/box/unit") public static class Unit extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInUnit() throws Exception { @@ -4521,6 +4534,7 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { suite.addTestSuite(ToArray.class); suite.addTestSuite(Traits.class); suite.addTestSuite(TypeInfo.class); + suite.addTestSuite(TypeMapping.class); suite.addTestSuite(Unit.class); suite.addTestSuite(Vararg.class); suite.addTestSuite(When.class); diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 99462994a13..0ca5a4b9b92 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -815,6 +815,11 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/regressions/generic.kt"); } + @TestMetadata("implicitlyCastToHashable.kt") + public void testImplicitlyCastToHashable() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/regressions/implicitlyCastToHashable.kt"); + } + @TestMetadata("kt1406.kt") public void testKt1406() throws Exception { doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/regressions/kt1406.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMapBuilder.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMapBuilder.java index e7b0484edbb..a052cb70842 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMapBuilder.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMapBuilder.java @@ -43,6 +43,7 @@ public abstract class JavaToKotlinClassMapBuilder { register(Enum.class, kotlinBuiltIns.getEnum()); register(Annotation.class, kotlinBuiltIns.getAnnotation()); register(Deprecated.class, kotlinBuiltIns.getDeprecatedAnnotation(), Direction.JAVA_TO_KOTLIN); + register(Object.class, kotlinBuiltIns.getHashable(), Direction.KOTLIN_TO_JAVA); register(Iterable.class, kotlinBuiltIns.getIterable(), kotlinBuiltIns.getMutableIterable()); register(Iterator.class, kotlinBuiltIns.getIterator(), kotlinBuiltIns.getMutableIterator()); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java index a2efbd67150..180e7e1ac3a 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java @@ -333,6 +333,11 @@ public class KotlinBuiltIns { return getBuiltInClassByName("Number"); } + @NotNull + public ClassDescriptor getHashable() { + return getBuiltInClassByName("Hashable"); + } + @NotNull public ClassDescriptor getUnit() { return getBuiltInClassByName("Unit");