From 9f1f777e0dc790d6745df3cdb48b189e078bc4ac Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 8 Jul 2022 12:55:07 +0200 Subject: [PATCH] Extract separate FirValueParameterRenderer --- .../diagnostics/FirDiagnosticRenderers.kt | 4 +- .../kotlin/fir/renderer/FirRenderer.kt | 61 ++++++------------- .../fir/renderer/FirRendererComponents.kt | 1 + .../fir/renderer/FirValueParameterRenderer.kt | 47 ++++++++++++++ ...FirValueParameterRendererNoDefaultValue.kt | 16 +++++ 5 files changed, 87 insertions(+), 42 deletions(-) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRenderer.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRendererNoDefaultValue.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt index 2b727dd1c1e..451204d2a9d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt @@ -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 -> "???" diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt index d8e2741966d..821f703818b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt @@ -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.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("()") } - anonymousFunction.valueParameters.renderParameters() + valueParameterRenderer.renderParameters(anonymousFunction.valueParameters) print(": ") anonymousFunction.returnTypeRef.accept(this) print(" ") functionTypeRef.returnTypeRef.accept(this) print(" )") diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt index a35269adba4..a7d107da226 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt @@ -16,4 +16,5 @@ internal interface FirRendererComponents { val modifierRenderer: FirModifierRenderer val packageDirectiveRenderer: FirPackageDirectiveRenderer? val typeRenderer: ConeTypeRenderer + val valueParameterRenderer: FirValueParameterRenderer } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRenderer.kt new file mode 100644 index 00000000000..8ad1ef4c536 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRenderer.kt @@ -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) { + 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) + } + } +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRendererNoDefaultValue.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRendererNoDefaultValue.kt new file mode 100644 index 00000000000..8507c01506b --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirValueParameterRendererNoDefaultValue.kt @@ -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(" = ...") + } + } +}