Support parameterless and suspend main functions in multifile classes
#KT-26574 Fixed
This commit is contained in:
@@ -245,7 +245,7 @@ public class FunctionCodegen {
|
||||
parentBodyCodegen.addAdditionalTask(new JvmStaticInCompanionObjectGenerator(functionDescriptor, origin, state, parentBodyCodegen));
|
||||
}
|
||||
|
||||
generateBridgeForMainFunctionIfNecessary(state, v, functionDescriptor, jvmSignature, origin);
|
||||
generateBridgeForMainFunctionIfNecessary(state, v, functionDescriptor, jvmSignature, origin, methodContext.getParentContext());
|
||||
|
||||
boolean isOpenSuspendInClass =
|
||||
functionDescriptor.isSuspend() &&
|
||||
@@ -848,7 +848,7 @@ public class FunctionCodegen {
|
||||
return parameter.getName().asString();
|
||||
}
|
||||
|
||||
private static void generateFacadeDelegateMethodBody(
|
||||
public static void generateFacadeDelegateMethodBody(
|
||||
@NotNull MethodVisitor mv,
|
||||
@NotNull Method asmMethod,
|
||||
@NotNull MultifileClassFacadeContext context
|
||||
|
||||
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
||||
import org.jetbrains.kotlin.builtins.UnsignedTypes
|
||||
import org.jetbrains.kotlin.codegen.context.CodegenContext
|
||||
import org.jetbrains.kotlin.codegen.context.FieldOwnerContext
|
||||
import org.jetbrains.kotlin.codegen.context.MultifileClassFacadeContext
|
||||
import org.jetbrains.kotlin.codegen.context.PackageContext
|
||||
import org.jetbrains.kotlin.codegen.coroutines.continuationAsmType
|
||||
import org.jetbrains.kotlin.codegen.coroutines.unwrapInitialDescriptorForSuspendFunction
|
||||
@@ -480,7 +481,8 @@ fun generateBridgeForMainFunctionIfNecessary(
|
||||
packagePartClassBuilder: ClassBuilder,
|
||||
functionDescriptor: FunctionDescriptor,
|
||||
signatureOfRealDeclaration: JvmMethodGenericSignature,
|
||||
origin: JvmDeclarationOrigin
|
||||
origin: JvmDeclarationOrigin,
|
||||
parentContext: CodegenContext<*>
|
||||
) {
|
||||
val originElement = origin.element ?: return
|
||||
if (functionDescriptor.name.asString() != "main" || !DescriptorUtils.isTopLevelDeclaration(functionDescriptor)) return
|
||||
@@ -492,6 +494,24 @@ fun generateBridgeForMainFunctionIfNecessary(
|
||||
if (!functionDescriptor.isSuspend && !isParameterless) return
|
||||
if (!state.mainFunctionDetector.isMain(unwrappedFunctionDescriptor, false, true)) return
|
||||
|
||||
val bridgeMethodVisitor = packagePartClassBuilder.newMethod(
|
||||
Synthetic(originElement, functionDescriptor),
|
||||
ACC_PUBLIC or ACC_STATIC or ACC_SYNTHETIC,
|
||||
"main",
|
||||
METHOD_DESCRIPTOR_FOR_MAIN, null, null
|
||||
)
|
||||
|
||||
if (parentContext is MultifileClassFacadeContext) {
|
||||
bridgeMethodVisitor.visitCode()
|
||||
FunctionCodegen.generateFacadeDelegateMethodBody(
|
||||
bridgeMethodVisitor,
|
||||
Method("main", METHOD_DESCRIPTOR_FOR_MAIN),
|
||||
parentContext
|
||||
)
|
||||
bridgeMethodVisitor.visitEnd()
|
||||
return
|
||||
}
|
||||
|
||||
val lambdaInternalName =
|
||||
if (functionDescriptor.isSuspend)
|
||||
generateLambdaForRunSuspend(
|
||||
@@ -504,12 +524,7 @@ fun generateBridgeForMainFunctionIfNecessary(
|
||||
else
|
||||
null
|
||||
|
||||
packagePartClassBuilder.newMethod(
|
||||
Synthetic(originElement, functionDescriptor),
|
||||
ACC_PUBLIC or ACC_STATIC or ACC_SYNTHETIC,
|
||||
"main",
|
||||
METHOD_DESCRIPTOR_FOR_MAIN, null, null
|
||||
).apply {
|
||||
bridgeMethodVisitor.apply {
|
||||
visitCode()
|
||||
|
||||
if (lambdaInternalName != null) {
|
||||
|
||||
Reference in New Issue
Block a user