Extract separate ConeIdRenderer and get rid of FirRenderer.RenderMode

This commit is contained in:
Mikhail Glukhikh
2022-07-08 14:52:11 +02:00
committed by Space
parent e484a4a946
commit 42b3adf33a
13 changed files with 93 additions and 57 deletions
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirSourceResolveS
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithResolvePhase
import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.renderer.FirRenderer.RenderMode.Companion.Normal
import org.jetbrains.kotlin.psi.KtAnnotated
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.renderer.ConeIdFullRenderer
import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
@@ -126,7 +127,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF
null
)
val firDump = FirRenderer(mode = FirRenderer.RenderMode.WithFqNames).renderElementAsString(firElement)
val firDump = FirRenderer().with(idRenderer = ConeIdFullRenderer()).renderElementAsString(firElement)
JUnit5Assertions.assertEqualsToTestDataFileSibling(firDump)
}
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLeve
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithResolvePhase
import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.renderer.FirRenderer.RenderMode.Companion.Normal
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.services.TestModuleStructure
import org.jetbrains.kotlin.test.services.TestServices
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.*
import org.jetbrains.kotlin.fir.renderer.FirRenderer.RenderMode.Companion.WithFqNames
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -30,6 +29,7 @@ object FirDiagnosticRenderers {
is FirClassLikeSymbol<*>,
is FirCallableSymbol<*> -> FirRenderer().with(
typeRenderer = ConeTypeRenderer(),
idRenderer = ConeIdShortRenderer(),
classMemberRenderer = FirNoClassMemberRenderer(),
bodyRenderer = null,
propertyAccessorRenderer = null,
@@ -103,8 +103,8 @@ object FirDiagnosticRenderers {
val FQ_NAMES_IN_TYPES = Renderer { symbol: FirBasedSymbol<*> ->
@OptIn(SymbolInternals::class)
FirRenderer(mode = WithFqNames).with(
annotationRenderer = null, bodyRenderer = null
FirRenderer().with(
annotationRenderer = null, bodyRenderer = null, idRenderer = ConeIdFullRenderer()
).renderElementAsString(symbol.fir)
}
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
class ConeIdFullRenderer : ConeIdRenderer() {
override fun renderClassId(classId: ClassId) {
builder.append(classId.asString())
}
override fun renderCallableId(callableId: CallableId) {
builder.append(callableId)
}
}
@@ -5,15 +5,13 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
open class ConeTypeRendererWithFqNames() : ConeTypeRenderer() {
abstract class ConeIdRenderer {
constructor(builder: StringBuilder) : this() {
this.builder = builder
}
lateinit var builder: StringBuilder
override fun ClassId.render() {
builder.append(asString())
}
abstract fun renderClassId(classId: ClassId)
abstract fun renderCallableId(callableId: CallableId)
}
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
class ConeIdRendererForDebugging : ConeIdRenderer() {
override fun renderClassId(classId: ClassId) {
builder.append(classId.asString())
}
override fun renderCallableId(callableId: CallableId) {
builder.append(callableId.callableName)
}
}
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
open class ConeIdShortRenderer : ConeIdRenderer() {
override fun renderClassId(classId: ClassId) {
builder.append(classId.relativeClassName.asString())
}
override fun renderCallableId(callableId: CallableId) {
builder.append(callableId.callableName)
}
}
@@ -7,16 +7,18 @@ package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.ClassId
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
open class ConeTypeRenderer() {
lateinit var builder: StringBuilder
lateinit var idRenderer: ConeIdRenderer
constructor(builder: StringBuilder) : this() {
constructor(builder: StringBuilder, idRenderer: ConeIdRenderer) : this() {
this.builder = builder
this.idRenderer = idRenderer
idRenderer.builder = builder
}
open fun renderAsPossibleFunctionType(
@@ -137,7 +139,7 @@ open class ConeTypeRenderer() {
}
private fun ConeClassLikeType.render() {
lookupTag.classId.render()
idRenderer.renderClassId(lookupTag.classId)
if (typeArguments.isEmpty()) return
builder.append("<")
for ((index, typeArgument) in typeArguments.withIndex()) {
@@ -149,10 +151,6 @@ open class ConeTypeRenderer() {
builder.append(">")
}
protected open fun ClassId.render() {
builder.append(relativeClassName.asString())
}
private fun ConeFlexibleType.render() {
val lowerBound = lowerBound
val upperBound = upperBound
@@ -8,10 +8,12 @@ package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeProjection
class ConeTypeRendererForDebugging() : ConeTypeRendererWithFqNames() {
class ConeTypeRendererForDebugging() : ConeTypeRenderer() {
constructor(builder: StringBuilder) : this() {
this.builder = builder
this.idRenderer = ConeIdRendererForDebugging()
idRenderer.builder = builder
}
override fun renderAsPossibleFunctionType(type: ConeKotlinType, renderType: ConeTypeProjection.() -> Unit) {
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugging
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererWithFqNames
import org.jetbrains.kotlin.fir.renderer.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.types.Variance
@@ -128,13 +126,13 @@ fun ConeKotlinType.renderForDebugging(): String {
fun ConeKotlinType.renderReadable(): String {
val builder = StringBuilder()
ConeTypeRenderer(builder).render(this)
ConeTypeRenderer(builder, idRenderer = ConeIdShortRenderer()).render(this)
return builder.toString()
}
fun ConeKotlinType.renderReadableWithFqNames(): String {
val builder = StringBuilder()
ConeTypeRendererWithFqNames(builder).render(this)
ConeTypeRenderer(builder, idRenderer = ConeIdRendererForDebugging()).render(this)
return builder.toString()
}
@@ -30,7 +30,6 @@ import java.util.*
class FirRenderer private constructor(
private val builder: StringBuilder,
private val mode: RenderMode,
components: FirComponentsImpl,
private val annotationRenderer: FirAnnotationRenderer?,
private val bodyRenderer: FirBodyRenderer?,
@@ -38,6 +37,7 @@ class FirRenderer private constructor(
private val classMemberRenderer: FirClassMemberRenderer,
private val contractRenderer: ConeContractRenderer?,
private val declarationRenderer: FirDeclarationRenderer,
private val idRenderer: ConeIdRenderer,
private val modifierRenderer: FirModifierRenderer,
private val packageDirectiveRenderer: FirPackageDirectiveRenderer?,
private val propertyAccessorRenderer: FirPropertyAccessorRenderer?,
@@ -54,6 +54,7 @@ class FirRenderer private constructor(
components.callArgumentsRenderer = callArgumentsRenderer
components.classMemberRenderer = classMemberRenderer
components.declarationRenderer = declarationRenderer
components.idRenderer = idRenderer
components.modifierRenderer = modifierRenderer
components.packageDirectiveRenderer = packageDirectiveRenderer
components.propertyAccessorRenderer = propertyAccessorRenderer
@@ -67,20 +68,20 @@ class FirRenderer private constructor(
classMemberRenderer.components = components
contractRenderer?.components = components
declarationRenderer.components = components
idRenderer.builder = builder
modifierRenderer.components = components
packageDirectiveRenderer?.components = components
propertyAccessorRenderer?.components = components
typeRenderer.builder = builder
typeRenderer.idRenderer = idRenderer
valueParameterRenderer.components = components
}
private constructor(
builder: StringBuilder,
mode: RenderMode,
components: FirComponentsImpl,
) : this(
builder,
mode,
components,
FirAnnotationRenderer(),
FirBodyRenderer(),
@@ -88,6 +89,7 @@ class FirRenderer private constructor(
FirClassMemberRenderer(),
ConeContractRenderer(),
FirDeclarationRenderer(),
ConeIdRendererForDebugging(),
FirAllModifierRenderer(),
packageDirectiveRenderer = null,
FirPropertyAccessorRenderer(),
@@ -95,7 +97,7 @@ class FirRenderer private constructor(
FirValueParameterRenderer(),
)
constructor(builder: StringBuilder = StringBuilder(), mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl())
constructor(builder: StringBuilder = StringBuilder()) : this(builder, FirComponentsImpl())
fun with(
annotationRenderer: FirAnnotationRenderer? = this.annotationRenderer,
@@ -104,16 +106,17 @@ class FirRenderer private constructor(
classMemberRenderer: FirClassMemberRenderer = this.classMemberRenderer,
contractRenderer: ConeContractRenderer? = this.contractRenderer,
declarationRenderer: FirDeclarationRenderer = this.declarationRenderer,
idRenderer: ConeIdRenderer = this.idRenderer,
modifierRenderer: FirModifierRenderer = this.modifierRenderer,
packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer,
propertyAccessorRenderer: FirPropertyAccessorRenderer? = this.propertyAccessorRenderer,
typeRenderer: ConeTypeRenderer = this.typeRenderer,
valueParameterRenderer: FirValueParameterRenderer = this.valueParameterRenderer,
): FirRenderer = FirRenderer(
builder, mode, FirComponentsImpl(),
builder, FirComponentsImpl(),
annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer,
contractRenderer, declarationRenderer, modifierRenderer, packageDirectiveRenderer,
propertyAccessorRenderer, typeRenderer, valueParameterRenderer
contractRenderer, declarationRenderer, idRenderer, modifierRenderer,
packageDirectiveRenderer, propertyAccessorRenderer, typeRenderer, valueParameterRenderer
)
fun renderElementAsString(element: FirElement): String {
@@ -153,6 +156,8 @@ class FirRenderer private constructor(
override lateinit var declarationRenderer: FirDeclarationRenderer
override lateinit var idRenderer: ConeIdRenderer
override lateinit var modifierRenderer: FirModifierRenderer
override lateinit var typeRenderer: ConeTypeRenderer
@@ -164,20 +169,6 @@ class FirRenderer private constructor(
override lateinit var printer: FirPrinter
}
data class RenderMode(
val renderCallableFqNames: Boolean,
) {
companion object {
val Normal = RenderMode(
renderCallableFqNames = false,
)
val WithFqNames = RenderMode(
renderCallableFqNames = true,
)
}
}
private fun List<ConeKotlinType>.renderTypesSeparated() {
for ((index, element) in this.withIndex()) {
if (index > 0) {
@@ -285,18 +276,10 @@ class FirRenderer private constructor(
}
when (callableDeclaration) {
is FirSimpleFunction -> {
if (!mode.renderCallableFqNames) {
print(callableDeclaration.name)
} else {
print(callableDeclaration.symbol.callableId)
}
idRenderer.renderCallableId(callableDeclaration.symbol.callableId)
}
is FirVariable -> {
if (!mode.renderCallableFqNames) {
print(callableDeclaration.name)
} else {
print(callableDeclaration.symbol.callableId)
}
idRenderer.renderCallableId(callableDeclaration.symbol.callableId)
}
else -> {}
}
@@ -16,6 +16,7 @@ internal interface FirRendererComponents {
val callArgumentsRenderer: FirCallArgumentsRenderer
val classMemberRenderer: FirClassMemberRenderer
val contractRenderer: ConeContractRenderer?
val idRenderer: ConeIdRenderer
val modifierRenderer: FirModifierRenderer
val packageDirectiveRenderer: FirPackageDirectiveRenderer?
val propertyAccessorRenderer: FirPropertyAccessorRenderer?