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.render
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.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
@@ -29,13 +30,14 @@ object FirDiagnosticRenderers {
when (symbol) {
is FirClassLikeSymbol<*>,
is FirCallableSymbol<*> -> FirRenderer(
mode = FirRenderer.RenderMode.DeclarationHeader
mode = NoBodies
).with(
typeRenderer = ConeTypeRenderer(),
classMemberRenderer = FirNoClassMemberRenderer(),
bodyRenderer = null,
callArgumentsRenderer = FirCallNoArgumentsRenderer(),
modifierRenderer = FirPartialModifierRenderer(),
valueParameterRenderer = FirValueParameterRendererNoDefaultValue(),
).renderElementAsString(symbol.fir)
is FirTypeParameterSymbol -> symbol.name.asString()
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.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.*
open class FirRenderer private constructor(
class FirRenderer private constructor(
private val builder: StringBuilder,
protected val mode: RenderMode,
private val mode: RenderMode,
components: FirComponentsImpl,
private val annotationRenderer: FirAnnotationRenderer?,
private val bodyRenderer: FirBodyRenderer?,
@@ -40,7 +39,8 @@ open class FirRenderer private constructor(
private val declarationRenderer: FirDeclarationRenderer,
private val modifierRenderer: FirModifierRenderer,
private val packageDirectiveRenderer: FirPackageDirectiveRenderer?,
private val typeRenderer: ConeTypeRenderer
private val typeRenderer: ConeTypeRenderer,
private val valueParameterRenderer: FirValueParameterRenderer,
) : FirPrinter(builder) {
private val visitor = Visitor()
@@ -55,6 +55,7 @@ open class FirRenderer private constructor(
components.modifierRenderer = modifierRenderer
components.packageDirectiveRenderer = packageDirectiveRenderer
components.typeRenderer = typeRenderer
components.valueParameterRenderer = valueParameterRenderer
@Suppress("LeakingThis")
components.printer = this
annotationRenderer?.components = components
@@ -65,6 +66,7 @@ open class FirRenderer private constructor(
modifierRenderer.components = components
packageDirectiveRenderer?.components = components
typeRenderer.builder = builder
valueParameterRenderer.components = components
}
private constructor(
@@ -83,6 +85,7 @@ open class FirRenderer private constructor(
FirAllModifierRenderer(),
packageDirectiveRenderer = null,
ConeTypeRendererForDebugging(),
FirValueParameterRenderer(),
)
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,
modifierRenderer: FirModifierRenderer = this.modifierRenderer,
packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer,
typeRenderer: ConeTypeRenderer = this.typeRenderer
typeRenderer: ConeTypeRenderer = this.typeRenderer,
valueParameterRenderer: FirValueParameterRenderer = this.valueParameterRenderer,
): FirRenderer = FirRenderer(
builder, mode, FirComponentsImpl(),
annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer,
declarationRenderer, modifierRenderer, packageDirectiveRenderer, typeRenderer
declarationRenderer, modifierRenderer, packageDirectiveRenderer, typeRenderer, valueParameterRenderer
)
fun renderElementAsString(element: FirElement): String {
@@ -139,6 +143,8 @@ open class FirRenderer private constructor(
override lateinit var typeRenderer: ConeTypeRenderer
override lateinit var valueParameterRenderer: FirValueParameterRenderer
override lateinit var visitor: Visitor
override lateinit var printer: FirPrinter
@@ -147,7 +153,6 @@ open class FirRenderer private constructor(
data class RenderMode(
val renderCallableFqNames: Boolean,
val renderPropertyAccessors: Boolean = true,
val renderDefaultParameterValues: Boolean = true,
) {
companion object {
val Normal = RenderMode(
@@ -162,12 +167,6 @@ open class FirRenderer private constructor(
renderCallableFqNames = 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() {
label.let {
print(it)
@@ -238,7 +231,7 @@ open class FirRenderer private constructor(
annotationRenderer?.render(annotationContainer)
}
protected open fun renderClassDeclarations(regularClass: FirRegularClass) {
fun renderClassDeclarations(regularClass: FirRegularClass) {
classMemberRenderer.render(regularClass)
}
@@ -301,7 +294,7 @@ open class FirRenderer private constructor(
}
if (callableDeclaration is FirFunction) {
callableDeclaration.valueParameters.renderParameters()
valueParameterRenderer.renderParameters(callableDeclaration.valueParameters)
}
print(": ")
callableDeclaration.returnTypeRef.accept(this)
@@ -460,7 +453,7 @@ open class FirRenderer private constructor(
}
print("constructor")
constructor.typeParameters.renderTypeParameters()
constructor.valueParameters.renderParameters()
valueParameterRenderer.renderParameters(constructor.valueParameters)
print(": ")
constructor.returnTypeRef.accept(this)
val body = constructor.body
@@ -476,7 +469,7 @@ open class FirRenderer private constructor(
annotationRenderer?.render(propertyAccessor)
modifierRenderer.renderModifiers(propertyAccessor)
print(if (propertyAccessor.isGetter) "get" else "set")
propertyAccessor.valueParameters.renderParameters()
valueParameterRenderer.renderParameters(propertyAccessor.valueParameters)
print(": ")
propertyAccessor.returnTypeRef.accept(this)
propertyAccessor.renderContractDescription()
@@ -507,7 +500,7 @@ open class FirRenderer private constructor(
) {
print("(<no-parameters>)")
}
anonymousFunction.valueParameters.renderParameters()
valueParameterRenderer.renderParameters(anonymousFunction.valueParameters)
print(": ")
anonymousFunction.returnTypeRef.accept(this)
print(" <inline=${anonymousFunction.inlineStatus}")
@@ -519,7 +512,7 @@ open class FirRenderer private constructor(
}
override fun visitFunction(function: FirFunction) {
function.valueParameters.renderParameters()
valueParameterRenderer.renderParameters(function.valueParameters)
visitDeclaration(function)
bodyRenderer?.render(function)
}
@@ -572,21 +565,7 @@ open class FirRenderer private constructor(
}
override fun visitValueParameter(valueParameter: FirValueParameter) {
declarationRenderer.render(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("...")
}
}
valueParameterRenderer.renderParameter(valueParameter)
}
override fun visitImport(import: FirImport) {
@@ -864,7 +843,7 @@ open class FirRenderer private constructor(
it.accept(this)
print(".")
}
functionTypeRef.valueParameters.renderParameters()
valueParameterRenderer.renderParameters(functionTypeRef.valueParameters)
print(" -> ")
functionTypeRef.returnTypeRef.accept(this)
print(" )")
@@ -16,4 +16,5 @@ internal interface FirRendererComponents {
val modifierRenderer: FirModifierRenderer
val packageDirectiveRenderer: FirPackageDirectiveRenderer?
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(" = ...")
}
}
}