FIC: Support base version of conversions in JVM backend
Proper support for JVM backend will be in the further commmits
This commit is contained in:
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||||
import org.jetbrains.kotlin.codegen.state.TypeMapperUtilsKt;
|
import org.jetbrains.kotlin.codegen.state.TypeMapperUtilsKt;
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor;
|
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
|
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
|
||||||
@@ -62,21 +63,25 @@ public class SamType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public JavaClassDescriptor getJavaClassDescriptor() {
|
public ClassDescriptor getClassDescriptor() {
|
||||||
ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor();
|
ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor();
|
||||||
assert classifier instanceof JavaClassDescriptor : "Sam interface not a Java class: " + classifier;
|
assert classifier instanceof ClassDescriptor : "Sam/Fun interface not a class descriptor: " + classifier;
|
||||||
return (JavaClassDescriptor) classifier;
|
return (ClassDescriptor) classifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public KotlinType getKotlinFunctionType() {
|
public KotlinType getKotlinFunctionType() {
|
||||||
//noinspection ConstantConditions
|
ClassDescriptor descriptor = getClassDescriptor();
|
||||||
return getJavaClassDescriptor().getDefaultFunctionTypeForSamInterface();
|
if (descriptor instanceof JavaClassDescriptor) {
|
||||||
|
return ((JavaClassDescriptor) descriptor).getDefaultFunctionTypeForSamInterface();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public SimpleFunctionDescriptor getOriginalAbstractMethod() {
|
public SimpleFunctionDescriptor getOriginalAbstractMethod() {
|
||||||
return (SimpleFunctionDescriptor) SingleAbstractMethodUtils.getAbstractMembers(getJavaClassDescriptor()).get(0);
|
return (SimpleFunctionDescriptor) SingleAbstractMethodUtils.getAbstractMembers(getClassDescriptor()).get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public class SamWrapperCodegen {
|
|||||||
KotlinType functionType = samType.getKotlinFunctionType();
|
KotlinType functionType = samType.getKotlinFunctionType();
|
||||||
|
|
||||||
ClassDescriptor classDescriptor = new ClassDescriptorImpl(
|
ClassDescriptor classDescriptor = new ClassDescriptorImpl(
|
||||||
samType.getJavaClassDescriptor().getContainingDeclaration(),
|
samType.getClassDescriptor().getContainingDeclaration(),
|
||||||
fqName.shortName(),
|
fqName.shortName(),
|
||||||
Modality.FINAL,
|
Modality.FINAL,
|
||||||
ClassKind.CLASS,
|
ClassKind.CLASS,
|
||||||
@@ -132,7 +132,7 @@ public class SamWrapperCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void generateConstructor(Type ownerType, Type functionType, ClassBuilder cv) {
|
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, "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, functionType), null, null);
|
visibility, "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, functionType), null, null);
|
||||||
|
|
||||||
if (state.getClassBuilderMode().generateBodies) {
|
if (state.getClassBuilderMode().generateBodies) {
|
||||||
@@ -198,7 +198,7 @@ public class SamWrapperCodegen {
|
|||||||
"%s$sam%s$%s" + SAM_WRAPPER_SUFFIX,
|
"%s$sam%s$%s" + SAM_WRAPPER_SUFFIX,
|
||||||
outermostOwner.shortName().asString(),
|
outermostOwner.shortName().asString(),
|
||||||
(isInsideInline ? "$i" : ""),
|
(isInsideInline ? "$i" : ""),
|
||||||
DescriptorUtils.getFqNameSafe(samType.getJavaClassDescriptor()).asString().replace('.', '_')
|
DescriptorUtils.getFqNameSafe(samType.getClassDescriptor()).asString().replace('.', '_')
|
||||||
);
|
);
|
||||||
return outermostOwner.parent().child(Name.identifier(shortName));
|
return outermostOwner.parent().child(Name.identifier(shortName));
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -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" }
|
||||||
|
}
|
||||||
+5
@@ -13684,6 +13684,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
public void testBasicFunInterface() throws Exception {
|
public void testBasicFunInterface() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterface.kt");
|
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")
|
@TestMetadata("compiler/testData/codegen/box/inlineClasses/functionNameMangling")
|
||||||
|
|||||||
+5
@@ -13684,6 +13684,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
public void testBasicFunInterface() throws Exception {
|
public void testBasicFunInterface() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterface.kt");
|
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")
|
@TestMetadata("compiler/testData/codegen/box/inlineClasses/functionNameMangling")
|
||||||
|
|||||||
+5
@@ -12534,6 +12534,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
public void testBasicFunInterface() throws Exception {
|
public void testBasicFunInterface() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/basicFunInterface.kt");
|
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")
|
@TestMetadata("compiler/testData/codegen/box/inlineClasses/functionNameMangling")
|
||||||
|
|||||||
Reference in New Issue
Block a user