use MainFunctionDetector in order to check for main function

This commit is contained in:
Michael Nedzelsky
2015-10-15 18:31:05 +03:00
parent e2c7ba7f40
commit 114d19e6d9
4 changed files with 22 additions and 27 deletions
@@ -17,15 +17,14 @@
package org.jetbrains.kotlin.resolve
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.psi.JetAnnotationEntry
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetNamedFunction
import org.jetbrains.kotlin.resolve.source.getPsi
import java.util.ArrayList
@@ -81,6 +80,16 @@ public object DescriptorToSourceUtils {
return declaration.getContainingFile() as? JetFile
}
@JvmStatic
public fun isTopLevelMainFunction(declarationDescriptor: DeclarationDescriptor, mainFunctionDetector: MainFunctionDetector): Boolean {
if (declarationDescriptor !is FunctionDescriptor ||
!DescriptorUtils.isTopLevelDeclaration(declarationDescriptor) ||
declarationDescriptor.name.asString() != "main") return false
val element = descriptorToDeclaration(declarationDescriptor)
return element is JetNamedFunction && mainFunctionDetector.isMain(element)
}
private fun findTopLevelParent(declarationDescriptor: DeclarationDescriptor): DeclarationDescriptor? {
var descriptor: DeclarationDescriptor? = declarationDescriptor
if (declarationDescriptor is PropertyAccessorDescriptor) {
@@ -22,6 +22,7 @@ import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.diagnostics.Errors;
import org.jetbrains.kotlin.idea.MainFunctionDetector;
import org.jetbrains.kotlin.name.FqNameUnsafe;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.JetClassOrObject;
@@ -37,9 +38,11 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName;
public class OverloadResolver {
@NotNull private final BindingTrace trace;
@NotNull private final MainFunctionDetector mainFunctionDetector;
public OverloadResolver(@NotNull BindingTrace trace) {
this.trace = trace;
mainFunctionDetector = new MainFunctionDetector(trace.getBindingContext());
}
public void process(@NotNull BodiesResolveContext c) {
@@ -195,7 +198,7 @@ public class OverloadResolver {
@NotNull Set<Pair<JetDeclaration, CallableMemberDescriptor>> redeclarations) {
for (Pair<JetDeclaration, CallableMemberDescriptor> redeclaration : redeclarations) {
CallableMemberDescriptor memberDescriptor = redeclaration.getSecond();
if (DescriptorUtils.isTopLevelMainFunction(memberDescriptor)) break;
if (DescriptorToSourceUtils.isTopLevelMainFunction(memberDescriptor, mainFunctionDetector)) return;
JetDeclaration jetDeclaration = redeclaration.getFirst();
if (memberDescriptor instanceof PropertyDescriptor) {