fix KT-9733 No error shown for 2 "main" functions in the same file

#KT-9733 Fixed
This commit is contained in:
Michael Nedzelsky
2015-10-26 14:53:26 +03:00
parent 31bff24c55
commit 63f84fc60e
5 changed files with 29 additions and 9 deletions
@@ -70,9 +70,6 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
for (origin in data.signatureOrigins) {
var element = origin.element
// TODO Remove this code after dropping package facades
if (element is KtNamedFunction && mainFunctionDetector.isMain(element) && !element.isInsideJvmMultifileClassFile()) return
if (element == null || origin.originKind in EXTERNAL_SOURCES_KINDS) {
element = data.classOrigin.element
}
@@ -25,10 +25,7 @@ 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.KtClassOrObject;
import org.jetbrains.kotlin.psi.KtDeclaration;
import org.jetbrains.kotlin.psi.KtObjectDeclaration;
import org.jetbrains.kotlin.psi.KtSecondaryConstructor;
import org.jetbrains.kotlin.psi.*;
import java.util.Collection;
import java.util.Map;
@@ -156,7 +153,7 @@ public class OverloadResolver {
}
@NotNull
private static Set<Pair<KtDeclaration, CallableMemberDescriptor>> findRedeclarations(@NotNull Collection<? extends CallableMemberDescriptor> members) {
private 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) {
@@ -165,6 +162,10 @@ public class OverloadResolver {
}
if (!OverloadUtil.isOverloadable(member, member2) && member.getKind() != CallableMemberDescriptor.Kind.SYNTHESIZED) {
if (isTopLevelMainInDifferentFiles(member, member2)) {
continue;
}
KtDeclaration ktDeclaration = (KtDeclaration) DescriptorToSourceUtils.descriptorToDeclaration(member);
if (ktDeclaration != null) {
redeclarations.add(Pair.create(ktDeclaration, member));
@@ -187,11 +188,19 @@ 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)) {
return false;
}
return DescriptorToSourceUtils.getContainingFile(member) != DescriptorToSourceUtils.getContainingFile(member2);
}
private void reportRedeclarations(@NotNull String functionContainer,
@NotNull Set<Pair<KtDeclaration, CallableMemberDescriptor>> redeclarations) {
for (Pair<KtDeclaration, CallableMemberDescriptor> redeclaration : redeclarations) {
CallableMemberDescriptor memberDescriptor = redeclaration.getSecond();
if (DescriptorToSourceUtils.isTopLevelMainFunction(memberDescriptor, mainFunctionDetector)) return;
KtDeclaration ktDeclaration = redeclaration.getFirst();
if (memberDescriptor instanceof PropertyDescriptor) {
@@ -0,0 +1,4 @@
// KT-9733 No error shown for 2 "main" functions in the same file
<!CONFLICTING_OVERLOADS!>fun main(args: Array<String>)<!> {}
<!CONFLICTING_OVERLOADS!>fun main(args: Array<String>)<!> {}
@@ -0,0 +1,4 @@
package
public fun main(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit
public fun main(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit
@@ -11937,6 +11937,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("RedeclarationMainInFile.kt")
public void testRedeclarationMainInFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.kt");
doTest(fileName);
}
@TestMetadata("RedeclarationMainInMultiFile.kt")
public void testRedeclarationMainInMultiFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInMultiFile.kt");