From 3bd39df58733d4d2747681777018241d167dbd49 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 14 Sep 2016 16:15:04 +0300 Subject: [PATCH] No parameter names in types for error messages --- .../jetbrains/kotlin/diagnostics/rendering/Renderers.kt | 3 ++- .../org/jetbrains/kotlin/renderer/DescriptorRenderer.kt | 1 + .../jetbrains/kotlin/renderer/DescriptorRendererImpl.kt | 8 ++++---- .../kotlin/renderer/DescriptorRendererOptionsImpl.kt | 3 +++ .../jetbrains/kotlin/idea/highlighter/IdeRenderers.kt | 2 +- .../testData/diagnosticMessage/functionPlaceholder2.html | 2 +- .../diagnosticMessage/typeMismatchWithFunctionalType.kt | 9 +++++++++ .../typeMismatchWithFunctionalType1.txt | 2 ++ .../createFromUsage/createFunction/call/kt10983.kt | 4 ++-- .../dontChangeFunctionReturnTypeToErrorType.kt | 2 +- .../idea/highlighter/DiagnosticMessageTestGenerated.java | 6 ++++++ 11 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 idea/testData/diagnosticMessage/typeMismatchWithFunctionalType.kt create mode 100644 idea/testData/diagnosticMessage/typeMismatchWithFunctionalType1.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt index 54500c0f7f7..2ef84d92eaa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -51,6 +51,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import java.io.PrintWriter import java.io.StringWriter +import java.lang.AssertionError object Renderers { @@ -118,7 +119,7 @@ object Renderers { @JvmField val RENDER_CLASS_OR_OBJECT_NAME = Renderer { it.renderKindWithName() } - @JvmField val RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.FQ_NAMES_IN_TYPES) + @JvmField val RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.FQ_NAMES_IN_TYPES.withOptions { parameterNamesInFunctionalTypes = false }) @JvmField val RENDER_POSITION_VARIANCE = Renderer { variance: Variance -> diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index 00bd73bfb42..417f65fb254 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -193,6 +193,7 @@ interface DescriptorRendererOptions { var renderConstructorKeyword: Boolean var renderUnabbreviatedType: Boolean var includeAdditionalModifiers: Boolean + var parameterNamesInFunctionalTypes: Boolean } object ExcludedTypeAnnotations { diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index 88acb12e309..f45fc292911 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -310,16 +310,16 @@ internal class DescriptorRendererImpl( append("(") val parameterTypes = getValueParameterTypesFromFunctionType(type) - val parameterNames = type.getParameterNamesFromFunctionType() ?: parameterTypes.map { SpecialNames.NO_NAME_PROVIDED } - assert(parameterNames.size == parameterTypes.size) { "Number of names does not match number of types for $type"} + val parameterNames = if (parameterNamesInFunctionalTypes) type.getParameterNamesFromFunctionType() else null + assert(parameterNames == null || parameterNames.size == parameterTypes.size) { "Number of names does not match number of types for $type"} for (index in parameterTypes.indices) { val typeProjection = parameterTypes[index] - val name = parameterNames[index] + val name = parameterNames?.get(index) if (index > 0) append(", ") - if (!name.isSpecial) { + if (name != null && !name.isSpecial) { append(renderName(name)) append(": ") } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt index 993506110e8..3bc0b4958c8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.renderer import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.types.KotlinType +import java.lang.IllegalStateException import java.lang.reflect.Modifier import kotlin.jvm.internal.PropertyReference1Impl import kotlin.properties.Delegates @@ -103,4 +104,6 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions { override var renderUnabbreviatedType: Boolean by property(true) override var includeAdditionalModifiers: Boolean by property(true) + + override var parameterNamesInFunctionalTypes: Boolean by property(true) } \ No newline at end of file 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 7c05170dcdd..c3f95b91afb 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 @@ -37,7 +37,7 @@ object IdeRenderers { descriptors.joinToString("") { "
  • ${HTML.render(it, context)}
  • " } } - @JvmField val HTML_RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.HTML) + @JvmField val HTML_RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.HTML.withOptions { parameterNamesInFunctionalTypes = false }) @JvmField val HTML_NONE_APPLICABLE_CALLS = Renderer { calls: Collection> -> diff --git a/idea/testData/diagnosticMessage/functionPlaceholder2.html b/idea/testData/diagnosticMessage/functionPlaceholder2.html index 18d50d13845..f93271a6173 100644 --- a/idea/testData/diagnosticMessage/functionPlaceholder2.html +++ b/idea/testData/diagnosticMessage/functionPlaceholder2.html @@ -18,7 +18,7 @@ Type inference failed: ( - (x: ???) → ??? + (???) → ??? ) diff --git a/idea/testData/diagnosticMessage/typeMismatchWithFunctionalType.kt b/idea/testData/diagnosticMessage/typeMismatchWithFunctionalType.kt new file mode 100644 index 00000000000..596458ffca2 --- /dev/null +++ b/idea/testData/diagnosticMessage/typeMismatchWithFunctionalType.kt @@ -0,0 +1,9 @@ +// !DIAGNOSTICS_NUMBER: 1 +// !DIAGNOSTICS: TYPE_MISMATCH +// !MESSAGE_TYPE: TEXT + +fun foo(handler: (s: String) -> Unit) { + bar(handler) +} + +fun bar(a: (n: Int) -> Unit) {} diff --git a/idea/testData/diagnosticMessage/typeMismatchWithFunctionalType1.txt b/idea/testData/diagnosticMessage/typeMismatchWithFunctionalType1.txt new file mode 100644 index 00000000000..af33911f499 --- /dev/null +++ b/idea/testData/diagnosticMessage/typeMismatchWithFunctionalType1.txt @@ -0,0 +1,2 @@ + +Type mismatch: inferred type is (String) -> Unit but (Int) -> Unit was expected \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/kt10983.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/kt10983.kt index 7f6266325bf..fe1b697b5e2 100644 --- a/idea/testData/quickfix/createFromUsage/createFunction/call/kt10983.kt +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/kt10983.kt @@ -9,8 +9,8 @@ // ACTION: Rename reference // ERROR: A 'return' expression required in a function with a block body ('{...}') // ERROR: The expression cannot be a selector (occur after a dot) -// ERROR: Type inference failed: inline fun Iterable.firstOrNull(predicate: (T) -> Boolean): T?
    cannot be applied to
    receiver: Collection> arguments: ((group: List) -> () -> Boolean)
    -// ERROR: Type mismatch: inferred type is (group: List) -> () -> Boolean but (List) -> Boolean was expected +// ERROR: Type inference failed: inline fun Iterable.firstOrNull(predicate: (T) -> Boolean): T?
    cannot be applied to
    receiver: Collection> arguments: ((List) -> () -> Boolean)
    +// ERROR: Type mismatch: inferred type is (List) -> () -> Boolean but (List) -> Boolean was expected // ERROR: Unresolved reference: maximumSizeOfGroup fun doSomethingStrangeWithCollection(collection: Collection): Collection? { diff --git a/idea/testData/quickfix/typeMismatch/typeMismatchOnReturnedExpression/dontChangeFunctionReturnTypeToErrorType.kt b/idea/testData/quickfix/typeMismatch/typeMismatchOnReturnedExpression/dontChangeFunctionReturnTypeToErrorType.kt index 4b6515e52f8..f445ce1f3ca 100644 --- a/idea/testData/quickfix/typeMismatch/typeMismatchOnReturnedExpression/dontChangeFunctionReturnTypeToErrorType.kt +++ b/idea/testData/quickfix/typeMismatch/typeMismatchOnReturnedExpression/dontChangeFunctionReturnTypeToErrorType.kt @@ -6,7 +6,7 @@ // ACTION: Create type alias 'NoSuchType' // ACTION: Remove explicit lambda parameter types (may break code) // ACTION: Create type parameter 'NoSuchType' in function 'foo' -// ERROR: Type mismatch: inferred type is (x: [ERROR : NoSuchType]) -> Int but Int was expected +// ERROR: Type mismatch: inferred type is ([ERROR : NoSuchType]) -> Int but Int was expected // ERROR: Unresolved reference: NoSuchType fun foo(): Int { diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java index ec0c493f262..5bf59000559 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java @@ -251,6 +251,12 @@ public class DiagnosticMessageTestGenerated extends AbstractDiagnosticMessageTes doTest(fileName); } + @TestMetadata("typeMismatchWithFunctionalType.kt") + public void testTypeMismatchWithFunctionalType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/typeMismatchWithFunctionalType.kt"); + doTest(fileName); + } + @TestMetadata("typeMismatchWithNothing.kt") public void testTypeMismatchWithNothing() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/typeMismatchWithNothing.kt");