fix KT-9733 No error shown for 2 "main" functions in the same file
#KT-9733 Fixed
This commit is contained in:
-3
@@ -70,9 +70,6 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
|
|||||||
for (origin in data.signatureOrigins) {
|
for (origin in data.signatureOrigins) {
|
||||||
var element = origin.element
|
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) {
|
if (element == null || origin.originKind in EXTERNAL_SOURCES_KINDS) {
|
||||||
element = data.classOrigin.element
|
element = data.classOrigin.element
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,10 +25,7 @@ import org.jetbrains.kotlin.diagnostics.Errors;
|
|||||||
import org.jetbrains.kotlin.idea.MainFunctionDetector;
|
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.KtClassOrObject;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration;
|
|
||||||
import org.jetbrains.kotlin.psi.KtObjectDeclaration;
|
|
||||||
import org.jetbrains.kotlin.psi.KtSecondaryConstructor;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -156,7 +153,7 @@ public class OverloadResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@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();
|
Set<Pair<KtDeclaration, CallableMemberDescriptor>> redeclarations = Sets.newLinkedHashSet();
|
||||||
for (CallableMemberDescriptor member : members) {
|
for (CallableMemberDescriptor member : members) {
|
||||||
for (CallableMemberDescriptor member2 : members) {
|
for (CallableMemberDescriptor member2 : members) {
|
||||||
@@ -165,6 +162,10 @@ public class OverloadResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!OverloadUtil.isOverloadable(member, member2) && member.getKind() != CallableMemberDescriptor.Kind.SYNTHESIZED) {
|
if (!OverloadUtil.isOverloadable(member, member2) && member.getKind() != CallableMemberDescriptor.Kind.SYNTHESIZED) {
|
||||||
|
if (isTopLevelMainInDifferentFiles(member, member2)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
KtDeclaration ktDeclaration = (KtDeclaration) DescriptorToSourceUtils.descriptorToDeclaration(member);
|
KtDeclaration ktDeclaration = (KtDeclaration) DescriptorToSourceUtils.descriptorToDeclaration(member);
|
||||||
if (ktDeclaration != null) {
|
if (ktDeclaration != null) {
|
||||||
redeclarations.add(Pair.create(ktDeclaration, member));
|
redeclarations.add(Pair.create(ktDeclaration, member));
|
||||||
@@ -187,11 +188,19 @@ public class OverloadResolver {
|
|||||||
member.getContainingDeclaration().getContainingDeclaration().equals(member2.getContainingDeclaration().getContainingDeclaration());
|
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,
|
private void reportRedeclarations(@NotNull String functionContainer,
|
||||||
@NotNull Set<Pair<KtDeclaration, CallableMemberDescriptor>> redeclarations) {
|
@NotNull Set<Pair<KtDeclaration, CallableMemberDescriptor>> redeclarations) {
|
||||||
for (Pair<KtDeclaration, CallableMemberDescriptor> redeclaration : redeclarations) {
|
for (Pair<KtDeclaration, CallableMemberDescriptor> redeclaration : redeclarations) {
|
||||||
CallableMemberDescriptor memberDescriptor = redeclaration.getSecond();
|
CallableMemberDescriptor memberDescriptor = redeclaration.getSecond();
|
||||||
if (DescriptorToSourceUtils.isTopLevelMainFunction(memberDescriptor, mainFunctionDetector)) return;
|
|
||||||
|
|
||||||
KtDeclaration ktDeclaration = redeclaration.getFirst();
|
KtDeclaration ktDeclaration = redeclaration.getFirst();
|
||||||
if (memberDescriptor instanceof PropertyDescriptor) {
|
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>)<!> {}
|
||||||
+4
@@ -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);
|
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")
|
@TestMetadata("RedeclarationMainInMultiFile.kt")
|
||||||
public void testRedeclarationMainInMultiFile() throws Exception {
|
public void testRedeclarationMainInMultiFile() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInMultiFile.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInMultiFile.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user