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 50cd881fa59..dbfd19788f5 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 @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm.diagnostics; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.diagnostics.rendering.*; -import org.jetbrains.kotlin.renderer.DescriptorRenderer; +import org.jetbrains.kotlin.resolve.MemberComparator; import java.util.ArrayList; import java.util.Collections; @@ -31,17 +31,19 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { @NotNull @Override public String render(@NotNull ConflictingJvmDeclarationsData data, @NotNull RenderingContext context) { - List renderedDescriptors = new ArrayList(); + List renderedDescriptors = new ArrayList(); for (JvmDeclarationOrigin origin : data.getSignatureOrigins()) { DeclarationDescriptor descriptor = origin.getDescriptor(); if (descriptor != null) { - renderedDescriptors.add(DescriptorRenderer.COMPACT.render(descriptor)); + renderedDescriptors.add(descriptor); } } - Collections.sort(renderedDescriptors); + Collections.sort(renderedDescriptors, MemberComparator.INSTANCE); + RenderingContext.Impl renderingContext = new RenderingContext.Impl(renderedDescriptors); + StringBuilder sb = new StringBuilder(); - for (String renderedDescriptor : renderedDescriptors) { - sb.append(" ").append(renderedDescriptor).append("\n"); + for (DeclarationDescriptor descriptor : renderedDescriptors) { + sb.append(" ").append(Renderers.COMPACT.render(descriptor, renderingContext)).append("\n"); } return ("The following declarations have the same JVM signature (" + data.getSignature().getName() + data.getSignature().getDesc() + "):\n" + sb).trim(); } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt index e5f2e5444f2..1ade99e7fb4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt @@ -71,13 +71,14 @@ object IdeRenderers { withDefinedIn = false }.asRenderer() - @JvmField val HTML_CONFLICTING_JVM_DECLARATIONS_DATA = ContextDependentRenderer { - data: ConflictingJvmDeclarationsData, renderingContext -> + @JvmField val HTML_CONFLICTING_JVM_DECLARATIONS_DATA = Renderer { + data: ConflictingJvmDeclarationsData -> - val conflicts = data.signatureOrigins + val descriptors = data.signatureOrigins .mapNotNull { it.descriptor } .sortedWith(MemberComparator.INSTANCE) - .joinToString("") { "
  • " + HTML_COMPACT_WITH_MODIFIERS.render(it, renderingContext) + "
  • \n" } + val context = RenderingContext.of(descriptors) + val conflicts = descriptors.joinToString("") { "
  • " + HTML_COMPACT_WITH_MODIFIERS.render(it, context) + "
  • \n" } "The following declarations have the same JVM signature (${data.signature.name}${data.signature.desc}):
    \n
      \n$conflicts
    " } diff --git a/idea/testData/checker/duplicateJvmSignature/functionAndProperty/ambiguous.kt b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/ambiguous.kt new file mode 100644 index 00000000000..136a15cb5c4 --- /dev/null +++ b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/ambiguous.kt @@ -0,0 +1,12 @@ +package a.b + +class String + +interface I { + fun foo(l: List) + fun foo(l: List) +} \ No newline at end of file diff --git a/idea/testData/checker/duplicateJvmSignature/functionAndProperty/topLevelMultifileRuntime.kt b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/topLevelMultifileRuntime.kt index 346ad72b70a..12c3859e62c 100644 --- a/idea/testData/checker/duplicateJvmSignature/functionAndProperty/topLevelMultifileRuntime.kt +++ b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/topLevelMultifileRuntime.kt @@ -6,8 +6,8 @@ import kotlin.jvm.JvmName import kotlin.jvm.JvmMultifileClass val x = 1 + fun (): Int + fun getX(): Int">val x = 1 fun getX() = 1 \ No newline at end of file + fun (): Int + fun getX(): Int">fun getX() = 1 \ No newline at end of file diff --git a/idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt index ba4c2058747..10b7784cf18 100644 --- a/idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt +++ b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt @@ -1,8 +1,8 @@ interface T { fun foo(l: List) {} + fun foo(l: List): Unit + fun foo(l: List): Unit">fun foo(l: List) {} fun foo(l: List) {} + fun foo(l: List): Unit + fun foo(l: List): Unit">fun foo(l: List) {} } diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index 5601e4e4690..b53d35c8a86 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -729,6 +729,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/checker/duplicateJvmSignature/functionAndProperty"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("ambiguous.kt") + public void testAmbiguous() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/duplicateJvmSignature/functionAndProperty/ambiguous.kt"); + doTest(fileName); + } + @TestMetadata("class.kt") public void testClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/duplicateJvmSignature/functionAndProperty/class.kt");