Normalize names of temporary variables in IrTextTests
This commit is contained in:
committed by
Mikhail Glukhikh
parent
740f851a10
commit
733c7579aa
@@ -27,23 +27,24 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.utils.Printer
|
||||
|
||||
fun IrElement.dump(): String =
|
||||
fun IrElement.dump(normalizeNames: Boolean = false): String =
|
||||
StringBuilder().also { sb ->
|
||||
accept(DumpIrTreeVisitor(sb), "")
|
||||
accept(DumpIrTreeVisitor(sb, normalizeNames), "")
|
||||
}.toString()
|
||||
|
||||
fun IrFile.dumpTreesFromLineNumber(lineNumber: Int): String {
|
||||
fun IrFile.dumpTreesFromLineNumber(lineNumber: Int, normalizeNames: Boolean = false): String {
|
||||
val sb = StringBuilder()
|
||||
accept(DumpTreeFromSourceLineVisitor(fileEntry, lineNumber, sb), null)
|
||||
accept(DumpTreeFromSourceLineVisitor(fileEntry, lineNumber, sb, normalizeNames), null)
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
class DumpIrTreeVisitor(
|
||||
out: Appendable
|
||||
out: Appendable,
|
||||
normalizeNames: Boolean = false
|
||||
) : IrElementVisitor<Unit, String> {
|
||||
|
||||
private val printer = Printer(out, " ")
|
||||
private val elementRenderer = RenderIrElementVisitor()
|
||||
private val elementRenderer = RenderIrElementVisitor(normalizeNames)
|
||||
private fun IrType.render() = elementRenderer.renderType(this)
|
||||
|
||||
override fun visitElement(element: IrElement, data: String) {
|
||||
@@ -355,9 +356,10 @@ class DumpIrTreeVisitor(
|
||||
class DumpTreeFromSourceLineVisitor(
|
||||
val fileEntry: SourceManager.FileEntry,
|
||||
private val lineNumber: Int,
|
||||
out: Appendable
|
||||
out: Appendable,
|
||||
normalizeNames: Boolean = false
|
||||
) : IrElementVisitorVoid {
|
||||
private val dumper = DumpIrTreeVisitor(out)
|
||||
private val dumper = DumpIrTreeVisitor(out, normalizeNames)
|
||||
|
||||
override fun visitElement(element: IrElement) {
|
||||
if (fileEntry.getLineNumber(element.startOffset) == lineNumber) {
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||
@@ -35,7 +36,17 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
fun IrElement.render() =
|
||||
accept(RenderIrElementVisitor(), null)
|
||||
|
||||
class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
class RenderIrElementVisitor(private val normalizeNames: Boolean = false) : IrElementVisitor<String, Nothing?> {
|
||||
private val nameMap: MutableMap<IrVariableSymbol, String> = mutableMapOf()
|
||||
private var temporaryIndex: Int = 0
|
||||
|
||||
private val IrVariable.normalizedName: String
|
||||
get() {
|
||||
if (!normalizeNames || (origin != IrDeclarationOrigin.IR_TEMPORARY_VARIABLE && origin != IrDeclarationOrigin.FOR_LOOP_ITERATOR))
|
||||
return name.asString()
|
||||
|
||||
return nameMap.getOrPut(symbol) { "tmp_${temporaryIndex++}" }
|
||||
}
|
||||
|
||||
fun renderType(type: IrType) = type.render()
|
||||
|
||||
@@ -179,7 +190,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
buildTrimEnd {
|
||||
if (declaration.isVar) append("var ") else append("val ")
|
||||
|
||||
append(declaration.name.asString())
|
||||
append(declaration.normalizedName)
|
||||
append(": ")
|
||||
append(declaration.type.render())
|
||||
append(' ')
|
||||
@@ -455,7 +466,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
|
||||
override fun visitVariable(declaration: IrVariable, data: Nothing?): String =
|
||||
declaration.runTrimEnd {
|
||||
"VAR ${renderOriginIfNonTrivial()}name:$name type:${type.render()} ${renderVariableFlags()}"
|
||||
"VAR ${renderOriginIfNonTrivial()}name:$normalizedName type:${type.render()} ${renderVariableFlags()}"
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user