diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateClassNameDiagnostics.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateClassNameDiagnostics.kt index a5571785d9f..e313fc5cd0f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateClassNameDiagnostics.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateClassNameDiagnostics.kt @@ -26,11 +26,13 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor +import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.jvm import org.jetbrains.kotlin.resolve.jvm.diagnostics.* import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.kotlin.utils.join import java.util.* @@ -43,25 +45,18 @@ class BuilderFactoryForDuplicateClassNameDiagnostics( override fun handleClashingNames(internalName: String, origin: JvmDeclarationOrigin) { val another = className.getOrPut(internalName, { origin }) + //workaround for inlined anonymous objects if (origin.element != another.element) { - if (origin.originKind == JvmDeclarationOriginKind.PACKAGE_FACADE || another.originKind == JvmDeclarationOriginKind.PACKAGE_FACADE) { - if (origin.originKind == JvmDeclarationOriginKind.PACKAGE_FACADE) { - reportError(another, internalName) - } else { - reportError(another, internalName) - } - } else { - if (origin.element != null) { - reportError(origin, internalName) - } - if (another.element != null) { - reportError(another, internalName) - } - } + reportError(internalName, origin, another) } } - private fun reportError(another: JvmDeclarationOrigin, internalName: String) { - diagnostics.report(ErrorsJvm.DUPLICATE_CLASS_NAMES.on(another.element, internalName)) + private fun reportError(internalName: String, vararg another: JvmDeclarationOrigin) { + val fromString = another.map { it.descriptor }.filterNotNull(). + joinToString { DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(it) } + + another.map { it.element }.filterNotNull().forEach { + diagnostics.report(ErrorsJvm.DUPLICATE_CLASS_NAMES.on(it, internalName, fromString)) + } } } \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index 71818e06d1c..f985ebe7a15 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -85,7 +85,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(ErrorsJvm.JAVA_TYPE_MISMATCH, "Java type mismatch expected {1} but found {0}. Use explicit cast", Renderers.RENDER_TYPE, Renderers.RENDER_TYPE); - MAP.put(ErrorsJvm.DUPLICATE_CLASS_NAMES, "Class names ''{0}'' conflict with package name (facade or part)", Renderers.TO_STRING); + MAP.put(ErrorsJvm.DUPLICATE_CLASS_NAMES, "Duplicate JVM class name ''{0}'' generated from: {1}", Renderers.TO_STRING, Renderers.TO_STRING); } @NotNull diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index e1c0c5c1491..62c23904e2e 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -69,7 +69,7 @@ public interface ErrorsJvm { DiagnosticFactory2 JAVA_CLASS_ON_COMPANION = DiagnosticFactory2.create(WARNING); DiagnosticFactory2 JAVA_TYPE_MISMATCH = DiagnosticFactory2.create(ERROR); - DiagnosticFactory1 DUPLICATE_CLASS_NAMES = DiagnosticFactory1.create(ERROR); + DiagnosticFactory2 DUPLICATE_CLASS_NAMES = DiagnosticFactory2.create(ERROR); enum NullabilityInformationSource { KOTLIN { diff --git a/compiler/testData/cli/jvm/classAndFacadeClash.args b/compiler/testData/cli/jvm/classAndFacadeClash.args new file mode 100644 index 00000000000..7dc958f8eb6 --- /dev/null +++ b/compiler/testData/cli/jvm/classAndFacadeClash.args @@ -0,0 +1,3 @@ +$TESTDATA_DIR$/classAndFacadeClash.kt +-d +$TEMP_DIR$ diff --git a/compiler/testData/cli/jvm/classAndFacadeClash.kt b/compiler/testData/cli/jvm/classAndFacadeClash.kt new file mode 100644 index 00000000000..ee7dbf1efa8 --- /dev/null +++ b/compiler/testData/cli/jvm/classAndFacadeClash.kt @@ -0,0 +1,10 @@ +package test + +class TestPackage { + +} + + +fun z () { + +} \ No newline at end of file diff --git a/compiler/testData/cli/jvm/classAndFacadeClash.out b/compiler/testData/cli/jvm/classAndFacadeClash.out new file mode 100644 index 00000000000..248299908d4 --- /dev/null +++ b/compiler/testData/cli/jvm/classAndFacadeClash.out @@ -0,0 +1,4 @@ +compiler/testData/cli/jvm/classAndFacadeClash.kt:3:1: error: duplicate JVM class name 'test/TestPackage' generated from: package-fragment test, TestPackage +class TestPackage { +^ +COMPILATION_ERROR \ No newline at end of file diff --git a/compiler/testData/cli/jvm/classAndPartClash.args b/compiler/testData/cli/jvm/classAndPartClash.args new file mode 100644 index 00000000000..4715c39f8b6 --- /dev/null +++ b/compiler/testData/cli/jvm/classAndPartClash.args @@ -0,0 +1,3 @@ +$TESTDATA_DIR$/classAndPartClash.kt +-d +$TEMP_DIR$ diff --git a/compiler/testData/cli/jvm/classAndPartClash.kt b/compiler/testData/cli/jvm/classAndPartClash.kt new file mode 100644 index 00000000000..32cd97a93a4 --- /dev/null +++ b/compiler/testData/cli/jvm/classAndPartClash.kt @@ -0,0 +1,13 @@ +package test + +class ClassAndPartClash { + +} + +class ClassAndPartClash_ { + +} + +fun z () { + +} \ No newline at end of file diff --git a/compiler/testData/cli/jvm/classAndPartClash.out b/compiler/testData/cli/jvm/classAndPartClash.out new file mode 100644 index 00000000000..db2aabb9f0a --- /dev/null +++ b/compiler/testData/cli/jvm/classAndPartClash.out @@ -0,0 +1,7 @@ +compiler/testData/cli/jvm/classAndPartClash.kt:1:1: error: duplicate JVM class name 'test/ClassAndPartClash_' generated from: package-fragment test, ClassAndPartClash_ +package test +^ +compiler/testData/cli/jvm/classAndPartClash.kt:7:1: error: duplicate JVM class name 'test/ClassAndPartClash_' generated from: package-fragment test, ClassAndPartClash_ +class ClassAndPartClash_ { +^ +COMPILATION_ERROR \ No newline at end of file diff --git a/compiler/testData/cli/jvm/classAndTraitClash.args b/compiler/testData/cli/jvm/classAndTraitClash.args new file mode 100644 index 00000000000..725b9b150d7 --- /dev/null +++ b/compiler/testData/cli/jvm/classAndTraitClash.args @@ -0,0 +1,3 @@ +$TESTDATA_DIR$/classAndTraitClash.kt +-d +$TEMP_DIR$ diff --git a/compiler/testData/cli/jvm/classAndTraitClash.kt b/compiler/testData/cli/jvm/classAndTraitClash.kt new file mode 100644 index 00000000000..6d8423cf32e --- /dev/null +++ b/compiler/testData/cli/jvm/classAndTraitClash.kt @@ -0,0 +1,9 @@ +package test + +interface T1 { + +} + +class `T1$$TImpl` { + +} \ No newline at end of file diff --git a/compiler/testData/cli/jvm/classAndTraitClash.out b/compiler/testData/cli/jvm/classAndTraitClash.out new file mode 100644 index 00000000000..a50aedbd2f3 --- /dev/null +++ b/compiler/testData/cli/jvm/classAndTraitClash.out @@ -0,0 +1,7 @@ +compiler/testData/cli/jvm/classAndTraitClash.kt:3:1: error: duplicate JVM class name 'test/T1$$TImpl' generated from: `T1$$TImpl`, T1 +interface T1 { +^ +compiler/testData/cli/jvm/classAndTraitClash.kt:7:1: error: duplicate JVM class name 'test/T1$$TImpl' generated from: `T1$$TImpl`, T1 +class `T1$$TImpl` { +^ +COMPILATION_ERROR \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java index 0495cffe9fa..39cd53b27b0 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java @@ -37,6 +37,24 @@ public class KotlincExecutableTestGenerated extends AbstractKotlincExecutableTes JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/cli/jvm"), Pattern.compile("^(.+)\\.args$"), false); } + @TestMetadata("classAndFacadeClash.args") + public void testClassAndFacadeClash() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/jvm/classAndFacadeClash.args"); + doJvmTest(fileName); + } + + @TestMetadata("classAndPartClash.args") + public void testClassAndPartClash() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/jvm/classAndPartClash.args"); + doJvmTest(fileName); + } + + @TestMetadata("classAndTraitClash.args") + public void testClassAndTraitClash() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/jvm/classAndTraitClash.args"); + doJvmTest(fileName); + } + @TestMetadata("classpath.args") public void testClasspath() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/jvm/classpath.args");