diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index 5aaf9bb1304..198bb19cdc4 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -214,6 +214,7 @@ interface DescriptorRendererOptions { var includeAdditionalModifiers: Boolean var parameterNamesInFunctionalTypes: Boolean var renderFunctionContracts: Boolean + var presentableUnresolvedTypes: 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 768012e71a8..44f97db3a33 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -229,7 +229,11 @@ internal class DescriptorRendererImpl( this.renderAnnotations(type) if (type.isError) { - append(type.constructor.toString()) // Debug name of an error type is more informative + if (type is UnresolvedType && presentableUnresolvedTypes) { + append(type.presentableName) + } else { + append(type.constructor.toString()) // Debug name of an error type is more informative + } append(renderTypeArguments(type.arguments)) } else { diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt index 5687130839f..7541923c5dc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt @@ -115,4 +115,6 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions { override var parameterNamesInFunctionalTypes: Boolean by property(true) override var renderFunctionContracts: Boolean by property(false) + + override var presentableUnresolvedTypes: Boolean by property(false) } diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt index 4dcaede9ff2..b49a15105ae 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt @@ -44,6 +44,8 @@ private fun KotlinType.approximateNonDynamicFlexibleTypes( preferNotNull: Boolean = false, preferStarForRaw: Boolean = false ): SimpleType { + if (this is ErrorType) return this + if (isFlexible()) { val flexible = asFlexibleType() val lowerClass = flexible.lowerBound.constructor.declarationDescriptor as? ClassDescriptor? diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index b4a931a5c70..381da9fb129 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -162,6 +162,7 @@ private val OVERRIDE_RENDERER = DescriptorRenderer.withOptions { annotationFilter = { it.type.constructor.declarationDescriptor?.annotations?.hasAnnotation(ExperimentalUsageChecker.EXPERIMENTAL_FQ_NAME) ?: false } + presentableUnresolvedTypes = true } private fun PropertyDescriptor.wrap(): PropertyDescriptor { diff --git a/idea/testData/codeInsight/overrideImplement/unresolvedType.kt b/idea/testData/codeInsight/overrideImplement/unresolvedType.kt new file mode 100644 index 00000000000..d91a7808526 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/unresolvedType.kt @@ -0,0 +1,8 @@ +// DISABLE-ERRORS +interface A { + fun install(pipeline: TPipeline, configure: TBuilder.() -> Unit): TFeature +} + +class X : A { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/unresolvedType.kt.after b/idea/testData/codeInsight/overrideImplement/unresolvedType.kt.after new file mode 100644 index 00000000000..4a9dc974578 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/unresolvedType.kt.after @@ -0,0 +1,10 @@ +// DISABLE-ERRORS +interface A { + fun install(pipeline: TPipeline, configure: TBuilder.() -> Unit): TFeature +} + +class X : A { + override fun install(pipeline: String, configure: UnresolvedType.() -> Unit) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt index 50d82755721..723543be368 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt @@ -289,4 +289,8 @@ class OverrideImplementTest : AbstractOverrideImplementTest() { configureLanguageAndApiVersion(project, module, "1.3", "1.3") doOverrideFileTest("targetFun") } + + fun testUnresolvedType() { + doOverrideFileTest() + } }