use MainFunctionDetector in order to check for main function
This commit is contained in:
+5
-7
@@ -27,12 +27,12 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERR
|
|||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider
|
||||||
import org.jetbrains.kotlin.fileClasses.isInsideJvmMultifileClassFile
|
import org.jetbrains.kotlin.fileClasses.isInsideJvmMultifileClassFile
|
||||||
|
import org.jetbrains.kotlin.idea.MainFunctionDetector
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor
|
||||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
|
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
|
||||||
import org.jetbrains.kotlin.psi.JetDeclaration
|
import org.jetbrains.kotlin.psi.JetNamedFunction
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.*
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.*
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -54,6 +54,8 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
|
|||||||
// Avoid errors when some classes are not loaded for some reason
|
// Avoid errors when some classes are not loaded for some reason
|
||||||
private val typeMapper = JetTypeMapper(bindingContext, ClassBuilderMode.LIGHT_CLASSES, fileClassesProvider, incrementalCache, moduleName)
|
private val typeMapper = JetTypeMapper(bindingContext, ClassBuilderMode.LIGHT_CLASSES, fileClassesProvider, incrementalCache, moduleName)
|
||||||
|
|
||||||
|
private val mainFunctionDetector = MainFunctionDetector(bindingContext)
|
||||||
|
|
||||||
override fun handleClashingSignatures(data: ConflictingJvmDeclarationsData) {
|
override fun handleClashingSignatures(data: ConflictingJvmDeclarationsData) {
|
||||||
val noOwnImplementations = data.signatureOrigins.all { it.originKind in EXTERNAL_SOURCES_KINDS }
|
val noOwnImplementations = data.signatureOrigins.all { it.originKind in EXTERNAL_SOURCES_KINDS }
|
||||||
|
|
||||||
@@ -66,11 +68,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
|
|||||||
var element = origin.element
|
var element = origin.element
|
||||||
|
|
||||||
// TODO Remove this code after dropping package facades
|
// TODO Remove this code after dropping package facades
|
||||||
val descriptor = origin.descriptor
|
if (element is JetNamedFunction && mainFunctionDetector.isMain(element) && !element.isInsideJvmMultifileClassFile()) return
|
||||||
if (descriptor != null && element is JetDeclaration && DescriptorUtils.isTopLevelMainFunction(descriptor) &&
|
|
||||||
!element.isInsideJvmMultifileClassFile()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element == null || origin.originKind in EXTERNAL_SOURCES_KINDS) {
|
if (element == null || origin.originKind in EXTERNAL_SOURCES_KINDS) {
|
||||||
element = data.classOrigin.element
|
element = data.classOrigin.element
|
||||||
|
|||||||
@@ -17,15 +17,14 @@
|
|||||||
package org.jetbrains.kotlin.resolve
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
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.DECLARATION
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED
|
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.descriptors.annotations.AnnotationDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.MainFunctionDetector
|
||||||
import org.jetbrains.kotlin.psi.JetAnnotationEntry
|
import org.jetbrains.kotlin.psi.JetAnnotationEntry
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
|
import org.jetbrains.kotlin.psi.JetNamedFunction
|
||||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
|
||||||
@@ -81,6 +80,16 @@ public object DescriptorToSourceUtils {
|
|||||||
return declaration.getContainingFile() as? JetFile
|
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? {
|
private fun findTopLevelParent(declarationDescriptor: DeclarationDescriptor): DeclarationDescriptor? {
|
||||||
var descriptor: DeclarationDescriptor? = declarationDescriptor
|
var descriptor: DeclarationDescriptor? = declarationDescriptor
|
||||||
if (declarationDescriptor is PropertyAccessorDescriptor) {
|
if (declarationDescriptor is PropertyAccessorDescriptor) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.intellij.util.containers.MultiMap;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
import org.jetbrains.kotlin.diagnostics.Errors;
|
||||||
|
import org.jetbrains.kotlin.idea.MainFunctionDetector;
|
||||||
import org.jetbrains.kotlin.name.FqNameUnsafe;
|
import org.jetbrains.kotlin.name.FqNameUnsafe;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.psi.JetClassOrObject;
|
import org.jetbrains.kotlin.psi.JetClassOrObject;
|
||||||
@@ -37,9 +38,11 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName;
|
|||||||
|
|
||||||
public class OverloadResolver {
|
public class OverloadResolver {
|
||||||
@NotNull private final BindingTrace trace;
|
@NotNull private final BindingTrace trace;
|
||||||
|
@NotNull private final MainFunctionDetector mainFunctionDetector;
|
||||||
|
|
||||||
public OverloadResolver(@NotNull BindingTrace trace) {
|
public OverloadResolver(@NotNull BindingTrace trace) {
|
||||||
this.trace = trace;
|
this.trace = trace;
|
||||||
|
mainFunctionDetector = new MainFunctionDetector(trace.getBindingContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void process(@NotNull BodiesResolveContext c) {
|
public void process(@NotNull BodiesResolveContext c) {
|
||||||
@@ -195,7 +198,7 @@ public class OverloadResolver {
|
|||||||
@NotNull Set<Pair<JetDeclaration, CallableMemberDescriptor>> redeclarations) {
|
@NotNull Set<Pair<JetDeclaration, CallableMemberDescriptor>> redeclarations) {
|
||||||
for (Pair<JetDeclaration, CallableMemberDescriptor> redeclaration : redeclarations) {
|
for (Pair<JetDeclaration, CallableMemberDescriptor> redeclaration : redeclarations) {
|
||||||
CallableMemberDescriptor memberDescriptor = redeclaration.getSecond();
|
CallableMemberDescriptor memberDescriptor = redeclaration.getSecond();
|
||||||
if (DescriptorUtils.isTopLevelMainFunction(memberDescriptor)) break;
|
if (DescriptorToSourceUtils.isTopLevelMainFunction(memberDescriptor, mainFunctionDetector)) return;
|
||||||
|
|
||||||
JetDeclaration jetDeclaration = redeclaration.getFirst();
|
JetDeclaration jetDeclaration = redeclaration.getFirst();
|
||||||
if (memberDescriptor instanceof PropertyDescriptor) {
|
if (memberDescriptor instanceof PropertyDescriptor) {
|
||||||
|
|||||||
@@ -630,21 +630,6 @@ public class DescriptorUtils {
|
|||||||
return SourceFile.NO_SOURCE_FILE;
|
return SourceFile.NO_SOURCE_FILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTopLevelMainFunction(@NotNull DeclarationDescriptor descriptor) {
|
|
||||||
if (!(descriptor instanceof FunctionDescriptor) ||
|
|
||||||
!isTopLevelDeclaration(descriptor) ||
|
|
||||||
!"main".equals(descriptor.getName().asString())) return false;
|
|
||||||
|
|
||||||
FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor;
|
|
||||||
List<ValueParameterDescriptor> valueParameterDescriptors = functionDescriptor.getValueParameters();
|
|
||||||
if (valueParameterDescriptors.size() != 1) return false;
|
|
||||||
|
|
||||||
JetType type = valueParameterDescriptors.get(0).getType();
|
|
||||||
|
|
||||||
return KotlinBuiltIns.isArray(type) && type.getArguments().size() == 1 && KotlinBuiltIns.isString(type.getArguments().get(0).getType());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static void getSubPackagesFqNames(PackageViewDescriptor packageView, Set<FqName> result) {
|
private static void getSubPackagesFqNames(PackageViewDescriptor packageView, Set<FqName> result) {
|
||||||
FqName fqName = packageView.getFqName();
|
FqName fqName = packageView.getFqName();
|
||||||
if (!fqName.isRoot()) {
|
if (!fqName.isRoot()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user