diff --git a/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt b/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt index 9058f1c2616..f3169f2e820 100644 --- a/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt +++ b/compiler/testData/diagnostics/tests/FreeFunctionCalledAsExtension.txt @@ -1,7 +1,7 @@ package public fun foo(/*0*/ a: (kotlin.String) -> kotlin.Unit): kotlin.Unit -public fun foo(/*0*/ a: A): kotlin.Unit +public fun foo(/*0*/ a: @kotlin.ExtensionFunctionType A): kotlin.Unit public interface A : (kotlin.String) -> kotlin.Unit { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/callableReference/function/annotationClassConstructor.txt b/compiler/testData/diagnostics/tests/callableReference/function/annotationClassConstructor.txt index 4dfffcc7cae..a7768c7e259 100644 --- a/compiler/testData/diagnostics/tests/callableReference/function/annotationClassConstructor.txt +++ b/compiler/testData/diagnostics/tests/callableReference/function/annotationClassConstructor.txt @@ -1,7 +1,7 @@ package public val annClassRef: kotlin.reflect.KClass -public val annCtorRef: kotlin.reflect.KFunction1 +public val annCtorRef: kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "prop") kotlin.String, Ann> public val annPropRef: kotlin.reflect.KProperty1 public final annotation class Ann : kotlin.Annotation { diff --git a/compiler/testData/diagnostics/tests/callableReference/sam.txt b/compiler/testData/diagnostics/tests/callableReference/sam.txt index 09bf9d12812..cc45939c336 100644 --- a/compiler/testData/diagnostics/tests/callableReference/sam.txt +++ b/compiler/testData/diagnostics/tests/callableReference/sam.txt @@ -5,14 +5,14 @@ public fun f2(): kotlin.reflect.KFunction1 public fun f3(): kotlin.reflect.KClass public fun f4(): kotlin.reflect.KFunction1 public fun f5(): kotlin.reflect.KClass> -public fun f6(): kotlin.reflect.KFunction2, kotlin.Nothing!, kotlin.Unit> +public fun f6(): kotlin.reflect.KFunction2, @kotlin.ParameterName(name = "t") kotlin.Nothing!, kotlin.Unit> public fun f7(): kotlin.reflect.KClass> -public fun f8(): kotlin.reflect.KFunction2, kotlin.String!, kotlin.Unit> +public fun f8(): kotlin.reflect.KFunction2, @kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit> public fun g1(): kotlin.reflect.KClass public fun g2(): kotlin.reflect.KFunction0 public fun g3(): kotlin.reflect.KClass public fun g4(): kotlin.reflect.KFunction0 public fun g5(): kotlin.reflect.KClass> -public fun g6(): kotlin.reflect.KFunction1 +public fun g6(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit> public fun g7(): kotlin.reflect.KClass> -public fun g8(): kotlin.reflect.KFunction1 +public fun g8(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit> diff --git a/compiler/testData/diagnostics/tests/deprecated/functionUsage.txt b/compiler/testData/diagnostics/tests/deprecated/functionUsage.txt index eb7421ac0f4..1c23d355d75 100644 --- a/compiler/testData/diagnostics/tests/deprecated/functionUsage.txt +++ b/compiler/testData/diagnostics/tests/deprecated/functionUsage.txt @@ -4,7 +4,7 @@ package public fun block(): kotlin.Unit public fun expression(): UsefulClass public fun invoker(): kotlin.Unit -public fun reflection(): kotlin.reflect.KFunction1 +public fun reflection(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "param") kotlin.Int, UsefulClass> public fun reflection2(): kotlin.reflect.KFunction1 @kotlin.Deprecated(message = "does nothing good") public fun kotlin.Any.doNothing(): kotlin.String diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index 00a2d4a4daf..4c027bf8f8b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -223,9 +223,7 @@ object ExcludedTypeAnnotations { val internalAnnotationsForResolve = setOf( FqName("kotlin.internal.NoInfer"), - FqName("kotlin.internal.Exact"), - KotlinBuiltIns.FQ_NAMES.extensionFunctionType, - KotlinBuiltIns.FQ_NAMES.parameterName + FqName("kotlin.internal.Exact") ) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index a3cfb7e88e9..0bc605b228a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -46,6 +46,13 @@ internal class DescriptorRendererImpl( assert(options.isLocked) } + private val functionTypeAnnotationsRenderer: DescriptorRendererImpl by lazy { + this.withOptions { excludedTypeAnnotationClasses += listOf(KotlinBuiltIns.FQ_NAMES.extensionFunctionType) } as DescriptorRendererImpl + } + private val functionTypeParameterTypesRenderer: DescriptorRenderer by lazy { + this.withOptions { excludedTypeAnnotationClasses += listOf(KotlinBuiltIns.FQ_NAMES.parameterName) } + } + /* FORMATTING */ private fun renderKeyword(keyword: String): String { when (textFormat) { @@ -294,7 +301,10 @@ internal class DescriptorRendererImpl( private fun StringBuilder.renderFunctionType(type: KotlinType) { val lengthBefore = length - renderAnnotations(type) + // we need special renderer to skip @ExtensionFunctionType + with(functionTypeAnnotationsRenderer) { + renderAnnotations(type) + } val hasAnnotations = length != lengthBefore val isNullable = type.isMarkedNullable @@ -335,7 +345,8 @@ internal class DescriptorRendererImpl( append(renderName(name)) append(": ") } - append(renderTypeProjection(typeProjection)) + + append(functionTypeParameterTypesRenderer.renderTypeProjection(typeProjection)) } append(") ").append(arrow()).append(" ") diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt index c7fdc9c26b8..0d48d132365 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder import com.intellij.openapi.util.TextRange -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.decompiler.navigation.ByDescriptorIndexer import org.jetbrains.kotlin.name.FqName @@ -39,9 +38,7 @@ fun DescriptorRendererOptions.defaultDecompilerRendererOptions() { classWithPrimaryConstructor = true secondaryConstructorsAsPrimary = false modifiers = DescriptorRendererModifier.ALL - excludedTypeAnnotationClasses = (ExcludedTypeAnnotations.annotationsForNullabilityAndMutability + - KotlinBuiltIns.FQ_NAMES.extensionFunctionType + - KotlinBuiltIns.FQ_NAMES.parameterName).toSet() + excludedTypeAnnotationClasses = ExcludedTypeAnnotations.annotationsForNullabilityAndMutability alwaysRenderModifiers = true parameterNamesInFunctionalTypes = false // to support parameters names in decompiled text we need to load annotation arguments }