Extract separate FirValueParameterRenderer

This commit is contained in:
Mikhail Glukhikh
2022-07-08 12:55:07 +02:00
committed by Space
parent 76d5d3a2ec
commit 9f1f777e0d
5 changed files with 87 additions and 42 deletions
@@ -15,6 +15,7 @@ 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.NoBodies
import org.jetbrains.kotlin.fir.renderer.FirRenderer.RenderMode.Companion.WithFqNames 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
@@ -29,13 +30,14 @@ object FirDiagnosticRenderers {
when (symbol) { when (symbol) {
is FirClassLikeSymbol<*>, is FirClassLikeSymbol<*>,
is FirCallableSymbol<*> -> FirRenderer( is FirCallableSymbol<*> -> FirRenderer(
mode = FirRenderer.RenderMode.DeclarationHeader mode = NoBodies
).with( ).with(
typeRenderer = ConeTypeRenderer(), typeRenderer = ConeTypeRenderer(),
classMemberRenderer = FirNoClassMemberRenderer(), classMemberRenderer = FirNoClassMemberRenderer(),
bodyRenderer = null, bodyRenderer = null,
callArgumentsRenderer = FirCallNoArgumentsRenderer(), callArgumentsRenderer = FirCallNoArgumentsRenderer(),
modifierRenderer = FirPartialModifierRenderer(), modifierRenderer = FirPartialModifierRenderer(),
valueParameterRenderer = FirValueParameterRendererNoDefaultValue(),
).renderElementAsString(symbol.fir) ).renderElementAsString(symbol.fir)
is FirTypeParameterSymbol -> symbol.name.asString() is FirTypeParameterSymbol -> symbol.name.asString()
else -> "???" else -> "???"
@@ -22,16 +22,15 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.* import java.util.*
open class FirRenderer private constructor( class FirRenderer private constructor(
private val builder: StringBuilder, private val builder: StringBuilder,
protected val mode: RenderMode, private val mode: RenderMode,
components: FirComponentsImpl, components: FirComponentsImpl,
private val annotationRenderer: FirAnnotationRenderer?, private val annotationRenderer: FirAnnotationRenderer?,
private val bodyRenderer: FirBodyRenderer?, private val bodyRenderer: FirBodyRenderer?,
@@ -40,7 +39,8 @@ open class FirRenderer private constructor(
private val declarationRenderer: FirDeclarationRenderer, private val declarationRenderer: FirDeclarationRenderer,
private val modifierRenderer: FirModifierRenderer, private val modifierRenderer: FirModifierRenderer,
private val packageDirectiveRenderer: FirPackageDirectiveRenderer?, private val packageDirectiveRenderer: FirPackageDirectiveRenderer?,
private val typeRenderer: ConeTypeRenderer private val typeRenderer: ConeTypeRenderer,
private val valueParameterRenderer: FirValueParameterRenderer,
) : FirPrinter(builder) { ) : FirPrinter(builder) {
private val visitor = Visitor() private val visitor = Visitor()
@@ -55,6 +55,7 @@ open class FirRenderer private constructor(
components.modifierRenderer = modifierRenderer components.modifierRenderer = modifierRenderer
components.packageDirectiveRenderer = packageDirectiveRenderer components.packageDirectiveRenderer = packageDirectiveRenderer
components.typeRenderer = typeRenderer components.typeRenderer = typeRenderer
components.valueParameterRenderer = valueParameterRenderer
@Suppress("LeakingThis") @Suppress("LeakingThis")
components.printer = this components.printer = this
annotationRenderer?.components = components annotationRenderer?.components = components
@@ -65,6 +66,7 @@ open class FirRenderer private constructor(
modifierRenderer.components = components modifierRenderer.components = components
packageDirectiveRenderer?.components = components packageDirectiveRenderer?.components = components
typeRenderer.builder = builder typeRenderer.builder = builder
valueParameterRenderer.components = components
} }
private constructor( private constructor(
@@ -83,6 +85,7 @@ open class FirRenderer private constructor(
FirAllModifierRenderer(), FirAllModifierRenderer(),
packageDirectiveRenderer = null, packageDirectiveRenderer = null,
ConeTypeRendererForDebugging(), ConeTypeRendererForDebugging(),
FirValueParameterRenderer(),
) )
constructor(builder: StringBuilder = StringBuilder(), mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl()) constructor(builder: StringBuilder = StringBuilder(), mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl())
@@ -95,11 +98,12 @@ open class FirRenderer private constructor(
declarationRenderer: FirDeclarationRenderer = this.declarationRenderer, declarationRenderer: FirDeclarationRenderer = this.declarationRenderer,
modifierRenderer: FirModifierRenderer = this.modifierRenderer, modifierRenderer: FirModifierRenderer = this.modifierRenderer,
packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer, packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer,
typeRenderer: ConeTypeRenderer = this.typeRenderer typeRenderer: ConeTypeRenderer = this.typeRenderer,
valueParameterRenderer: FirValueParameterRenderer = this.valueParameterRenderer,
): FirRenderer = FirRenderer( ): FirRenderer = FirRenderer(
builder, mode, FirComponentsImpl(), builder, mode, FirComponentsImpl(),
annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer, annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer,
declarationRenderer, modifierRenderer, packageDirectiveRenderer, typeRenderer declarationRenderer, modifierRenderer, packageDirectiveRenderer, typeRenderer, valueParameterRenderer
) )
fun renderElementAsString(element: FirElement): String { fun renderElementAsString(element: FirElement): String {
@@ -139,6 +143,8 @@ open class FirRenderer private constructor(
override lateinit var typeRenderer: ConeTypeRenderer override lateinit var typeRenderer: ConeTypeRenderer
override lateinit var valueParameterRenderer: FirValueParameterRenderer
override lateinit var visitor: Visitor override lateinit var visitor: Visitor
override lateinit var printer: FirPrinter override lateinit var printer: FirPrinter
@@ -147,7 +153,6 @@ open class FirRenderer private constructor(
data class RenderMode( data class RenderMode(
val renderCallableFqNames: Boolean, val renderCallableFqNames: Boolean,
val renderPropertyAccessors: Boolean = true, val renderPropertyAccessors: Boolean = true,
val renderDefaultParameterValues: Boolean = true,
) { ) {
companion object { companion object {
val Normal = RenderMode( val Normal = RenderMode(
@@ -162,12 +167,6 @@ open class FirRenderer private constructor(
renderCallableFqNames = false, renderCallableFqNames = false,
renderPropertyAccessors = false, renderPropertyAccessors = false,
) )
val DeclarationHeader = RenderMode(
renderCallableFqNames = false,
renderPropertyAccessors = false,
renderDefaultParameterValues = false,
)
} }
} }
@@ -181,12 +180,6 @@ open class FirRenderer private constructor(
} }
private fun List<FirValueParameter>.renderParameters() {
print("(")
renderSeparated(this, visitor)
print(")")
}
private fun Variance.renderVariance() { private fun Variance.renderVariance() {
label.let { label.let {
print(it) print(it)
@@ -238,7 +231,7 @@ open class FirRenderer private constructor(
annotationRenderer?.render(annotationContainer) annotationRenderer?.render(annotationContainer)
} }
protected open fun renderClassDeclarations(regularClass: FirRegularClass) { fun renderClassDeclarations(regularClass: FirRegularClass) {
classMemberRenderer.render(regularClass) classMemberRenderer.render(regularClass)
} }
@@ -301,7 +294,7 @@ open class FirRenderer private constructor(
} }
if (callableDeclaration is FirFunction) { if (callableDeclaration is FirFunction) {
callableDeclaration.valueParameters.renderParameters() valueParameterRenderer.renderParameters(callableDeclaration.valueParameters)
} }
print(": ") print(": ")
callableDeclaration.returnTypeRef.accept(this) callableDeclaration.returnTypeRef.accept(this)
@@ -460,7 +453,7 @@ open class FirRenderer private constructor(
} }
print("constructor") print("constructor")
constructor.typeParameters.renderTypeParameters() constructor.typeParameters.renderTypeParameters()
constructor.valueParameters.renderParameters() valueParameterRenderer.renderParameters(constructor.valueParameters)
print(": ") print(": ")
constructor.returnTypeRef.accept(this) constructor.returnTypeRef.accept(this)
val body = constructor.body val body = constructor.body
@@ -476,7 +469,7 @@ open class FirRenderer private constructor(
annotationRenderer?.render(propertyAccessor) annotationRenderer?.render(propertyAccessor)
modifierRenderer.renderModifiers(propertyAccessor) modifierRenderer.renderModifiers(propertyAccessor)
print(if (propertyAccessor.isGetter) "get" else "set") print(if (propertyAccessor.isGetter) "get" else "set")
propertyAccessor.valueParameters.renderParameters() valueParameterRenderer.renderParameters(propertyAccessor.valueParameters)
print(": ") print(": ")
propertyAccessor.returnTypeRef.accept(this) propertyAccessor.returnTypeRef.accept(this)
propertyAccessor.renderContractDescription() propertyAccessor.renderContractDescription()
@@ -507,7 +500,7 @@ open class FirRenderer private constructor(
) { ) {
print("(<no-parameters>)") print("(<no-parameters>)")
} }
anonymousFunction.valueParameters.renderParameters() valueParameterRenderer.renderParameters(anonymousFunction.valueParameters)
print(": ") print(": ")
anonymousFunction.returnTypeRef.accept(this) anonymousFunction.returnTypeRef.accept(this)
print(" <inline=${anonymousFunction.inlineStatus}") print(" <inline=${anonymousFunction.inlineStatus}")
@@ -519,7 +512,7 @@ open class FirRenderer private constructor(
} }
override fun visitFunction(function: FirFunction) { override fun visitFunction(function: FirFunction) {
function.valueParameters.renderParameters() valueParameterRenderer.renderParameters(function.valueParameters)
visitDeclaration(function) visitDeclaration(function)
bodyRenderer?.render(function) bodyRenderer?.render(function)
} }
@@ -572,21 +565,7 @@ open class FirRenderer private constructor(
} }
override fun visitValueParameter(valueParameter: FirValueParameter) { override fun visitValueParameter(valueParameter: FirValueParameter) {
declarationRenderer.render(valueParameter) valueParameterRenderer.renderParameter(valueParameter)
annotationRenderer?.render(valueParameter)
modifierRenderer.renderModifiers(valueParameter)
if (valueParameter.name != SpecialNames.NO_NAME_PROVIDED) {
print(valueParameter.name.toString() + ": ")
}
valueParameter.returnTypeRef.accept(this)
valueParameter.defaultValue?.let {
print(" = ")
if (mode.renderDefaultParameterValues) {
it.accept(this)
} else {
print("...")
}
}
} }
override fun visitImport(import: FirImport) { override fun visitImport(import: FirImport) {
@@ -864,7 +843,7 @@ open class FirRenderer private constructor(
it.accept(this) it.accept(this)
print(".") print(".")
} }
functionTypeRef.valueParameters.renderParameters() valueParameterRenderer.renderParameters(functionTypeRef.valueParameters)
print(" -> ") print(" -> ")
functionTypeRef.returnTypeRef.accept(this) functionTypeRef.returnTypeRef.accept(this)
print(" )") print(" )")
@@ -16,4 +16,5 @@ internal interface FirRendererComponents {
val modifierRenderer: FirModifierRenderer val modifierRenderer: FirModifierRenderer
val packageDirectiveRenderer: FirPackageDirectiveRenderer? val packageDirectiveRenderer: FirPackageDirectiveRenderer?
val typeRenderer: ConeTypeRenderer val typeRenderer: ConeTypeRenderer
val valueParameterRenderer: FirValueParameterRenderer
} }
@@ -0,0 +1,47 @@
/*
* 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.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.name.SpecialNames
open class FirValueParameterRenderer {
internal lateinit var components: FirRendererComponents
protected val printer get() = components.printer
protected val visitor get() = components.visitor
private val annotationRenderer get() = components.annotationRenderer
protected val declarationRenderer get() = components.declarationRenderer
private val modifierRenderer get() = components.modifierRenderer
fun renderParameters(valueParameters: List<FirValueParameter>) {
printer.print("(")
for ((index, valueParameter) in valueParameters.withIndex()) {
if (index > 0) {
printer.print(", ")
}
renderParameter(valueParameter)
}
printer.print(")")
}
fun renderParameter(valueParameter: FirValueParameter) {
declarationRenderer.render(valueParameter)
annotationRenderer?.render(valueParameter)
modifierRenderer.renderModifiers(valueParameter)
if (valueParameter.name != SpecialNames.NO_NAME_PROVIDED) {
printer.print(valueParameter.name.toString() + ": ")
}
valueParameter.returnTypeRef.accept(visitor)
renderDefaultValue(valueParameter)
}
protected open fun renderDefaultValue(valueParameter: FirValueParameter) {
valueParameter.defaultValue?.let {
printer.print(" = ")
it.accept(visitor)
}
}
}
@@ -0,0 +1,16 @@
/*
* 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.fir.declarations.FirValueParameter
class FirValueParameterRendererNoDefaultValue : FirValueParameterRenderer() {
override fun renderDefaultValue(valueParameter: FirValueParameter) {
valueParameter.defaultValue?.let {
printer.print(" = ...")
}
}
}