[VISUALIZER] Fix class literals rendering

This commit is contained in:
Ivan Kylchik
2021-02-19 19:59:54 +03:00
committed by TeamCityServer
parent fb654ce09b
commit c94a4e7baf
3 changed files with 21 additions and 2 deletions
@@ -293,6 +293,10 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
jetWhenEntry.firstOfTypeWithRender<FirWhenBranch>(jetWhenEntry.expression) { this.result.typeRef }
super.visitWhenEntry(jetWhenEntry)
}
override fun visitClassLiteralExpression(expression: KtClassLiteralExpression) {
expression.firstOfTypeWithRender<FirGetClassCall>()
}
}
inner class FirRenderer : FirVisitor<Unit, StringBuilder>() {
@@ -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 -> {
@@ -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(
@@ -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 <T> reflect/KClass<T>.java: java/lang/Class<T>
// │ │
A::class.java
// val <T> reflect/KClass<T>.java: java/lang/Class<T>
//
// class A val <T> reflect/KClass<T>.java: java/lang/Class<T>
//
test.A::class.java
// constructor A()
// │ val <T> reflect/KClass<T>.java: java/lang/Class<T>