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 41a2b2303a7..5d7b16fe110 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 @@ -293,6 +293,10 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { jetWhenEntry.firstOfTypeWithRender(jetWhenEntry.expression) { this.result.typeRef } super.visitWhenEntry(jetWhenEntry) } + + override fun visitClassLiteralExpression(expression: KtClassLiteralExpression) { + expression.firstOfTypeWithRender() + } } inner class FirRenderer : FirVisitor() { @@ -623,6 +627,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { if (fir is FirClass) { data.append(fir.classKind.name.toLowerCaseAsciiOnly().replace("_", " ")).append(" ") data.append(fir.symbol.classId.asString().removeCurrentFilePackage()) + renderListInTriangles(fir.typeParameters, data) if (fir.superTypeRefs.any { it.render() != "kotlin/Any" }) { data.append(": ") fir.superTypeRefs.joinTo(data, separator = ", ") { typeRef -> typeRef.render() } @@ -664,6 +669,10 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { } } + override fun visitGetClassCall(getClassCall: FirGetClassCall, data: StringBuilder) { + getClassCall.argument.accept(this, data) + } + private fun AbstractFirBasedSymbol<*>.isLocalDeclaration(): Boolean { return when (val fir = this.fir) { is FirConstructor -> { diff --git a/compiler/visualizer/render-psi/src/org/jetbrains/kotlin/compiler/visualizer/PsiVisualizer.kt b/compiler/visualizer/render-psi/src/org/jetbrains/kotlin/compiler/visualizer/PsiVisualizer.kt index e4d1a08d61a..9875bd98dec 100644 --- a/compiler/visualizer/render-psi/src/org/jetbrains/kotlin/compiler/visualizer/PsiVisualizer.kt +++ b/compiler/visualizer/render-psi/src/org/jetbrains/kotlin/compiler/visualizer/PsiVisualizer.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValu import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.expressions.DoubleColonLHS import java.util.* class PsiVisualizer(private val file: KtFile, analysisResult: AnalysisResult) : BaseRenderer() { @@ -225,6 +226,13 @@ class PsiVisualizer(private val file: KtFile, analysisResult: AnalysisResult) : } } } + + override fun visitClassLiteralExpression(expression: KtClassLiteralExpression) { + val doubleColonLhs = bindingContext[DOUBLE_COLON_LHS, expression.receiverExpression] + doubleColonLhs?.takeIf { it is DoubleColonLHS.Type }?.let { + addAnnotation(descriptorRenderer.render(it.type.constructor.declarationDescriptor!!), expression) + } ?: super.visitClassLiteralExpression(expression) + } } inner class PsiDescriptorRenderer( diff --git a/compiler/visualizer/testData/rawBuilder/expressions/classReference.kt b/compiler/visualizer/testData/rawBuilder/expressions/classReference.kt index 323de1891c6..3a29da0c46a 100644 --- a/compiler/visualizer/testData/rawBuilder/expressions/classReference.kt +++ b/compiler/visualizer/testData/rawBuilder/expressions/classReference.kt @@ -8,6 +8,8 @@ fun test() { // class A // │ A::class +// class A +// │ test.A::class // constructor A() // │ @@ -16,8 +18,8 @@ fun test() { // class A val reflect/KClass.java: java/lang/Class // │ │ A::class.java -// val reflect/KClass.java: java/lang/Class -// │ +// class A val reflect/KClass.java: java/lang/Class +// │ │ test.A::class.java // constructor A() // │ val reflect/KClass.java: java/lang/Class