From 3f5f892e1b3baba484e4d05795a2e0d46d857a68 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 10 Feb 2016 01:19:12 +0300 Subject: [PATCH] Add html escaping for declaration names in calls (KT-10763) #KT-10763 Fixed --- .../kotlin/idea/highlighter/IdeRenderers.kt | 6 +++--- .../kotlin/idea/highlighter/renderersUtil.kt | 3 ++- .../diagnosticMessage/noneApplicableConstructor.kt | 12 ++++++++++++ .../noneApplicableConstructor1.html | 8 ++++++++ .../highlighter/DiagnosticMessageTestGenerated.java | 6 ++++++ 5 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 idea/testData/diagnosticMessage/noneApplicableConstructor.kt create mode 100644 idea/testData/diagnosticMessage/noneApplicableConstructor1.html 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 902aad800f0..6ecd5dde134 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 @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.jvm.diagnostics.ConflictingJvmDeclarationsData import org.jetbrains.kotlin.types.KotlinType -import kotlin.comparisons.* +import kotlin.comparisons.compareBy object IdeRenderers { @@ -35,7 +35,7 @@ object IdeRenderers { calls .map { it.resultingDescriptor } .sortedWith(MemberComparator.INSTANCE) - .joinToString("") { "
  • " + DescriptorRenderer.HTML.render(it) + "
  • " } + .joinToString("") { "
  • ${DescriptorRenderer.HTML.render(it)}
  • " } } @JvmField val HTML_RENDER_TYPE: Renderer = Renderer { @@ -47,7 +47,7 @@ object IdeRenderers { val comparator = compareBy(MemberComparator.INSTANCE) { c: ResolvedCall<*> -> c.resultingDescriptor } calls .sortedWith(comparator) - .joinToString("") { "
  • " + renderResolvedCall(it) + "
  • " } + .joinToString("") { "
  • ${renderResolvedCall(it)}
  • " } } @JvmField val HTML_TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS_RENDERER: Renderer = Renderer { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt index 9cf29694453..6649cb0c939 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.highlighter.renderersUtil +import com.google.common.html.HtmlEscapers import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor @@ -98,7 +99,7 @@ fun renderResolvedCall(resolvedCall: ResolvedCall): if (receiverParameter != null) { append(htmlRenderer.renderType(receiverParameter.type)).append(".") } - append(resultingDescriptor.name).append("(") + append(HtmlEscapers.htmlEscaper().escape(resultingDescriptor.name.asString())).append("(") append(resultingDescriptor.valueParameters.map { parameter -> renderParameter(parameter) }.joinToString()) append(if (resolvedCall.hasUnmappedArguments()) renderError(")") else ")") diff --git a/idea/testData/diagnosticMessage/noneApplicableConstructor.kt b/idea/testData/diagnosticMessage/noneApplicableConstructor.kt new file mode 100644 index 00000000000..f1ae2ce8ad2 --- /dev/null +++ b/idea/testData/diagnosticMessage/noneApplicableConstructor.kt @@ -0,0 +1,12 @@ +// !DIAGNOSTICS_NUMBER: 1 +// !DIAGNOSTICS: NONE_APPLICABLE +// !MESSAGE_TYPE: HTML + +class A(a: Int) { +} + +fun A(a: String) {} + +fun main(args: Array) { + A() +} \ No newline at end of file diff --git a/idea/testData/diagnosticMessage/noneApplicableConstructor1.html b/idea/testData/diagnosticMessage/noneApplicableConstructor1.html new file mode 100644 index 00000000000..1557a88f4b8 --- /dev/null +++ b/idea/testData/diagnosticMessage/noneApplicableConstructor1.html @@ -0,0 +1,8 @@ + + +None of the following functions can be called with the arguments supplied. +
      +
    • <`init>(Int) defined in A
    • +
    • A(String) defined in root package
    • +
    + \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java index 5cb1447ba2e..2d646cb701f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java @@ -155,6 +155,12 @@ public class DiagnosticMessageTestGenerated extends AbstractDiagnosticMessageTes doTest(fileName); } + @TestMetadata("noneApplicableConstructor.kt") + public void testNoneApplicableConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/noneApplicableConstructor.kt"); + doTest(fileName); + } + @TestMetadata("noneApplicableGeneric.kt") public void testNoneApplicableGeneric() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/noneApplicableGeneric.kt");