From 05efb8c129f51090a2fe4f3738e7a1e0238770b8 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Fri, 12 Feb 2021 16:30:28 +0300 Subject: [PATCH] [VISUALIZER] Add possibility to render callable reference in fir part --- .../compiler/visualizer/FirVisualizer.kt | 65 ++++++++++++------- .../compiler/visualizer/Psi2FirMapper.kt | 14 ++++ 2 files changed, 55 insertions(+), 24 deletions(-) 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 278b1b9ded4..a52959e70f8 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 @@ -11,10 +11,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.fir.references.FirErrorNamedReference -import org.jetbrains.kotlin.fir.references.FirNamedReference -import org.jetbrains.kotlin.fir.references.FirReference -import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.resolve.directExpansionType import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag @@ -201,6 +198,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { if (expression is KtOperationReferenceExpression) return expression.firstOfTypeWithLocalReplace { this.name.asString() } + ?: expression.firstOfTypeWithLocalReplace { this.name.asString() } ?: expression.firstOfTypeWithRender() ?: expression.firstOfTypeWithRender() //fallback for errors super.visitReferenceExpression(expression) @@ -216,17 +214,23 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { } override fun visitBinaryExpression(expression: KtBinaryExpression) { - if (expression.operationReference.getReferencedName() == "?:") { - expression.left?.accept(this) - expression.right?.accept(this) - return + val operation = expression.operationReference + when { + operation.getReferencedName() == "?:" -> { + expression.left?.accept(this) + expression.right?.accept(this) + } + operation.getReferencedName() == "==" -> { + expression.left?.accept(this) + expression.firstOfTypeWithRender(operation) + expression.right?.accept(this) + } + else -> { + expression.allOfTypeWithLocalReplace(operation) { this.calleeReference.name.asString() } + ?: expression.firstOfTypeWithLocalReplace(operation) { this.lValue.toString() } + super.visitBinaryExpression(expression) + } } - - expression.operationReference.let { - expression.allOfTypeWithLocalReplace(it) { this.calleeReference.name.asString() } - ?: expression.firstOfTypeWithLocalReplace(it) { this.lValue.toString() } - } - super.visitBinaryExpression(expression) } override fun visitIfExpression(expression: KtIfExpression) { @@ -283,10 +287,13 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { private val symbolProvider = firFile.session.symbolProvider private fun FirTypeRef.renderWithNativeRenderer(): String { - return buildString { + var result = buildString { val nativeRenderer = org.jetbrains.kotlin.fir.FirRenderer(this) this@renderWithNativeRenderer.accept(nativeRenderer) - }.replace("R|", "").replace("|", "") + } + if (result.startsWith("R|")) result = result.substring(2) + if (result.endsWith("|")) result = result.substring(0, result.length - 1) + return result } private fun String.removeCurrentFilePackage(): String { @@ -392,6 +399,16 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { data.append(renderSymbol(symbol)) } + override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference, data: StringBuilder) { + val symbol = resolvedCallableReference.resolvedSymbol + data.append(renderSymbol(symbol)) + (symbol.fir as? FirFunction<*>)?.let { + visitValueParameters(it.valueParameters, data) + data.append(": ") + it.returnTypeRef.accept(this, data) + } + } + override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: StringBuilder) { val reference = annotationCall.calleeReference visitConstructor(reference, data) @@ -443,15 +460,12 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { data.append(renderSymbol(callee.resolvedSymbol)) visitArguments(functionCall.arguments, data) } else { - data.append("fun ") - val firFunction = callee.resolvedSymbol.fir as? FirTypeParametersOwner - firFunction?.let { renderListInTriangles(it.typeParameters, data, true) } - data.append(renderSymbol(callee.resolvedSymbol)) renderListInTriangles(functionCall.typeArguments, data) - visitValueParameters(callee.resolvedSymbol.firUnsafe>().valueParameters, data) + val fir = callee.resolvedSymbol.firUnsafe>() + visitValueParameters(fir.valueParameters, data) data.append(": ") - functionCall.typeRef.accept(this, data) + fir.returnTypeRef.accept(this, data) } } is FirErrorNamedReference -> data.append("[ERROR : ${callee.diagnostic.reason}]") @@ -478,7 +492,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { } override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: StringBuilder) { - data.append("variable assignment") + //data.append("variable assignment") } override fun visitStarProjection(starProjection: FirStarProjection, data: StringBuilder) { @@ -492,7 +506,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { } override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: StringBuilder) { - data.append((resolvedTypeRef.delegatedTypeRef ?: resolvedTypeRef).renderWithNativeRenderer().removeCurrentFilePackage()) + data.append(resolvedTypeRef.renderWithNativeRenderer().removeCurrentFilePackage()) val coneType = resolvedTypeRef.type if (coneType is ConeClassLikeType) { val original = coneType.directExpansionType(session) @@ -532,6 +546,9 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { when (symbol) { is FirNamedFunctionSymbol -> { + data.append("fun ") + renderListInTriangles(symbol.fir.typeParameters, data, true) + val callableName = symbol.callableId.callableName val receiverType = symbol.fir.receiverTypeRef if (receiverType == null) { diff --git a/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/Psi2FirMapper.kt b/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/Psi2FirMapper.kt index d6e5c25b304..612906033a2 100644 --- a/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/Psi2FirMapper.kt +++ b/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/Psi2FirMapper.kt @@ -7,8 +7,10 @@ package org.jetbrains.kotlin.compiler.visualizer import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid +import org.jetbrains.kotlin.psi.KtCallableReferenceExpression class Psi2FirMapper(val map: MutableMap>) : FirVisitorVoid() { override fun visitElement(element: FirElement) { @@ -20,4 +22,16 @@ class Psi2FirMapper(val map: MutableMap>) : } element.acceptChildren(this) } + + override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) { + visitElement(callableReferenceAccess.extensionReceiver) + visitElement(callableReferenceAccess.dispatchReceiver) + callableReferenceAccess.explicitReceiver?.let { visitElement(it) } + + val psi = (callableReferenceAccess.calleeReference.psi as? KtCallableReferenceExpression)?.children?.last() + ?: return callableReferenceAccess.calleeReference.accept(this) + if (map.putIfAbsent(psi, mutableListOf(callableReferenceAccess.calleeReference)) != null) { + map[psi]?.add(callableReferenceAccess.calleeReference) + } + } } \ No newline at end of file