From 42b3adf33a450f2fb67cdad4e9c4c433e3764acc Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 8 Jul 2022 14:52:11 +0200 Subject: [PATCH] Extract separate ConeIdRenderer and get rid of FirRenderer.RenderMode --- .../api/fir/AbstractFirOnAirResolveTest.kt | 1 - .../AbstractPartialRawFirBuilderTestCase.kt | 3 +- ...stractInnerDeclarationsResolvePhaseTest.kt | 1 - .../diagnostics/FirDiagnosticRenderers.kt | 6 +-- .../kotlin/fir/renderer/ConeIdFullRenderer.kt | 19 ++++++++ ...ndererWithFqNames.kt => ConeIdRenderer.kt} | 12 +++-- .../renderer/ConeIdRendererForDebugging.kt | 19 ++++++++ .../fir/renderer/ConeIdShortRenderer.kt | 19 ++++++++ .../kotlin/fir/renderer/ConeTypeRenderer.kt | 12 +++-- .../renderer/ConeTypeRendererForDebugging.kt | 4 +- .../kotlin/fir/types/ConeTypeUtils.kt | 8 ++-- .../kotlin/fir/renderer/FirRenderer.kt | 45 ++++++------------- .../fir/renderer/FirRendererComponents.kt | 1 + 13 files changed, 93 insertions(+), 57 deletions(-) create mode 100644 compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdFullRenderer.kt rename compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/{ConeTypeRendererWithFqNames.kt => ConeIdRenderer.kt} (56%) create mode 100644 compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdRendererForDebugging.kt create mode 100644 compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdShortRenderer.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirOnAirResolveTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirOnAirResolveTest.kt index cd113464c04..b342ba5cfc5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirOnAirResolveTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirOnAirResolveTest.kt @@ -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.fir.renderer.FirDeclarationRendererWithResolvePhase 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.KtElement import org.jetbrains.kotlin.psi.KtFile diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt index 9d181e72faa..0cbddee8494 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.* 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.resolve.ScopeSession import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope @@ -126,7 +127,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF null ) - val firDump = FirRenderer(mode = FirRenderer.RenderMode.WithFqNames).renderElementAsString(firElement) + val firDump = FirRenderer().with(idRenderer = ConeIdFullRenderer()).renderElementAsString(firElement) JUnit5Assertions.assertEqualsToTestDataFileSibling(firDump) } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractInnerDeclarationsResolvePhaseTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractInnerDeclarationsResolvePhaseTest.kt index 6183e3617e4..c5a139b2915 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractInnerDeclarationsResolvePhaseTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractInnerDeclarationsResolvePhaseTest.kt @@ -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.renderer.FirDeclarationRendererWithResolvePhase 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.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestServices 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 48d3e161f12..d63fc911f3c 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.WithFqNames import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.* @@ -30,6 +29,7 @@ object FirDiagnosticRenderers { is FirClassLikeSymbol<*>, is FirCallableSymbol<*> -> FirRenderer().with( typeRenderer = ConeTypeRenderer(), + idRenderer = ConeIdShortRenderer(), classMemberRenderer = FirNoClassMemberRenderer(), bodyRenderer = null, propertyAccessorRenderer = null, @@ -103,8 +103,8 @@ object FirDiagnosticRenderers { val FQ_NAMES_IN_TYPES = Renderer { symbol: FirBasedSymbol<*> -> @OptIn(SymbolInternals::class) - FirRenderer(mode = WithFqNames).with( - annotationRenderer = null, bodyRenderer = null + FirRenderer().with( + annotationRenderer = null, bodyRenderer = null, idRenderer = ConeIdFullRenderer() ).renderElementAsString(symbol.fir) } diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdFullRenderer.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdFullRenderer.kt new file mode 100644 index 00000000000..eb469b2c8e1 --- /dev/null +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdFullRenderer.kt @@ -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) + } +} \ No newline at end of file diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererWithFqNames.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdRenderer.kt similarity index 56% rename from compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererWithFqNames.kt rename to compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdRenderer.kt index 50cc9d8aedc..fc7c724ee66 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererWithFqNames.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdRenderer.kt @@ -5,15 +5,13 @@ package org.jetbrains.kotlin.fir.renderer +import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId -open class ConeTypeRendererWithFqNames() : ConeTypeRenderer() { +abstract class ConeIdRenderer { - constructor(builder: StringBuilder) : this() { - this.builder = builder - } + lateinit var builder: StringBuilder - override fun ClassId.render() { - builder.append(asString()) - } + abstract fun renderClassId(classId: ClassId) + abstract fun renderCallableId(callableId: CallableId) } \ No newline at end of file diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdRendererForDebugging.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdRendererForDebugging.kt new file mode 100644 index 00000000000..8c8876b9853 --- /dev/null +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdRendererForDebugging.kt @@ -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) + } +} \ No newline at end of file diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdShortRenderer.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdShortRenderer.kt new file mode 100644 index 00000000000..f1268a91b1f --- /dev/null +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeIdShortRenderer.kt @@ -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) + } +} \ No newline at end of file diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt index 6013500745c..1a9b93e458b 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt @@ -7,16 +7,18 @@ package org.jetbrains.kotlin.fir.renderer import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.name.ClassId import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract open class ConeTypeRenderer() { lateinit var builder: StringBuilder + lateinit var idRenderer: ConeIdRenderer - constructor(builder: StringBuilder) : this() { + constructor(builder: StringBuilder, idRenderer: ConeIdRenderer) : this() { this.builder = builder + this.idRenderer = idRenderer + idRenderer.builder = builder } open fun renderAsPossibleFunctionType( @@ -137,7 +139,7 @@ open class ConeTypeRenderer() { } private fun ConeClassLikeType.render() { - lookupTag.classId.render() + idRenderer.renderClassId(lookupTag.classId) if (typeArguments.isEmpty()) return builder.append("<") for ((index, typeArgument) in typeArguments.withIndex()) { @@ -149,10 +151,6 @@ open class ConeTypeRenderer() { builder.append(">") } - protected open fun ClassId.render() { - builder.append(relativeClassName.asString()) - } - private fun ConeFlexibleType.render() { val lowerBound = lowerBound val upperBound = upperBound diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererForDebugging.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererForDebugging.kt index 394db4a3ffc..8f54eb16f33 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererForDebugging.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererForDebugging.kt @@ -8,10 +8,12 @@ package org.jetbrains.kotlin.fir.renderer import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeTypeProjection -class ConeTypeRendererForDebugging() : ConeTypeRendererWithFqNames() { +class ConeTypeRendererForDebugging() : ConeTypeRenderer() { constructor(builder: StringBuilder) : this() { this.builder = builder + this.idRenderer = ConeIdRendererForDebugging() + idRenderer.builder = builder } override fun renderAsPossibleFunctionType(type: ConeKotlinType, renderType: ConeTypeProjection.() -> Unit) { diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt index 23a77b615a0..44ef8ee0050 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt @@ -6,9 +6,7 @@ package org.jetbrains.kotlin.fir.types import org.jetbrains.kotlin.builtins.functions.FunctionClassKind -import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer -import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugging -import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererWithFqNames +import org.jetbrains.kotlin.fir.renderer.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.types.Variance @@ -128,13 +126,13 @@ fun ConeKotlinType.renderForDebugging(): String { fun ConeKotlinType.renderReadable(): String { val builder = StringBuilder() - ConeTypeRenderer(builder).render(this) + ConeTypeRenderer(builder, idRenderer = ConeIdShortRenderer()).render(this) return builder.toString() } fun ConeKotlinType.renderReadableWithFqNames(): String { val builder = StringBuilder() - ConeTypeRendererWithFqNames(builder).render(this) + ConeTypeRenderer(builder, idRenderer = ConeIdRendererForDebugging()).render(this) return builder.toString() } 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 a284ff426c9..b452cd7cee0 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 @@ -30,7 +30,6 @@ import java.util.* class FirRenderer private constructor( private val builder: StringBuilder, - private val mode: RenderMode, components: FirComponentsImpl, private val annotationRenderer: FirAnnotationRenderer?, private val bodyRenderer: FirBodyRenderer?, @@ -38,6 +37,7 @@ class FirRenderer private constructor( private val classMemberRenderer: FirClassMemberRenderer, private val contractRenderer: ConeContractRenderer?, private val declarationRenderer: FirDeclarationRenderer, + private val idRenderer: ConeIdRenderer, private val modifierRenderer: FirModifierRenderer, private val packageDirectiveRenderer: FirPackageDirectiveRenderer?, private val propertyAccessorRenderer: FirPropertyAccessorRenderer?, @@ -54,6 +54,7 @@ class FirRenderer private constructor( components.callArgumentsRenderer = callArgumentsRenderer components.classMemberRenderer = classMemberRenderer components.declarationRenderer = declarationRenderer + components.idRenderer = idRenderer components.modifierRenderer = modifierRenderer components.packageDirectiveRenderer = packageDirectiveRenderer components.propertyAccessorRenderer = propertyAccessorRenderer @@ -67,20 +68,20 @@ class FirRenderer private constructor( classMemberRenderer.components = components contractRenderer?.components = components declarationRenderer.components = components + idRenderer.builder = builder modifierRenderer.components = components packageDirectiveRenderer?.components = components propertyAccessorRenderer?.components = components typeRenderer.builder = builder + typeRenderer.idRenderer = idRenderer valueParameterRenderer.components = components } private constructor( builder: StringBuilder, - mode: RenderMode, components: FirComponentsImpl, ) : this( builder, - mode, components, FirAnnotationRenderer(), FirBodyRenderer(), @@ -88,6 +89,7 @@ class FirRenderer private constructor( FirClassMemberRenderer(), ConeContractRenderer(), FirDeclarationRenderer(), + ConeIdRendererForDebugging(), FirAllModifierRenderer(), packageDirectiveRenderer = null, FirPropertyAccessorRenderer(), @@ -95,7 +97,7 @@ class FirRenderer private constructor( FirValueParameterRenderer(), ) - constructor(builder: StringBuilder = StringBuilder(), mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl()) + constructor(builder: StringBuilder = StringBuilder()) : this(builder, FirComponentsImpl()) fun with( annotationRenderer: FirAnnotationRenderer? = this.annotationRenderer, @@ -104,16 +106,17 @@ class FirRenderer private constructor( classMemberRenderer: FirClassMemberRenderer = this.classMemberRenderer, contractRenderer: ConeContractRenderer? = this.contractRenderer, declarationRenderer: FirDeclarationRenderer = this.declarationRenderer, + idRenderer: ConeIdRenderer = this.idRenderer, 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(), + builder, FirComponentsImpl(), annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer, - contractRenderer, declarationRenderer, modifierRenderer, packageDirectiveRenderer, - propertyAccessorRenderer, typeRenderer, valueParameterRenderer + contractRenderer, declarationRenderer, idRenderer, modifierRenderer, + packageDirectiveRenderer, propertyAccessorRenderer, typeRenderer, valueParameterRenderer ) fun renderElementAsString(element: FirElement): String { @@ -153,6 +156,8 @@ class FirRenderer private constructor( override lateinit var declarationRenderer: FirDeclarationRenderer + override lateinit var idRenderer: ConeIdRenderer + override lateinit var modifierRenderer: FirModifierRenderer override lateinit var typeRenderer: ConeTypeRenderer @@ -164,20 +169,6 @@ class FirRenderer private constructor( 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.renderTypesSeparated() { for ((index, element) in this.withIndex()) { if (index > 0) { @@ -285,18 +276,10 @@ class FirRenderer private constructor( } when (callableDeclaration) { is FirSimpleFunction -> { - if (!mode.renderCallableFqNames) { - print(callableDeclaration.name) - } else { - print(callableDeclaration.symbol.callableId) - } + idRenderer.renderCallableId(callableDeclaration.symbol.callableId) } is FirVariable -> { - if (!mode.renderCallableFqNames) { - print(callableDeclaration.name) - } else { - print(callableDeclaration.symbol.callableId) - } + idRenderer.renderCallableId(callableDeclaration.symbol.callableId) } else -> {} } 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 6015bd958a2..390c8ff9a7c 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,6 +16,7 @@ internal interface FirRendererComponents { val callArgumentsRenderer: FirCallArgumentsRenderer val classMemberRenderer: FirClassMemberRenderer val contractRenderer: ConeContractRenderer? + val idRenderer: ConeIdRenderer val modifierRenderer: FirModifierRenderer val packageDirectiveRenderer: FirPackageDirectiveRenderer? val propertyAccessorRenderer: FirPropertyAccessorRenderer?