From 30f5eb0bfa5f3923c940aa241cfb67a5d3244005 Mon Sep 17 00:00:00 2001 From: alexander-gorshenev Date: Thu, 13 Sep 2018 10:23:02 +0300 Subject: [PATCH] Allow entry points without `args: Array` (#2049) --- .../kotlin/backend/konan/llvm/EntryPoint.kt | 19 +++++++++++++------ .../kotlin/backend/konan/llvm/IrToBitcode.kt | 15 ++++++++++----- backend.native/tests/build.gradle | 11 +++++++++++ backend.native/tests/runtime/basic/entry1.kt | 4 ++++ backend.native/tests/runtime/basic/entry4.kt | 3 +++ 5 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 backend.native/tests/runtime/basic/entry4.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt index 642cca91f8f..ce27da06222 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt @@ -36,16 +36,21 @@ internal fun findMainEntryPoint(context: Context): FunctionDescriptor? { val packageScope = context.builtIns.builtInsModule.getPackage(packageName).memberScope - val main = packageScope.getContributedFunctions(entryName, - NoLookupLocation.FROM_BACKEND).singleOrNull { + val candidates = packageScope.getContributedFunctions(entryName, + NoLookupLocation.FROM_BACKEND).filter { it.returnType?.isUnit() == true && - it.hasSingleArrayOfStringParameter && it.typeParameters.isEmpty() && it.visibility.isPublicAPI } - if (main == null) { - context.reportCompilationError("Could not find '$entryName' in '$packageName' package.") - } + + val main = + candidates.singleOrNull { it.hasSingleArrayOfStringParameter } ?: + candidates.singleOrNull { it.hasNoParameters } ?: + run { + context.reportCompilationError("Could not find '$entryName' in '$packageName' package.") + null + } + return main } @@ -73,3 +78,5 @@ private val KotlinType.isArrayOfString: Boolean private val FunctionDescriptor.hasSingleArrayOfStringParameter: Boolean get() = valueParameters.singleOrNull()?.type?.isArrayOfString ?: false +private val FunctionDescriptor.hasNoParameters: Boolean + get() = valueParameters.isEmpty() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 642c9bffa23..1f68e807d78 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -2618,9 +2618,9 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map) { println("Hello.") } +fun bar() { + println("Hello, without args.") +} + fun main(args: Array) { fail() diff --git a/backend.native/tests/runtime/basic/entry4.kt b/backend.native/tests/runtime/basic/entry4.kt new file mode 100644 index 00000000000..2bb0ac9bd6f --- /dev/null +++ b/backend.native/tests/runtime/basic/entry4.kt @@ -0,0 +1,3 @@ +fun main() { + println("This is main without args") +}