diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/diagnostics/DefaultErrorMessagesJvm.java index 1fdc1bdc161..875b13803cf 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/diagnostics/DefaultErrorMessagesJvm.java @@ -17,8 +17,10 @@ package org.jetbrains.jet.lang.resolve.java.diagnostics; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererMap; +import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.Renderer; public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { @@ -26,15 +28,22 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { private static final Renderer CONFLICTING_JVM_DECLARATIONS_DATA = new Renderer() { @NotNull @Override - public String render(@NotNull ConflictingJvmDeclarationsData element) { - return element.getSignature().getName() + element.getSignature().getDesc(); + public String render(@NotNull ConflictingJvmDeclarationsData data) { + StringBuilder sb = new StringBuilder(); + for (JvmDeclarationOrigin origin : data.getSignatureOrigins()) { + DeclarationDescriptor descriptor = origin.getDescriptor(); + if (descriptor != null) { + sb.append(" ").append(DescriptorRenderer.COMPACT.render(descriptor)).append("\n"); + } + } + return ("The following declarations have the same JVM signature (" + data.getSignature().getName() + data.getSignature().getDesc() + "):\n" + sb).trim(); } }; public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); static { - MAP.put(ErrorsJvm.CONFLICTING_JVM_DECLARATIONS, "Platform declaration clash: ''{0}''", CONFLICTING_JVM_DECLARATIONS_DATA); - MAP.put(ErrorsJvm.ACCIDENTAL_OVERRIDE, "Accidental override: ''{0}''", CONFLICTING_JVM_DECLARATIONS_DATA); + MAP.put(ErrorsJvm.CONFLICTING_JVM_DECLARATIONS, "Platform declaration clash: {0}", CONFLICTING_JVM_DECLARATIONS_DATA); + MAP.put(ErrorsJvm.ACCIDENTAL_OVERRIDE, "Accidental override: {0}", CONFLICTING_JVM_DECLARATIONS_DATA); } diff --git a/compiler/testData/cli/jvm/signatureClash.out b/compiler/testData/cli/jvm/signatureClash.out index 039ac7561a8..05743a714c9 100644 --- a/compiler/testData/cli/jvm/signatureClash.out +++ b/compiler/testData/cli/jvm/signatureClash.out @@ -1,6 +1,22 @@ -ERROR: $TESTDATA_DIR$/signatureClash.kt: (6, 5) Accidental override: 'getX()I' -ERROR: $TESTDATA_DIR$/signatureClash.kt: (8, 5) Platform declaration clash: 'getA()I' -ERROR: $TESTDATA_DIR$/signatureClash.kt: (9, 5) Platform declaration clash: 'getA()I' -ERROR: $TESTDATA_DIR$/signatureClash.kt: (12, 1) Platform declaration clash: 'getB()I' -ERROR: $TESTDATA_DIR$/signatureClash.kt: (13, 1) Platform declaration clash: 'getB()I' +ERROR: $TESTDATA_DIR$/signatureClash.kt: (6, 5) Accidental override: The following declarations have the same JVM signature (getX()I): + fun getX(): kotlin.Int + fun (): kotlin.Int +ERROR: $TESTDATA_DIR$/signatureClash.kt: (8, 5) Platform declaration clash: The following declarations have the same JVM signature (getA()I): + fun getA(): kotlin.Int + fun (): kotlin.Int +ERROR: $TESTDATA_DIR$/signatureClash.kt: (9, 5) Platform declaration clash: The following declarations have the same JVM signature (getA()I): + fun getA(): kotlin.Int + fun (): kotlin.Int +ERROR: $TESTDATA_DIR$/signatureClash.kt: (12, 1) Platform declaration clash: The following declarations have the same JVM signature (getB()I): + fun getB(): kotlin.Int + fun (): kotlin.Int +ERROR: $TESTDATA_DIR$/signatureClash.kt: (12, 1) Platform declaration clash: The following declarations have the same JVM signature (getB()I): + fun (): kotlin.Int + fun getB(): kotlin.Int +ERROR: $TESTDATA_DIR$/signatureClash.kt: (13, 1) Platform declaration clash: The following declarations have the same JVM signature (getB()I): + fun getB(): kotlin.Int + fun (): kotlin.Int +ERROR: $TESTDATA_DIR$/signatureClash.kt: (13, 1) Platform declaration clash: The following declarations have the same JVM signature (getB()I): + fun (): kotlin.Int + fun getB(): kotlin.Int COMPILATION_ERROR \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index cb7bf924153..cd33cdddede 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -28,6 +28,8 @@ import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_CLASS_OR_OBJECT; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.STRING; import static org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.TextElementType; +import static org.jetbrains.jet.lang.resolve.java.diagnostics.ErrorsJvm.ACCIDENTAL_OVERRIDE; +import static org.jetbrains.jet.lang.resolve.java.diagnostics.ErrorsJvm.CONFLICTING_JVM_DECLARATIONS; import static org.jetbrains.jet.plugin.highlighter.HtmlTabledDescriptorRenderer.tableForTypes; import static org.jetbrains.jet.plugin.highlighter.IdeRenderers.*; @@ -37,7 +39,7 @@ import static org.jetbrains.jet.plugin.highlighter.IdeRenderers.*; */ public class IdeErrorMessages { public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); - public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(ContainerUtil.concat(true, DefaultErrorMessages.MAPS, MAP)); + public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(ContainerUtil.concat(false, DefaultErrorMessages.MAPS, MAP)); static { MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", @@ -103,6 +105,9 @@ public class IdeErrorMessages { MAP.put(DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE, "Property delegate must have a ''{0}'' method. None of the following functions is suitable.
    {1}
", STRING, HTML_NONE_APPLICABLE_CALLS); + MAP.put(CONFLICTING_JVM_DECLARATIONS, "Platform declaration clash: {0}", HTML_CONFLICTING_JVM_DECLARATIONS_DATA); + MAP.put(ACCIDENTAL_OVERRIDE, "Accidental override: {0}", HTML_CONFLICTING_JVM_DECLARATIONS_DATA); + MAP.setImmutable(); } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeRenderers.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeRenderers.java index 164b03111b5..1642c80579b 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeRenderers.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeRenderers.java @@ -18,8 +18,11 @@ package org.jetbrains.jet.plugin.highlighter; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.resolve.calls.inference.InferenceErrorData; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; +import org.jetbrains.jet.lang.resolve.java.diagnostics.ConflictingJvmDeclarationsData; +import org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.Renderer; @@ -132,4 +135,20 @@ public class IdeRenderers { return DescriptorRenderer.HTML.renderType(returnType); } }; + + public static final Renderer HTML_CONFLICTING_JVM_DECLARATIONS_DATA = new Renderer() { + @NotNull + @Override + public String render(@NotNull ConflictingJvmDeclarationsData data) { + StringBuilder sb = new StringBuilder("
    "); + for (JvmDeclarationOrigin origin : data.getSignatureOrigins()) { + DeclarationDescriptor descriptor = origin.getDescriptor(); + if (descriptor != null) { + sb.append("
  • ").append(DescriptorRenderer.HTML_COMPACT_WITH_MODIFIERS.render(descriptor)).append("
  • \n"); + } + } + sb.append("
"); + return ("The following declarations have the same JVM signature (" + data.getSignature().getName() + data.getSignature().getDesc() + "):
\n" + sb).trim(); + } + }; }