From 31a46866b65365ac4cdb684272c75aefb03e02fd Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 8 Jul 2022 13:51:10 +0200 Subject: [PATCH] Extract separate FirPropertyAccessorRenderer --- .../api/fir/components/KtFirTypeProvider.kt | 5 ++- .../diagnostics/FirDiagnosticRenderers.kt | 6 +-- .../kotlin/fir/renderer/FirPrinter.kt | 4 +- .../renderer/FirPropertyAccessorRenderer.kt | 38 +++++++++++++++++++ .../kotlin/fir/renderer/FirRenderer.kt | 37 +++++------------- .../fir/renderer/FirRendererComponents.kt | 1 + .../fir/handlers/FirScopeDumpHandler.kt | 5 ++- 7 files changed, 59 insertions(+), 37 deletions(-) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPropertyAccessorRenderer.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index b0e8d4c778e..9c7bc429c08 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -160,8 +160,9 @@ internal class KtFirTypeProvider( ?: this.typeArguments.mapNotNull { it.type }) require(typeParameterSymbols.size == argumentTypes.size) { - val renderedSymbol = FirRenderer(mode = FirRenderer.RenderMode.NoBodies).with( - annotationRenderer = null, bodyRenderer = null, callArgumentsRenderer = FirCallNoArgumentsRenderer() + val renderedSymbol = FirRenderer().with( + annotationRenderer = null, bodyRenderer = null, propertyAccessorRenderer = null, + callArgumentsRenderer = FirCallNoArgumentsRenderer() ).renderElementAsString(symbol.fir) "'$renderedSymbol' expects '${typeParameterSymbols.size}' type arguments " + "but type '${this.renderForDebugging()}' has ${argumentTypes.size} type arguments." 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 451204d2a9d..48d3e161f12 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,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.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,12 +28,11 @@ object FirDiagnosticRenderers { val SYMBOL = Renderer { symbol: FirBasedSymbol<*> -> when (symbol) { is FirClassLikeSymbol<*>, - is FirCallableSymbol<*> -> FirRenderer( - mode = NoBodies - ).with( + is FirCallableSymbol<*> -> FirRenderer().with( typeRenderer = ConeTypeRenderer(), classMemberRenderer = FirNoClassMemberRenderer(), bodyRenderer = null, + propertyAccessorRenderer = null, callArgumentsRenderer = FirCallNoArgumentsRenderer(), modifierRenderer = FirPartialModifierRenderer(), valueParameterRenderer = FirValueParameterRendererNoDefaultValue(), diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt index 1b160b259b8..01489fed738 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt @@ -28,11 +28,11 @@ open class FirPrinter(builder: StringBuilder) { lineBeginning = true } - protected fun pushIndent() { + internal fun pushIndent() { printer.pushIndent() } - protected fun popIndent() { + internal fun popIndent() { printer.popIndent() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPropertyAccessorRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPropertyAccessorRenderer.kt new file mode 100644 index 00000000000..c86a72c56d1 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPropertyAccessorRenderer.kt @@ -0,0 +1,38 @@ +/* + * 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.FirProperty +import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField + +class FirPropertyAccessorRenderer { + + internal lateinit var components: FirRendererComponents + private val printer get() = components.printer + private val visitor get() = components.visitor + + fun render(property: FirProperty) { + printer.println() + printer.pushIndent() + + if (property.hasExplicitBackingField) { + property.backingField?.accept(visitor) + printer.println() + } + + property.getter?.accept(visitor) + if (property.getter?.body == null) { + printer.println() + } + if (property.isVar) { + property.setter?.accept(visitor) + if (property.setter?.body == null) { + printer.println() + } + } + printer.popIndent() + } +} 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 821f703818b..d216235fb55 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 @@ -39,6 +39,7 @@ class FirRenderer private constructor( private val declarationRenderer: FirDeclarationRenderer, private val modifierRenderer: FirModifierRenderer, private val packageDirectiveRenderer: FirPackageDirectiveRenderer?, + private val propertyAccessorRenderer: FirPropertyAccessorRenderer?, private val typeRenderer: ConeTypeRenderer, private val valueParameterRenderer: FirValueParameterRenderer, ) : FirPrinter(builder) { @@ -54,6 +55,7 @@ class FirRenderer private constructor( components.declarationRenderer = declarationRenderer components.modifierRenderer = modifierRenderer components.packageDirectiveRenderer = packageDirectiveRenderer + components.propertyAccessorRenderer = propertyAccessorRenderer components.typeRenderer = typeRenderer components.valueParameterRenderer = valueParameterRenderer @Suppress("LeakingThis") @@ -65,6 +67,7 @@ class FirRenderer private constructor( declarationRenderer.components = components modifierRenderer.components = components packageDirectiveRenderer?.components = components + propertyAccessorRenderer?.components = components typeRenderer.builder = builder valueParameterRenderer.components = components } @@ -84,6 +87,7 @@ class FirRenderer private constructor( FirDeclarationRenderer(), FirAllModifierRenderer(), packageDirectiveRenderer = null, + FirPropertyAccessorRenderer(), ConeTypeRendererForDebugging(), FirValueParameterRenderer(), ) @@ -98,12 +102,14 @@ class FirRenderer private constructor( declarationRenderer: FirDeclarationRenderer = this.declarationRenderer, 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(), annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer, - declarationRenderer, modifierRenderer, packageDirectiveRenderer, typeRenderer, valueParameterRenderer + declarationRenderer, modifierRenderer, packageDirectiveRenderer, + propertyAccessorRenderer, typeRenderer, valueParameterRenderer ) fun renderElementAsString(element: FirElement): String { @@ -133,6 +139,8 @@ class FirRenderer private constructor( override var packageDirectiveRenderer: FirPackageDirectiveRenderer? = null + override var propertyAccessorRenderer: FirPropertyAccessorRenderer? = null + override lateinit var callArgumentsRenderer: FirCallArgumentsRenderer override lateinit var classMemberRenderer: FirClassMemberRenderer @@ -152,7 +160,6 @@ class FirRenderer private constructor( data class RenderMode( val renderCallableFqNames: Boolean, - val renderPropertyAccessors: Boolean = true, ) { companion object { val Normal = RenderMode( @@ -162,11 +169,6 @@ class FirRenderer private constructor( val WithFqNames = RenderMode( renderCallableFqNames = true, ) - - val NoBodies = RenderMode( - renderCallableFqNames = false, - renderPropertyAccessors = false, - ) } } @@ -401,26 +403,7 @@ class FirRenderer private constructor( override fun visitProperty(property: FirProperty) { visitVariable(property) if (property.isLocal) return - if (!mode.renderPropertyAccessors) return - println() - pushIndent() - - if (property.hasExplicitBackingField) { - property.backingField?.accept(this) - println() - } - - property.getter?.accept(this) - if (property.getter?.body == null) { - println() - } - if (property.isVar) { - property.setter?.accept(this) - if (property.setter?.body == null) { - println() - } - } - popIndent() + propertyAccessorRenderer?.render(property) } override fun visitBackingField(backingField: FirBackingField) { 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 a7d107da226..5b9114b44b6 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 @@ -15,6 +15,7 @@ internal interface FirRendererComponents { val classMemberRenderer: FirClassMemberRenderer val modifierRenderer: FirModifierRenderer val packageDirectiveRenderer: FirPackageDirectiveRenderer? + val propertyAccessorRenderer: FirPropertyAccessorRenderer? val typeRenderer: ConeTypeRenderer val valueParameterRenderer: FirValueParameterRenderer } \ No newline at end of file diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt index 890d1237a36..7a0a412481b 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt @@ -137,8 +137,9 @@ class FirScopeDumpHandler(testServices: TestServices) : FirAnalysisHandler(testS private fun SmartPrinter.printInfo(declaration: FirCallableDeclaration, scope: FirTypeScope, counter: SymbolCounter) { print("[${declaration.origin}]: ") - val renderedDeclaration = FirRenderer(mode = FirRenderer.RenderMode.NoBodies).with( - annotationRenderer = null, bodyRenderer = null, callArgumentsRenderer = FirCallNoArgumentsRenderer() + val renderedDeclaration = FirRenderer().with( + annotationRenderer = null, bodyRenderer = null, propertyAccessorRenderer = null, + callArgumentsRenderer = FirCallNoArgumentsRenderer() ).renderElementAsString(declaration).trim() print(renderedDeclaration) print(" from $scope")