From 63f84fc60ef33fe9b0995b5d5c4e649d0a2d1c65 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Mon, 26 Oct 2015 14:53:26 +0300 Subject: [PATCH] fix KT-9733 No error shown for 2 "main" functions in the same file #KT-9733 Fixed --- ...FactoryForDuplicateSignatureDiagnostics.kt | 3 --- .../kotlin/resolve/OverloadResolver.java | 21 +++++++++++++------ .../redeclarations/RedeclarationMainInFile.kt | 4 ++++ .../RedeclarationMainInFile.txt | 4 ++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 5 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.kt create mode 100644 compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt index d7264c1af6a..9541bdbb5cc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt @@ -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 } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java index df6d933f377..1a8a002f109 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java @@ -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> findRedeclarations(@NotNull Collection members) { + private Set> findRedeclarations(@NotNull Collection members) { Set> 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> redeclarations) { for (Pair redeclaration : redeclarations) { CallableMemberDescriptor memberDescriptor = redeclaration.getSecond(); - if (DescriptorToSourceUtils.isTopLevelMainFunction(memberDescriptor, mainFunctionDetector)) return; KtDeclaration ktDeclaration = redeclaration.getFirst(); if (memberDescriptor instanceof PropertyDescriptor) { diff --git a/compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.kt b/compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.kt new file mode 100644 index 00000000000..8e526c11a0c --- /dev/null +++ b/compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.kt @@ -0,0 +1,4 @@ +// KT-9733 No error shown for 2 "main" functions in the same file + +fun main(args: Array) {} +fun main(args: Array) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.txt b/compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.txt new file mode 100644 index 00000000000..abafee5d3ef --- /dev/null +++ b/compiler/testData/diagnostics/tests/redeclarations/RedeclarationMainInFile.txt @@ -0,0 +1,4 @@ +package + +public fun main(/*0*/ args: kotlin.Array): kotlin.Unit +public fun main(/*0*/ args: kotlin.Array): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index f72c27da352..cf1b999df95 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -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");