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.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithResolvePhase import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithResolvePhase
import org.jetbrains.kotlin.fir.renderer.FirRenderer 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.KtAnnotated
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile 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.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.psi 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.renderer.FirRenderer
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
@@ -126,7 +127,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF
null null
) )
val firDump = FirRenderer(mode = FirRenderer.RenderMode.WithFqNames).renderElementAsString(firElement) val firDump = FirRenderer().with(idRenderer = ConeIdFullRenderer()).renderElementAsString(firElement)
JUnit5Assertions.assertEqualsToTestDataFileSibling(firDump) 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.declarations.FirFile
import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithResolvePhase import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithResolvePhase
import org.jetbrains.kotlin.fir.renderer.FirRenderer 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.psi.KtFile
import org.jetbrains.kotlin.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestModuleStructure
import org.jetbrains.kotlin.test.services.TestServices 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.declarations.utils.*
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.* 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.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -30,6 +29,7 @@ object FirDiagnosticRenderers {
is FirClassLikeSymbol<*>, is FirClassLikeSymbol<*>,
is FirCallableSymbol<*> -> FirRenderer().with( is FirCallableSymbol<*> -> FirRenderer().with(
typeRenderer = ConeTypeRenderer(), typeRenderer = ConeTypeRenderer(),
idRenderer = ConeIdShortRenderer(),
classMemberRenderer = FirNoClassMemberRenderer(), classMemberRenderer = FirNoClassMemberRenderer(),
bodyRenderer = null, bodyRenderer = null,
propertyAccessorRenderer = null, propertyAccessorRenderer = null,
@@ -103,8 +103,8 @@ object FirDiagnosticRenderers {
val FQ_NAMES_IN_TYPES = Renderer { symbol: FirBasedSymbol<*> -> val FQ_NAMES_IN_TYPES = Renderer { symbol: FirBasedSymbol<*> ->
@OptIn(SymbolInternals::class) @OptIn(SymbolInternals::class)
FirRenderer(mode = WithFqNames).with( FirRenderer().with(
annotationRenderer = null, bodyRenderer = null annotationRenderer = null, bodyRenderer = null, idRenderer = ConeIdFullRenderer()
).renderElementAsString(symbol.fir) ).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 package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
open class ConeTypeRendererWithFqNames() : ConeTypeRenderer() { abstract class ConeIdRenderer {
constructor(builder: StringBuilder) : this() { lateinit var builder: StringBuilder
this.builder = builder
}
override fun ClassId.render() { abstract fun renderClassId(classId: ClassId)
builder.append(asString()) 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.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.ClassId
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
open class ConeTypeRenderer() { open class ConeTypeRenderer() {
lateinit var builder: StringBuilder lateinit var builder: StringBuilder
lateinit var idRenderer: ConeIdRenderer
constructor(builder: StringBuilder) : this() { constructor(builder: StringBuilder, idRenderer: ConeIdRenderer) : this() {
this.builder = builder this.builder = builder
this.idRenderer = idRenderer
idRenderer.builder = builder
} }
open fun renderAsPossibleFunctionType( open fun renderAsPossibleFunctionType(
@@ -137,7 +139,7 @@ open class ConeTypeRenderer() {
} }
private fun ConeClassLikeType.render() { private fun ConeClassLikeType.render() {
lookupTag.classId.render() idRenderer.renderClassId(lookupTag.classId)
if (typeArguments.isEmpty()) return if (typeArguments.isEmpty()) return
builder.append("<") builder.append("<")
for ((index, typeArgument) in typeArguments.withIndex()) { for ((index, typeArgument) in typeArguments.withIndex()) {
@@ -149,10 +151,6 @@ open class ConeTypeRenderer() {
builder.append(">") builder.append(">")
} }
protected open fun ClassId.render() {
builder.append(relativeClassName.asString())
}
private fun ConeFlexibleType.render() { private fun ConeFlexibleType.render() {
val lowerBound = lowerBound val lowerBound = lowerBound
val upperBound = upperBound 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.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeProjection import org.jetbrains.kotlin.fir.types.ConeTypeProjection
class ConeTypeRendererForDebugging() : ConeTypeRendererWithFqNames() { class ConeTypeRendererForDebugging() : ConeTypeRenderer() {
constructor(builder: StringBuilder) : this() { constructor(builder: StringBuilder) : this() {
this.builder = builder this.builder = builder
this.idRenderer = ConeIdRendererForDebugging()
idRenderer.builder = builder
} }
override fun renderAsPossibleFunctionType(type: ConeKotlinType, renderType: ConeTypeProjection.() -> Unit) { override fun renderAsPossibleFunctionType(type: ConeKotlinType, renderType: ConeTypeProjection.() -> Unit) {
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.fir.types package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer import org.jetbrains.kotlin.fir.renderer.*
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugging
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererWithFqNames
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -128,13 +126,13 @@ fun ConeKotlinType.renderForDebugging(): String {
fun ConeKotlinType.renderReadable(): String { fun ConeKotlinType.renderReadable(): String {
val builder = StringBuilder() val builder = StringBuilder()
ConeTypeRenderer(builder).render(this) ConeTypeRenderer(builder, idRenderer = ConeIdShortRenderer()).render(this)
return builder.toString() return builder.toString()
} }
fun ConeKotlinType.renderReadableWithFqNames(): String { fun ConeKotlinType.renderReadableWithFqNames(): String {
val builder = StringBuilder() val builder = StringBuilder()
ConeTypeRendererWithFqNames(builder).render(this) ConeTypeRenderer(builder, idRenderer = ConeIdRendererForDebugging()).render(this)
return builder.toString() return builder.toString()
} }
@@ -30,7 +30,6 @@ import java.util.*
class FirRenderer private constructor( class FirRenderer private constructor(
private val builder: StringBuilder, private val builder: StringBuilder,
private val mode: RenderMode,
components: FirComponentsImpl, components: FirComponentsImpl,
private val annotationRenderer: FirAnnotationRenderer?, private val annotationRenderer: FirAnnotationRenderer?,
private val bodyRenderer: FirBodyRenderer?, private val bodyRenderer: FirBodyRenderer?,
@@ -38,6 +37,7 @@ class FirRenderer private constructor(
private val classMemberRenderer: FirClassMemberRenderer, private val classMemberRenderer: FirClassMemberRenderer,
private val contractRenderer: ConeContractRenderer?, private val contractRenderer: ConeContractRenderer?,
private val declarationRenderer: FirDeclarationRenderer, private val declarationRenderer: FirDeclarationRenderer,
private val idRenderer: ConeIdRenderer,
private val modifierRenderer: FirModifierRenderer, private val modifierRenderer: FirModifierRenderer,
private val packageDirectiveRenderer: FirPackageDirectiveRenderer?, private val packageDirectiveRenderer: FirPackageDirectiveRenderer?,
private val propertyAccessorRenderer: FirPropertyAccessorRenderer?, private val propertyAccessorRenderer: FirPropertyAccessorRenderer?,
@@ -54,6 +54,7 @@ class FirRenderer private constructor(
components.callArgumentsRenderer = callArgumentsRenderer components.callArgumentsRenderer = callArgumentsRenderer
components.classMemberRenderer = classMemberRenderer components.classMemberRenderer = classMemberRenderer
components.declarationRenderer = declarationRenderer components.declarationRenderer = declarationRenderer
components.idRenderer = idRenderer
components.modifierRenderer = modifierRenderer components.modifierRenderer = modifierRenderer
components.packageDirectiveRenderer = packageDirectiveRenderer components.packageDirectiveRenderer = packageDirectiveRenderer
components.propertyAccessorRenderer = propertyAccessorRenderer components.propertyAccessorRenderer = propertyAccessorRenderer
@@ -67,20 +68,20 @@ class FirRenderer private constructor(
classMemberRenderer.components = components classMemberRenderer.components = components
contractRenderer?.components = components contractRenderer?.components = components
declarationRenderer.components = components declarationRenderer.components = components
idRenderer.builder = builder
modifierRenderer.components = components modifierRenderer.components = components
packageDirectiveRenderer?.components = components packageDirectiveRenderer?.components = components
propertyAccessorRenderer?.components = components propertyAccessorRenderer?.components = components
typeRenderer.builder = builder typeRenderer.builder = builder
typeRenderer.idRenderer = idRenderer
valueParameterRenderer.components = components valueParameterRenderer.components = components
} }
private constructor( private constructor(
builder: StringBuilder, builder: StringBuilder,
mode: RenderMode,
components: FirComponentsImpl, components: FirComponentsImpl,
) : this( ) : this(
builder, builder,
mode,
components, components,
FirAnnotationRenderer(), FirAnnotationRenderer(),
FirBodyRenderer(), FirBodyRenderer(),
@@ -88,6 +89,7 @@ class FirRenderer private constructor(
FirClassMemberRenderer(), FirClassMemberRenderer(),
ConeContractRenderer(), ConeContractRenderer(),
FirDeclarationRenderer(), FirDeclarationRenderer(),
ConeIdRendererForDebugging(),
FirAllModifierRenderer(), FirAllModifierRenderer(),
packageDirectiveRenderer = null, packageDirectiveRenderer = null,
FirPropertyAccessorRenderer(), FirPropertyAccessorRenderer(),
@@ -95,7 +97,7 @@ class FirRenderer private constructor(
FirValueParameterRenderer(), FirValueParameterRenderer(),
) )
constructor(builder: StringBuilder = StringBuilder(), mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl()) constructor(builder: StringBuilder = StringBuilder()) : this(builder, FirComponentsImpl())
fun with( fun with(
annotationRenderer: FirAnnotationRenderer? = this.annotationRenderer, annotationRenderer: FirAnnotationRenderer? = this.annotationRenderer,
@@ -104,16 +106,17 @@ class FirRenderer private constructor(
classMemberRenderer: FirClassMemberRenderer = this.classMemberRenderer, classMemberRenderer: FirClassMemberRenderer = this.classMemberRenderer,
contractRenderer: ConeContractRenderer? = this.contractRenderer, contractRenderer: ConeContractRenderer? = this.contractRenderer,
declarationRenderer: FirDeclarationRenderer = this.declarationRenderer, declarationRenderer: FirDeclarationRenderer = this.declarationRenderer,
idRenderer: ConeIdRenderer = this.idRenderer,
modifierRenderer: FirModifierRenderer = this.modifierRenderer, modifierRenderer: FirModifierRenderer = this.modifierRenderer,
packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer, packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer,
propertyAccessorRenderer: FirPropertyAccessorRenderer? = this.propertyAccessorRenderer, propertyAccessorRenderer: FirPropertyAccessorRenderer? = this.propertyAccessorRenderer,
typeRenderer: ConeTypeRenderer = this.typeRenderer, typeRenderer: ConeTypeRenderer = this.typeRenderer,
valueParameterRenderer: FirValueParameterRenderer = this.valueParameterRenderer, valueParameterRenderer: FirValueParameterRenderer = this.valueParameterRenderer,
): FirRenderer = FirRenderer( ): FirRenderer = FirRenderer(
builder, mode, FirComponentsImpl(), builder, FirComponentsImpl(),
annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer, annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer,
contractRenderer, declarationRenderer, modifierRenderer, packageDirectiveRenderer, contractRenderer, declarationRenderer, idRenderer, modifierRenderer,
propertyAccessorRenderer, typeRenderer, valueParameterRenderer packageDirectiveRenderer, propertyAccessorRenderer, typeRenderer, valueParameterRenderer
) )
fun renderElementAsString(element: FirElement): String { fun renderElementAsString(element: FirElement): String {
@@ -153,6 +156,8 @@ class FirRenderer private constructor(
override lateinit var declarationRenderer: FirDeclarationRenderer override lateinit var declarationRenderer: FirDeclarationRenderer
override lateinit var idRenderer: ConeIdRenderer
override lateinit var modifierRenderer: FirModifierRenderer override lateinit var modifierRenderer: FirModifierRenderer
override lateinit var typeRenderer: ConeTypeRenderer override lateinit var typeRenderer: ConeTypeRenderer
@@ -164,20 +169,6 @@ class FirRenderer private constructor(
override lateinit var printer: FirPrinter 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() { private fun List<ConeKotlinType>.renderTypesSeparated() {
for ((index, element) in this.withIndex()) { for ((index, element) in this.withIndex()) {
if (index > 0) { if (index > 0) {
@@ -285,18 +276,10 @@ class FirRenderer private constructor(
} }
when (callableDeclaration) { when (callableDeclaration) {
is FirSimpleFunction -> { is FirSimpleFunction -> {
if (!mode.renderCallableFqNames) { idRenderer.renderCallableId(callableDeclaration.symbol.callableId)
print(callableDeclaration.name)
} else {
print(callableDeclaration.symbol.callableId)
}
} }
is FirVariable -> { is FirVariable -> {
if (!mode.renderCallableFqNames) { idRenderer.renderCallableId(callableDeclaration.symbol.callableId)
print(callableDeclaration.name)
} else {
print(callableDeclaration.symbol.callableId)
}
} }
else -> {} else -> {}
} }
@@ -16,6 +16,7 @@ internal interface FirRendererComponents {
val callArgumentsRenderer: FirCallArgumentsRenderer val callArgumentsRenderer: FirCallArgumentsRenderer
val classMemberRenderer: FirClassMemberRenderer val classMemberRenderer: FirClassMemberRenderer
val contractRenderer: ConeContractRenderer? val contractRenderer: ConeContractRenderer?
val idRenderer: ConeIdRenderer
val modifierRenderer: FirModifierRenderer val modifierRenderer: FirModifierRenderer
val packageDirectiveRenderer: FirPackageDirectiveRenderer? val packageDirectiveRenderer: FirPackageDirectiveRenderer?
val propertyAccessorRenderer: FirPropertyAccessorRenderer? val propertyAccessorRenderer: FirPropertyAccessorRenderer?