From d6b7214a65993aad48d42cc9f08f979773496997 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 31 Aug 2015 17:49:40 +0300 Subject: [PATCH] More psi-only checks for Kotlin main function --- .../kotlin/idea/MainFunctionDetector.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.java b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.java index e0e28be9ec5..529747b87ae 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.psi.JetAnnotationEntry; import org.jetbrains.kotlin.psi.JetDeclaration; import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetNamedFunction; @@ -61,7 +62,21 @@ public class MainFunctionDetector { } public boolean isMain(@NotNull JetNamedFunction function) { - if (!"main".equals(function.getName()) && function.getAnnotationEntries().isEmpty()) { + if (function.isLocal()) { + return false; + } + + if (function.getValueParameters().size() != 1 || !function.getTypeParameters().isEmpty()) { + return false; + } + + /* Psi only check for kotlin.jvm.jvmName annotation */ + if (!"main".equals(function.getName()) && !hasAnnotationWithExactNumberOfArguments(function, 1)) { + return false; + } + + /* Psi only check for kotlin.jvm.jvmStatic annotation */ + if (!function.isTopLevel() && !hasAnnotationWithExactNumberOfArguments(function, 0)) { return false; } @@ -129,4 +144,14 @@ public class MainFunctionDetector { return functionDescriptor.getName().asString(); } + + private static boolean hasAnnotationWithExactNumberOfArguments(@NotNull JetNamedFunction function, int number) { + for (JetAnnotationEntry entry : function.getAnnotationEntries()) { + if (entry.getValueArguments().size() == number) { + return true; + } + } + + return false; + } }