[FIR] Improve readability of rendered types in diagnostics

#KT-61824 Fixed
#KT-61688 Fixed
This commit is contained in:
Kirill Rakhman
2023-09-12 14:27:29 +02:00
committed by Space Team
parent 99b852adf8
commit 4e1dfcd2a8
25 changed files with 65 additions and 37 deletions
@@ -3,7 +3,7 @@ class C
class B
class A {
val B.foo: C.() -> Unit get() = <!NULL_FOR_NONNULL_TYPE("@ExtensionFunctionType kotlin/Function1<C, kotlin/Unit>")!>null<!>
val B.foo: C.() -> Unit get() = <!NULL_FOR_NONNULL_TYPE("kotlin/Function1<C, kotlin/Unit>")!>null<!>
}
fun <T, R> with(arg: T, f: T.() -> R): R = arg.f()
@@ -5,12 +5,18 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.types.ConeAttributes
import org.jetbrains.kotlin.fir.types.ConeAttribute
abstract class ConeAttributeRenderer {
abstract fun render(attributes: ConeAttributes): String
abstract fun render(attributes: Iterable<ConeAttribute<*>>): String
object ToString : ConeAttributeRenderer() {
override fun render(attributes: ConeAttributes): String = attributes.joinToString(separator = " ", postfix = " ") { it.toString() }
override fun render(attributes: Iterable<ConeAttribute<*>>): String =
attributes.joinToString(separator = " ", postfix = " ") { it.toString() }
}
object ForReadability : ConeAttributeRenderer() {
override fun render(attributes: Iterable<ConeAttribute<*>>): String =
attributes.joinToString(separator = " ", postfix = " ") { it.renderForReadability() }
}
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
open class ConeTypeRenderer(
private val attributeRenderer: ConeAttributeRenderer = ConeAttributeRenderer.ToString
@@ -180,16 +181,16 @@ open class ConeTypeRenderer(
builder.append(">")
}
private fun ConeKotlinType.renderAttributes() {
protected open fun ConeKotlinType.renderAttributes() {
if (!attributes.any()) return
builder.append(attributeRenderer.render(attributes))
}
private fun ConeKotlinType.renderNonCompilerAttributes() {
protected fun ConeKotlinType.renderNonCompilerAttributes() {
val compilerAttributes = CompilerConeAttributes.classIdByCompilerAttributeKey
if (attributes.any { it.key !in compilerAttributes }) {
builder.append(attributeRenderer.render(attributes))
}
attributes
.filter { it.key !in compilerAttributes }
.ifNotEmpty { builder.append(attributeRenderer.render(this)) }
}
private fun ConeTypeProjection.render() {
@@ -8,13 +8,13 @@ package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.fir.types.ConeFlexibleType
import org.jetbrains.kotlin.fir.types.ConeIntegerLiteralType
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.renderer.replacePrefixesInTypeRepresentations
import org.jetbrains.kotlin.renderer.typeStringsDifferOnlyInNullability
class ConeTypeRendererForReadability(
private val idRendererCreator: () -> ConeIdRenderer,
) : ConeTypeRenderer() {
) : ConeTypeRenderer(ConeAttributeRenderer.ForReadability) {
constructor(builder: StringBuilder, idRendererCreator: () -> ConeIdRenderer) : this(idRendererCreator) {
this.builder = builder
this.idRenderer = idRendererCreator()
@@ -76,4 +76,8 @@ class ConeTypeRendererForReadability(
override fun render(type: ConeIntegerLiteralType) {
render(type.getApproximatedType())
}
override fun ConeKotlinType.renderAttributes() {
renderNonCompilerAttributes()
}
}
@@ -30,6 +30,7 @@ abstract class ConeAttribute<out T : ConeAttribute<T>> : AnnotationMarker {
abstract fun isSubtypeOf(other: @UnsafeVariance T?): Boolean
abstract override fun toString(): String
open fun renderForReadability(): String = toString()
abstract val key: KClass<out T>
}
@@ -66,6 +66,18 @@ class FirRenderer(
fun withDeclarationAttributes(): FirRenderer =
FirRenderer(declarationRenderer = FirDeclarationRendererWithAttributes())
fun forReadability(): FirRenderer = FirRenderer(
typeRenderer = ConeTypeRenderer(),
idRenderer = ConeIdShortRenderer(),
classMemberRenderer = FirNoClassMemberRenderer(),
bodyRenderer = null,
propertyAccessorRenderer = null,
callArgumentsRenderer = FirCallNoArgumentsRenderer(),
modifierRenderer = FirPartialModifierRenderer(),
valueParameterRenderer = FirValueParameterRendererNoDefaultValue(),
declarationRenderer = FirDeclarationRenderer("local ")
)
}
init {
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCallCopy
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCopy
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import kotlin.reflect.KClass
@@ -55,6 +56,9 @@ class CustomAnnotationTypeAttribute(
override fun toString(): String = annotations.joinToString(separator = " ") { it.render() }
override fun renderForReadability(): String =
annotations.joinToString(separator = " ") { FirRenderer.forReadability().renderElementAsString(it, trim = true) }
override val key: KClass<out CustomAnnotationTypeAttribute>
get() = CustomAnnotationTypeAttribute::class