JVM Cli: Proper Main-class manifest attribute for JvmStatic entry point.

`findMainClass` could handle main entry point from object and companion
object, not just top-level function.

Fixes [KT-32376](https://youtrack.jetbrains.com/issue/KT-32376).
This commit is contained in:
ov7a
2021-08-16 09:53:51 +03:00
committed by Alexander Udalov
parent ed1bee6975
commit 5ddf0cc7b2
3 changed files with 88 additions and 12 deletions
@@ -39,6 +39,71 @@ class CustomCliTest : TestCaseWithTmpdir() {
compileAndCheckMainClass(listOf(main1Kt, main2Kt), expectedMainClass = null)
}
fun testObjectJvmStaticFunctionMainClass() {
val mainKt = tmpdir.resolve("main.kt").apply {
writeText(
"""
object ObjectMain {
@JvmStatic
fun main(args: Array<String>) = println("hello")
}
"""
)
}
compileAndCheckMainClass(listOf(mainKt), expectedMainClass = "ObjectMain")
}
fun testCompanionObjectJvmStaticFunctionMainClass() {
val mainKt = tmpdir.resolve("main.kt").apply {
writeText(
"""
class Test {
companion object {
@JvmStatic
fun main(args: Array<String>) = println("hello")
}
}
"""
)
}
compileAndCheckMainClass(listOf(mainKt), expectedMainClass = "Test")
}
fun testInterfaceCompanionObjectJvmStaticFunctionMainClass() {
val mainKt = tmpdir.resolve("main.kt").apply {
writeText(
"""
interface Test {
companion object {
@JvmStatic
fun main(args: Array<String>) = println("hello")
}
}
"""
)
}
compileAndCheckMainClass(listOf(mainKt), expectedMainClass = "Test")
}
fun testMultipleMainsInOneFile() {
val mainKt = tmpdir.resolve("main.kt").apply {
writeText(
"""
object ObjectMain {
@JvmStatic
fun main(args: Array<String>) = println("hello")
}
object ObjectMain2 {
@JvmStatic
fun main(args: Array<String>) = println("hello2")
}
fun main(args: Array<String>) = println("hello3")
"""
)
}
compileAndCheckMainClass(listOf(mainKt), expectedMainClass = null)
}
private fun compileAndCheckMainClass(sourceFiles: List<File>, expectedMainClass: String?) {
val jarFile = tmpdir.resolve("output.jar")
val args = listOf("-include-runtime", "-d", jarFile.absolutePath) + sourceFiles.map { it.absolutePath }