[FIR] Make rendering of properties for diagnostics more user-friendly

#KT-60137 Fixed
This commit is contained in:
Kirill Rakhman
2023-07-26 17:27:19 +02:00
committed by Space Team
parent b5ea059861
commit ed6948959c
16 changed files with 79 additions and 16 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
@@ -23,6 +24,17 @@ class FirBodyRenderer {
renderBody(function.body)
}
fun render(variable: FirVariable) {
variable.initializer?.let {
printer.print(" = ")
it.accept(visitor)
}
variable.delegate?.let {
printer.print("by ")
it.accept(visitor)
}
}
fun renderBody(block: FirBlock?, additionalStatements: List<FirStatement> = emptyList()) {
if (block == null) return
when (block) {
@@ -10,7 +10,9 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirErrorConstructor
import org.jetbrains.kotlin.fir.isCatchParameter
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
open class FirDeclarationRenderer {
open class FirDeclarationRenderer(
private val localVariablePrefix: String = "l",
) {
internal lateinit var components: FirRendererComponents
protected val printer get() = components.printer
@@ -40,7 +42,7 @@ open class FirDeclarationRenderer {
if (declaration.isCatchParameter == true) {
""
} else {
val prefix = if (declaration.isLocal) "l" else ""
val prefix = if (declaration.isLocal) localVariablePrefix else ""
prefix + if (declaration.isVal) "val" else "var"
}
}
@@ -61,4 +63,4 @@ open class FirDeclarationRenderer {
protected open fun FirDeclaration.renderDeclarationAttributes() {
}
}
}
@@ -305,14 +305,7 @@ class FirRenderer(
override fun visitVariable(variable: FirVariable) {
visitCallableDeclaration(variable)
variable.initializer?.let {
print(" = ")
it.accept(this)
}
variable.delegate?.let {
print("by ")
it.accept(this)
}
bodyRenderer?.render(variable)
}
override fun visitField(field: FirField) {