From 0d8036bb140c3353775180eb8352e51617dce4f8 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Tue, 17 Dec 2019 18:45:46 +0300 Subject: [PATCH] JVM_IR: do not generate main() when extension main is present Extension methods with signature C.main() should not cause generation of main(args: Array). --- .../backend/jvm/lower/MainMethodGenerationLowering.kt | 6 +++++- .../parameterlessMain/dontGenerateOnExtensionReceiver.kt | 3 +++ .../jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java | 5 +++++ .../kotlin/codegen/ir/IrBytecodeTextTestGenerated.java | 5 +++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnExtensionReceiver.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt index 8d0c3acdeb8..7c52e777f75 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt @@ -68,7 +68,11 @@ internal class MainMethodGenerationLowering(val context: JvmBackendContext) : Cl } private fun IrSimpleFunction.isParameterlessMainMethod(): Boolean = - typeParameters.isEmpty() && valueParameters.isEmpty() && returnType.isUnit() && name.asString() == "main" + typeParameters.isEmpty() && + extensionReceiverParameter == null && + valueParameters.isEmpty() && + returnType.isUnit() && + name.asString() == "main" private fun IrSimpleFunction.isMainMethod(): Boolean { diff --git a/compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnExtensionReceiver.kt b/compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnExtensionReceiver.kt new file mode 100644 index 00000000000..7e7c0a51dd8 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnExtensionReceiver.kt @@ -0,0 +1,3 @@ +fun Any.main() {} + +// 0 main (\[Ljava/lang/String;)V \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 915d9040c18..8804141a1f7 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -3696,6 +3696,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/bytecodeText/parameterlessMain"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @TestMetadata("dontGenerateOnExtensionReceiver.kt") + public void testDontGenerateOnExtensionReceiver() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnExtensionReceiver.kt"); + } + @TestMetadata("dontGenerateOnJvmNameMain.kt") public void testDontGenerateOnJvmNameMain() throws Exception { runTest("compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnJvmNameMain.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java index afebce7f531..7840f7a90bd 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java @@ -3614,6 +3614,11 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/bytecodeText/parameterlessMain"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @TestMetadata("dontGenerateOnExtensionReceiver.kt") + public void testDontGenerateOnExtensionReceiver() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnExtensionReceiver.kt"); + } + @TestMetadata("dontGenerateOnJvmNameMain.kt") public void testDontGenerateOnJvmNameMain() throws Exception { runTest("compiler/testData/codegen/bytecodeText/parameterlessMain/dontGenerateOnJvmNameMain.kt");