fix KT-10064 Regression: Error with multiple main functions within a single package
#KT-10064 Fixed
This commit is contained in:
@@ -80,13 +80,19 @@ public class MainFunctionDetector {
|
||||
return false;
|
||||
}
|
||||
|
||||
FunctionDescriptor functionDescriptor = getFunctionDescriptor.fun(function);
|
||||
return isMain(getFunctionDescriptor.fun(function));
|
||||
}
|
||||
|
||||
public static boolean isMain(@NotNull DeclarationDescriptor descriptor) {
|
||||
if (!(descriptor instanceof FunctionDescriptor)) return false;
|
||||
|
||||
FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor;
|
||||
if (!getJVMFunctionName(functionDescriptor).equals("main")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<ValueParameterDescriptor> parameters = functionDescriptor.getValueParameters();
|
||||
if (parameters.size() != 1) return false;
|
||||
if (parameters.size() != 1 || !functionDescriptor.getTypeParameters().isEmpty()) return false;
|
||||
|
||||
ValueParameterDescriptor parameter = parameters.get(0);
|
||||
KotlinType parameterType = parameter.getType();
|
||||
|
||||
@@ -17,16 +17,17 @@
|
||||
package org.jetbrains.kotlin.resolve
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
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.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||
import java.util.ArrayList
|
||||
import java.util.*
|
||||
|
||||
public object DescriptorToSourceUtils {
|
||||
private fun collectEffectiveReferencedDescriptors(result: MutableList<DeclarationDescriptor>, descriptor: DeclarationDescriptor) {
|
||||
@@ -80,16 +81,6 @@ public object DescriptorToSourceUtils {
|
||||
return declaration.getContainingFile() as? KtFile
|
||||
}
|
||||
|
||||
@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 KtNamedFunction && mainFunctionDetector.isMain(element)
|
||||
}
|
||||
|
||||
private fun findTopLevelParent(declarationDescriptor: DeclarationDescriptor): DeclarationDescriptor? {
|
||||
var descriptor: DeclarationDescriptor? = declarationDescriptor
|
||||
if (declarationDescriptor is PropertyAccessorDescriptor) {
|
||||
|
||||
@@ -36,7 +36,6 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName;
|
||||
public class OverloadResolver {
|
||||
@NotNull private final BindingTrace trace;
|
||||
@NotNull private final OverloadFilter overloadFilter;
|
||||
@NotNull private final MainFunctionDetector mainFunctionDetector;
|
||||
|
||||
public OverloadResolver(
|
||||
@NotNull BindingTrace trace,
|
||||
@@ -44,8 +43,6 @@ public class OverloadResolver {
|
||||
) {
|
||||
this.trace = trace;
|
||||
this.overloadFilter = overloadFilter;
|
||||
|
||||
mainFunctionDetector = new MainFunctionDetector(trace.getBindingContext());
|
||||
}
|
||||
|
||||
public void process(@NotNull BodiesResolveContext c) {
|
||||
@@ -160,7 +157,7 @@ public class OverloadResolver {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private Set<Pair<KtDeclaration, CallableMemberDescriptor>> findRedeclarations(@NotNull Collection<? extends CallableMemberDescriptor> members) {
|
||||
private static Set<Pair<KtDeclaration, CallableMemberDescriptor>> findRedeclarations(@NotNull Collection<? extends CallableMemberDescriptor> members) {
|
||||
Set<Pair<KtDeclaration, CallableMemberDescriptor>> redeclarations = Sets.newLinkedHashSet();
|
||||
for (CallableMemberDescriptor member : members) {
|
||||
for (CallableMemberDescriptor member2 : members) {
|
||||
@@ -195,13 +192,15 @@ public class OverloadResolver {
|
||||
member.getContainingDeclaration().getContainingDeclaration().equals(member2.getContainingDeclaration().getContainingDeclaration());
|
||||
}
|
||||
|
||||
private boolean isTopLevelMainInDifferentFiles(@NotNull CallableMemberDescriptor member, @NotNull CallableMemberDescriptor member2) {
|
||||
if (!DescriptorToSourceUtils.isTopLevelMainFunction(member, mainFunctionDetector) ||
|
||||
!DescriptorToSourceUtils.isTopLevelMainFunction(member2, mainFunctionDetector)) {
|
||||
private static boolean isTopLevelMainInDifferentFiles(@NotNull CallableMemberDescriptor member, @NotNull CallableMemberDescriptor member2) {
|
||||
if (!MainFunctionDetector.isMain(member) ||
|
||||
!MainFunctionDetector.isMain(member2)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return DescriptorToSourceUtils.getContainingFile(member) != DescriptorToSourceUtils.getContainingFile(member2);
|
||||
KtFile file = DescriptorToSourceUtils.getContainingFile(member);
|
||||
KtFile file2 = DescriptorToSourceUtils.getContainingFile(member2);
|
||||
return file == null || file2 == null || file != file2;
|
||||
}
|
||||
|
||||
private void reportRedeclarations(@NotNull String functionContainer,
|
||||
|
||||
+6
@@ -395,6 +395,12 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("mainRedeclaration")
|
||||
public void testMainRedeclaration() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/mainRedeclaration/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveClass")
|
||||
public void testMoveClass() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/moveClass/");
|
||||
|
||||
@@ -395,6 +395,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("mainRedeclaration")
|
||||
public void testMainRedeclaration() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/mainRedeclaration/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveClass")
|
||||
public void testMoveClass() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/moveClass/");
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
package foo
|
||||
|
||||
fun main(args: Array<String>) = println("a")
|
||||
@@ -0,0 +1,3 @@
|
||||
package foo
|
||||
|
||||
fun main(args: Array<String>) = println("A")
|
||||
@@ -0,0 +1,3 @@
|
||||
package foo
|
||||
|
||||
fun main(args: Array<String>) = println("b")
|
||||
@@ -0,0 +1,7 @@
|
||||
Cleaning output files:
|
||||
out/production/module/META-INF/module.kotlin_module
|
||||
out/production/module/foo/AKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
src/a.kt
|
||||
End of files
|
||||
Reference in New Issue
Block a user