[VISUALIZER] Fix package rendering

This commit is contained in:
Ivan Kylchik
2021-02-10 12:01:08 +03:00
committed by TeamCityServer
parent c4be67b518
commit f2cf86a3ae
8 changed files with 26 additions and 44 deletions
@@ -278,7 +278,8 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
inner class FirRenderer : FirVisitor<Unit, StringBuilder>() { inner class FirRenderer : FirVisitor<Unit, StringBuilder>() {
private val session = firFile.session private val session = firFile.session
private val filePackage = firFile.packageFqName.toString().replace(".", "/") private val filePackage = firFile.packageFqName.toString()
private val filePackageWithSlash = filePackage.replace(".", "/")
private val symbolProvider = firFile.session.symbolProvider private val symbolProvider = firFile.session.symbolProvider
private fun FirTypeRef.renderWithNativeRenderer(): String { private fun FirTypeRef.renderWithNativeRenderer(): String {
@@ -288,17 +289,13 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
}.replace("R|", "").replace("|", "") }.replace("R|", "").replace("|", "")
} }
private fun removeCurrentFilePackage(fqName: String): String { private fun String.removeCurrentFilePackage(): String {
val withoutPackage = when { val withoutPackage = this.replaceFirst("$filePackage.", "").replaceFirst("$filePackageWithSlash/", "")
fqName.startsWith(filePackage) && !fqName.substring(filePackage.length + 1).contains("/") ->
fqName.replaceFirst("$filePackage/", "")
else -> fqName
}
return withoutPackage.let { if (it.startsWith("/")) it.substring(1) else it } return withoutPackage.let { if (it.startsWith("/")) it.substring(1) else it }
} }
private fun ClassId.getWithoutCurrentPackage() = removeCurrentFilePackage(this.asString()) private fun ClassId.getWithoutCurrentPackage() = this.asString().removeCurrentFilePackage()
private fun <T : FirElement> renderListInTriangles(list: List<T>, data: StringBuilder, withSpace: Boolean = false) { private fun <T : FirElement> renderListInTriangles(list: List<T>, data: StringBuilder, withSpace: Boolean = false) {
if (list.isNotEmpty()) { if (list.isNotEmpty()) {
@@ -495,7 +492,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
} }
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: StringBuilder) { override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: StringBuilder) {
data.append(resolvedTypeRef.renderWithNativeRenderer()) data.append((resolvedTypeRef.delegatedTypeRef ?: resolvedTypeRef).renderWithNativeRenderer().removeCurrentFilePackage())
val coneType = resolvedTypeRef.type val coneType = resolvedTypeRef.type
if (coneType is ConeClassLikeType) { if (coneType is ConeClassLikeType) {
val original = coneType.directExpansionType(session) val original = coneType.directExpansionType(session)
@@ -518,8 +515,9 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
val id = when (symbol) { val id = when (symbol) {
is FirCallableSymbol<*> -> { is FirCallableSymbol<*> -> {
val callableId = symbol.callableId val callableId = symbol.callableId
val idWithPackage = callableId.toString().replaceFirst(".${callableId.callableName}", "") callableId.toString()
removeCurrentFilePackage(idWithPackage) .replaceFirst(".${callableId.callableName}", "")
.removeCurrentFilePackage()
} }
is FirClassLikeSymbol<*> -> symbol.classId.getWithoutCurrentPackage() is FirClassLikeSymbol<*> -> symbol.classId.getWithoutCurrentPackage()
else -> "" else -> ""
@@ -529,10 +527,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
if (variable !is FirValueParameter) { if (variable !is FirValueParameter) {
if (variable.isVar) data.append("var ") else if (variable.isVal) data.append("val ") if (variable.isVar) data.append("var ") else if (variable.isVal) data.append("val ")
} }
data.append(id) data.append(id).append(": ").append(variable.returnTypeRef.render())
data.append(": ")
variable.returnTypeRef.accept(this, data)
} }
when (symbol) { when (symbol) {
@@ -560,7 +555,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
} }
data.append(symbol.callableId.callableName).append(": ") data.append(symbol.callableId.callableName).append(": ")
symbol.fir.returnTypeRef.accept(this, data) data.append(symbol.fir.returnTypeRef.render())
} }
} }
@@ -353,11 +353,12 @@ class PsiVisualizer(private val file: KtFile, analysisResult: AnalysisResult) :
} }
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: StringBuilder) { override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: StringBuilder) {
data.append("package-fragment ${renderFqName(descriptor, removeCurrentPackage = false)}") //data.append("package-fragment ${renderFqName(descriptor, removeCurrentPackage = false)}")
} }
override fun visitPackageViewDescriptor(descriptor: PackageViewDescriptor, data: StringBuilder) { override fun visitPackageViewDescriptor(descriptor: PackageViewDescriptor, data: StringBuilder) {
data.append("package ${renderFqName(descriptor, removeCurrentPackage = false)}") // don't render package because support the same logic in fir is very hard
//data.append("package ${renderFqName(descriptor, removeCurrentPackage = false)}")
} }
override fun visitVariableDescriptor(variable: VariableDescriptor, data: StringBuilder) { override fun visitVariableDescriptor(variable: VariableDescriptor, data: StringBuilder) {
@@ -9,9 +9,7 @@ class C<T, out S> {
interface Test { interface Test {
// C<out CharSequence, *>.D<in collections/List<*>, *> // C<out CharSequence, *>.D<in collections/List<*>, *>
// │ package a // │ class C<T, S> collections/List<*>
// │ │ package a/b // │ │ │
// │ │ │ class C<T, S> collections/List<*>
// │ │ │ │ │
val x: a.b.C<out CharSequence, *>.D<in List<*>, *> val x: a.b.C<out CharSequence, *>.D<in List<*>, *>
} }
@@ -15,8 +15,8 @@ fun test_1() {
fun test_2() { fun test_2() {
// fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit // fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit
// package kotlin │ contract@0 // │ contract@0
// │ │ // │ │
kotlin.contracts.contract { kotlin.contracts.contract {
// this@0 // this@0
// fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<???>, contracts/InvocationKind = ...): contracts/CallsInPlace // fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<???>, contracts/InvocationKind = ...): contracts/CallsInPlace
@@ -51,8 +51,8 @@ var test_3: Int = 1
// │ // │
set(value) { set(value) {
// fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit // fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit
// package kotlin │ contract@0 // │ contract@0
// │ │ // │ │
kotlin.contracts.contract { kotlin.contracts.contract {
// this@0 // this@0
// fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<???>, contracts/InvocationKind = ...): contracts/CallsInPlace // fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<???>, contracts/InvocationKind = ...): contracts/CallsInPlace
@@ -1,9 +1,4 @@
// FIR_IGNORE
// package kotlin
// │
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
// package kotlin
// │
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
// fun <T> lazy<Int>(() -> Int): Lazy<Int> // fun <T> lazy<Int>(() -> Int): Lazy<Int>
@@ -18,9 +18,8 @@ abstract class My<T : Some> {
abstract val y: My.T abstract val y: My.T
// [ERROR : T] // [ERROR : T]
// │ package test // │ class My<T : Some>
// │ class My<T : Some> // │
// │ │ │
abstract val z: test.My.T abstract val z: test.My.T
// [ERROR : T] // [ERROR : T]
@@ -8,8 +8,6 @@ fun test() {
// class A // class A
// │ // │
A::class A::class
// package test
// │
test.A::class test.A::class
// constructor A() // constructor A()
// │ // │
@@ -18,8 +16,8 @@ fun test() {
// class A val <T> reflect/KClass<A>.java: java/lang/Class<A> // class A val <T> reflect/KClass<A>.java: java/lang/Class<A>
// │ │ // │ │
A::class.java A::class.java
// package test val <T> reflect/KClass<A>.java: java/lang/Class<A> // val <T> reflect/KClass<A>.java: java/lang/Class<A>
// //
test.A::class.java test.A::class.java
// constructor A() // constructor A()
// │ val <T> reflect/KClass<out A>.java: java/lang/Class<out A> // │ val <T> reflect/KClass<out A>.java: java/lang/Class<out A>
@@ -9,14 +9,10 @@ package org.jetbrains.kotlin.test
// │ │ │ │ │ // │ │ │ │ │
val listOfInt = listOf(1, 2, 3) val listOfInt = listOf(1, 2, 3)
// java/util/ArrayList<Int> // java/util/ArrayList<Int>
// │ package java // │ constructor java/util/ArrayList<E : Any!>()
// │ constructor java/util/ArrayList<E : Any!>() // │
// │ │ │
val javaList = java.util.ArrayList<Int>() val javaList = java.util.ArrayList<Int>()
// package java
// │ package java/util
// │ │
fun move(): java.util.ArrayList<Int> { fun move(): java.util.ArrayList<Int> {
// Int val listOfInt: collections/List<Int> // Int val listOfInt: collections/List<Int>
// │ │ // │ │