Update duplicate diagnostic

This commit is contained in:
Michael Bogdanov
2015-06-30 17:59:28 +03:00
parent d524cdeef7
commit 35d51a8ea4
13 changed files with 90 additions and 18 deletions
@@ -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))
}
}
}
@@ -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
@@ -69,7 +69,7 @@ public interface ErrorsJvm {
DiagnosticFactory2<JetElement, JetType, JetType> JAVA_CLASS_ON_COMPANION = DiagnosticFactory2.create(WARNING);
DiagnosticFactory2<JetExpression, JetType, JetType> JAVA_TYPE_MISMATCH = DiagnosticFactory2.create(ERROR);
DiagnosticFactory1<PsiElement, String> DUPLICATE_CLASS_NAMES = DiagnosticFactory1.create(ERROR);
DiagnosticFactory2<PsiElement, String, String> DUPLICATE_CLASS_NAMES = DiagnosticFactory2.create(ERROR);
enum NullabilityInformationSource {
KOTLIN {
+3
View File
@@ -0,0 +1,3 @@
$TESTDATA_DIR$/classAndFacadeClash.kt
-d
$TEMP_DIR$
+10
View File
@@ -0,0 +1,10 @@
package test
class TestPackage {
}
fun z () {
}
+4
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
$TESTDATA_DIR$/classAndPartClash.kt
-d
$TEMP_DIR$
+13
View File
@@ -0,0 +1,13 @@
package test
class ClassAndPartClash {
}
class ClassAndPartClash_ {
}
fun z () {
}
+7
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
$TESTDATA_DIR$/classAndTraitClash.kt
-d
$TEMP_DIR$
+9
View File
@@ -0,0 +1,9 @@
package test
interface T1 {
}
class `T1$$TImpl` {
}
+7
View File
@@ -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
@@ -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");