From 0ee977c42e571488aaa82bd0e0524b9b9bc75798 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Thu, 14 Nov 2019 15:30:14 +0300 Subject: [PATCH] FIC: Support base version of conversions in JVM backend Proper support for JVM backend will be in the further commmits --- .../org/jetbrains/kotlin/codegen/SamType.java | 17 +++++++++++------ .../kotlin/codegen/SamWrapperCodegen.java | 6 +++--- .../funInterface/basicFunInterfaceConversion.kt | 11 +++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ 6 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterfaceConversion.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamType.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamType.java index b02971b88e8..902766fe74d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamType.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamType.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.codegen.state.TypeMapperUtilsKt; +import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.ClassifierDescriptor; import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor; import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; @@ -62,21 +63,25 @@ public class SamType { } @NotNull - public JavaClassDescriptor getJavaClassDescriptor() { + public ClassDescriptor getClassDescriptor() { ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor(); - assert classifier instanceof JavaClassDescriptor : "Sam interface not a Java class: " + classifier; - return (JavaClassDescriptor) classifier; + assert classifier instanceof ClassDescriptor : "Sam/Fun interface not a class descriptor: " + classifier; + return (ClassDescriptor) classifier; } @NotNull public KotlinType getKotlinFunctionType() { - //noinspection ConstantConditions - return getJavaClassDescriptor().getDefaultFunctionTypeForSamInterface(); + ClassDescriptor descriptor = getClassDescriptor(); + if (descriptor instanceof JavaClassDescriptor) { + return ((JavaClassDescriptor) descriptor).getDefaultFunctionTypeForSamInterface(); + } + + return null; } @NotNull public SimpleFunctionDescriptor getOriginalAbstractMethod() { - return (SimpleFunctionDescriptor) SingleAbstractMethodUtils.getAbstractMembers(getJavaClassDescriptor()).get(0); + return (SimpleFunctionDescriptor) SingleAbstractMethodUtils.getAbstractMembers(getClassDescriptor()).get(0); } @Override diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index f0903d0f3b1..0865c35755a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -82,7 +82,7 @@ public class SamWrapperCodegen { KotlinType functionType = samType.getKotlinFunctionType(); ClassDescriptor classDescriptor = new ClassDescriptorImpl( - samType.getJavaClassDescriptor().getContainingDeclaration(), + samType.getClassDescriptor().getContainingDeclaration(), fqName.shortName(), Modality.FINAL, ClassKind.CLASS, @@ -132,7 +132,7 @@ public class SamWrapperCodegen { } private void generateConstructor(Type ownerType, Type functionType, ClassBuilder cv) { - MethodVisitor mv = cv.newMethod(JvmDeclarationOriginKt.OtherOrigin(samType.getJavaClassDescriptor()), + MethodVisitor mv = cv.newMethod(JvmDeclarationOriginKt.OtherOrigin(samType.getClassDescriptor()), visibility, "", Type.getMethodDescriptor(Type.VOID_TYPE, functionType), null, null); if (state.getClassBuilderMode().generateBodies) { @@ -198,7 +198,7 @@ public class SamWrapperCodegen { "%s$sam%s$%s" + SAM_WRAPPER_SUFFIX, outermostOwner.shortName().asString(), (isInsideInline ? "$i" : ""), - DescriptorUtils.getFqNameSafe(samType.getJavaClassDescriptor()).asString().replace('.', '_') + DescriptorUtils.getFqNameSafe(samType.getClassDescriptor()).asString().replace('.', '_') ); return outermostOwner.parent().child(Name.identifier(shortName)); } diff --git a/compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterfaceConversion.kt b/compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterfaceConversion.kt new file mode 100644 index 00000000000..d8561aebbd5 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterfaceConversion.kt @@ -0,0 +1,11 @@ +// !LANGUAGE: +NewInference +FunctionInterfaceConversion +SamConversionPerArgument +SamConversionForKotlinFunctions + +fun interface Foo { + fun invoke(): String +} + +fun foo(f: Foo) = f.invoke() + +fun box(): String { + return foo { "OK" } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index c07a30d6f5c..f9a96bb6864 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13684,6 +13684,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testBasicFunInterface() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterface.kt"); } + + @TestMetadata("basicFunInterfaceConversion.kt") + public void testBasicFunInterfaceConversion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterfaceConversion.kt"); + } } @TestMetadata("compiler/testData/codegen/box/inlineClasses/functionNameMangling") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7f188b03d2b..cf17555cdf0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13684,6 +13684,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes public void testBasicFunInterface() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterface.kt"); } + + @TestMetadata("basicFunInterfaceConversion.kt") + public void testBasicFunInterfaceConversion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterfaceConversion.kt"); + } } @TestMetadata("compiler/testData/codegen/box/inlineClasses/functionNameMangling") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 82c4843fb55..145b5e82c23 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12534,6 +12534,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes public void testBasicFunInterface() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterface.kt"); } + + @TestMetadata("basicFunInterfaceConversion.kt") + public void testBasicFunInterfaceConversion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterfaceConversion.kt"); + } } @TestMetadata("compiler/testData/codegen/box/inlineClasses/functionNameMangling")