diff --git a/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt b/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt index 995c79fafc2..5fdf12b15a9 100644 --- a/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt +++ b/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt @@ -22,6 +22,8 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType +private typealias Stack = MutableList>> + class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { override fun addAnnotation(annotationText: String, element: PsiElement?, deleteDuplicate: Boolean) { super.addAnnotation(annotationText, element, false) @@ -39,9 +41,15 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { private fun FirElement.render(): String = buildString { this@render.accept(FirRenderer(firFile), this) } - private fun List>>.addName(name: String) = this.last().second.add(name) - private fun List>>.addName(name: Name) = this.addName(name.asString()) - private fun List>>.getPathByName(name: String): String { + private fun Stack.push( + levelName: String, + defaultValues: MutableList = mutableListOf() + ) = this.add(levelName to defaultValues) + + private fun Stack.pop() = this.removeAt(this.size - 1) + private fun Stack.addName(name: String) = this.last().second.add(name) + private fun Stack.addName(name: Name) = this.addName(name.asString()) + private fun Stack.getPathByName(name: String): String { for ((reversedIndex, names) in this.asReversed().map { it.second }.withIndex()) { if (names.contains(name)) { return this.filterIndexed { index, _ -> index < this.size - reversedIndex && index > 0 } @@ -108,14 +116,14 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { //add to init values from last block //because when we are out of primary constructor information about properties will be removed //is used in ClassInitializer block and in SuperTypeCallEntry - stack += "" to stack.last().second + stack.push("", stack.last().second) element.acceptChildren(this) - stack.removeAt(stack.size - 1) + stack.pop() } is KtClassOrObject -> { - stack += (element.name ?: "") to mutableListOf() + stack.push((element.name ?: "")) element.acceptChildren(this) - stack.removeAt(stack.size - 1) + stack.pop() } else -> element.acceptChildren(this) } @@ -134,13 +142,13 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { } override fun visitNamedFunction(function: KtNamedFunction) { - stack += (function.name ?: "") to mutableListOf() + stack.push((function.name ?: "")) if (function.equalsToken != null) { function.bodyExpression!!.firstOfTypeWithRender(function.equalsToken) { this.typeRef } ?: function.firstOfTypeWithRender(function.equalsToken) { this.returnTypeRef } } super.visitNamedFunction(function) - stack.removeAt(stack.size - 1) + stack.pop() } private fun renderVariableType(variable: KtVariableDeclaration) { @@ -232,12 +240,12 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) { val firLabel = lambdaExpression.firstOfType() - stack += "" to mutableListOf() + stack.push("") //firLabel?.let { addAnnotation("${it.name}@$innerLambdaCount", lambdaExpression) } //innerLambdaCount++ super.visitLambdaExpression(lambdaExpression) //innerLambdaCount-- - stack.removeAt(stack.size - 1) + stack.pop() } override fun visitArrayAccessExpression(expression: KtArrayAccessExpression) { @@ -245,6 +253,16 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { expression.acceptChildren(this) } + override fun visitPropertyAccessor(accessor: KtPropertyAccessor) { + if (accessor.isSetter) { + stack.push("", mutableListOf()) + super.visitPropertyAccessor(accessor) + stack.pop() + } else { + super.visitPropertyAccessor(accessor) + } + } + override fun visitWhenEntry(jetWhenEntry: KtWhenEntry) { jetWhenEntry.firstOfTypeWithRender(jetWhenEntry.expression) { this.result.typeRef } super.visitWhenEntry(jetWhenEntry)