From 089044e5b0089c7f5084ae2f7a7d40cc1ab3fe0e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 6 Jul 2022 13:24:18 +0200 Subject: [PATCH] FirRenderer: get rid of direct Visitor usages --- .../AbstractFirLazyBodiesCalculatorTest.kt | 4 +-- .../kotlin/fir/AbstractFirLoadBinariesTest.kt | 4 +-- .../kotlin/fir/java/JavaClassRendering.kt | 7 ++-- .../kotlin/fir/lightTree/TotalKotlinTest.kt | 4 +-- .../fir/lightTree/compare/TreesCompareTest.kt | 8 ++--- ...AbstractRawFirBuilderLazyBodiesTestCase.kt | 2 +- .../builder/AbstractRawFirBuilderTestCase.kt | 6 ++-- .../RawFirBuilderTotalKotlinTestCase.kt | 2 +- .../fir/resolve/dfa/cfg/CFGNodeRenderer.kt | 7 +--- .../src/org/jetbrains/kotlin/fir/Utils.kt | 4 +-- .../kotlin/fir/renderer/FirPrinter.kt | 4 +++ .../kotlin/fir/renderer/FirRenderer.kt | 32 +++++++++++++------ .../frontend/fir/handlers/FirDumpHandler.kt | 2 +- .../kotlin/fir/AbstractFirDiagnosticTest.kt | 4 ++- 14 files changed, 51 insertions(+), 39 deletions(-) diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt index 648f74303ef..6f3093d3ac7 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt @@ -52,8 +52,8 @@ abstract class AbstractFirLazyBodiesCalculatorTest : AbstractLowLevelApiSingleFi bodyBuildingMode = BodyBuildingMode.NORMAL ).buildFirFile(ktFile) - val laziedFirFileDump = StringBuilder().also { FirRenderer(it).Visitor().visitFile(laziedFirFile) }.toString() - val fullFirFileDump = StringBuilder().also { FirRenderer(it).Visitor().visitFile(fullFirFile) }.toString() + val laziedFirFileDump = FirRenderer().renderElementAsString(laziedFirFile) + val fullFirFileDump = FirRenderer().renderElementAsString(fullFirFile) TestCase.assertEquals(laziedFirFileDump, fullFirFileDump) } diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt b/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt index 0ef61f6f044..3ed4da29718 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt @@ -37,14 +37,14 @@ abstract class AbstractFirLoadBinariesTest : AbstractFirResolveWithSessionTestCa for (name in declarationNames) { for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) { - symbol.fir.accept(firRenderer.Visitor()) + firRenderer.renderElementAsString(symbol.fir) builder.appendLine() } } for (name in declarationNames) { val classLikeSymbol = provider.getClassLikeSymbolByClassId(ClassId.topLevel(packageFqName.child(name))) ?: continue - classLikeSymbol.fir.accept(firRenderer.Visitor()) + firRenderer.renderElementAsString(classLikeSymbol.fir) builder.appendLine() } diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt b/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt index 19b0693aee1..d8dc9deaa52 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt @@ -24,10 +24,9 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir val memberScope = javaClass.unsubstitutedScope(session, ScopeSession(), withForcedTypeCalculator = true) val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession()) - val visitor = renderer.Visitor() renderer.renderAnnotations(javaClass) - visitor.visitMemberDeclaration(javaClass) + renderer.renderMemberDeclarationClass(javaClass) renderer.renderSupertypes(javaClass) renderer.renderInBraces { val renderedDeclarations = mutableListOf() @@ -35,7 +34,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir fun renderAndCache(symbol: FirCallableSymbol<*>) { val enhanced = symbol.fir if (enhanced !in renderedDeclarations) { - enhanced.accept(visitor, null) + renderer.renderElementAsString(enhanced) renderer.newLine() renderedDeclarations += enhanced } @@ -56,7 +55,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir is FirJavaField -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache) is FirEnumEntry -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache) else -> { - declaration.accept(visitor, null) + renderer.renderElementAsString(declaration) renderer.newLine() renderedDeclarations += declaration } diff --git a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt index dab5adf9b49..ce8e0464fac 100644 --- a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt +++ b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt @@ -33,7 +33,7 @@ class TotalKotlinTest : AbstractRawFirBuilderTestCase() { DebugUtil.psiTreeToString(ktFile, false) } else { val firFile = ktFile.toFirFile() - StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFile) }.toString() + FirRenderer().renderElementAsString(firFile) } } @@ -46,7 +46,7 @@ class TotalKotlinTest : AbstractRawFirBuilderTestCase() { DebugUtil.lightTreeToString(lightTree, false) } else { val firFile = converter.buildFirFile(text, sourceFile, linesMapping) - StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFile) }.toString() + FirRenderer().renderElementAsString(firFile) } } diff --git a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt index 479f589a289..26b8e904ba8 100644 --- a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt +++ b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt @@ -72,12 +72,12 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { //psi val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text.toString().trim()) as KtFile val firFileFromPsi = ktFile.toFirFile() - val treeFromPsi = StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFileFromPsi) }.toString() + val treeFromPsi = FirRenderer().renderElementAsString(firFileFromPsi) .replace("".toRegex(), "") //light tree val firFileFromLightTree = lightTreeConverter.buildFirFile(text, KtIoFileSourceFile(file), linesMapping) - val treeFromLightTree = StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFileFromLightTree) }.toString() + val treeFromLightTree = FirRenderer().renderElementAsString(firFileFromLightTree) .replace("".toRegex(), "") return@compareBase treeFromLightTree == treeFromPsi @@ -104,7 +104,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { //psi val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile val firFileFromPsi = ktFile.toFirFile() - val treeFromPsi = StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFileFromPsi) }.toString() + val treeFromPsi = FirRenderer().renderElementAsString(firFileFromPsi) .replace("".toRegex(), "") .replace("".toRegex(), "") @@ -115,7 +115,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { KtInMemoryTextSourceFile(file.name, file.path, text), text.toSourceLinesMapping() ) - val treeFromLightTree = StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFileFromLightTree) }.toString() + val treeFromLightTree = FirRenderer().renderElementAsString(firFileFromLightTree) .replace("".toRegex(), "") .replace("".toRegex(), "") diff --git a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderLazyBodiesTestCase.kt b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderLazyBodiesTestCase.kt index f2046e4be72..10eec92d126 100644 --- a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderLazyBodiesTestCase.kt +++ b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderLazyBodiesTestCase.kt @@ -13,7 +13,7 @@ abstract class AbstractRawFirBuilderLazyBodiesTestCase : AbstractRawFirBuilderTe override fun doRawFirTest(filePath: String) { val file = createKtFile(filePath) val firFile = file.toFirFile(BodyBuildingMode.LAZY_BODIES) - val firFileDump = StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFile) }.toString() + val firFileDump = FirRenderer().renderElementAsString(firFile) val expectedPath = filePath.replace(".kt", ".lazyBodies.txt") KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump) } diff --git a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt index 01b6821292f..67db1b6c65f 100644 --- a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt +++ b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt @@ -65,9 +65,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( protected open fun doRawFirTest(filePath: String) { val file = createKtFile(filePath) val firFile = file.toFirFile(BodyBuildingMode.NORMAL) - val firFileDump = StringBuilder().also { - FirRenderer(it, mode = FirRenderer.RenderMode.WithDeclarationAttributes).Visitor().visitFile(firFile) - }.toString() + val firFileDump = FirRenderer(mode = FirRenderer.RenderMode.WithDeclarationAttributes).renderElementAsString(firFile) val expectedPath = filePath.replace(".kt", ".txt") KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump) } @@ -193,7 +191,7 @@ private fun throwTwiceVisitingError(element: FirElement) { if (psiParent is KtPropertyDelegate || psiParent?.parent is KtPropertyDelegate) return } - val elementDump = StringBuilder().also { element.accept(FirRenderer(it).Visitor()) }.toString() + val elementDump = FirRenderer().renderElementAsString(element) throw AssertionError("FirElement ${element.javaClass} is visited twice: $elementDump") } diff --git a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt index 5d0eced06e5..91ecbf00c15 100644 --- a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt +++ b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt @@ -65,7 +65,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() { time += measureNanoTime { firFile = ktFile.toFirFile() } - totalLength += StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFile) }.length + totalLength += FirRenderer().renderElementAsString(firFile).length counter++ firFile.accept(object : FirVisitorVoid() { override fun visitElement(element: FirElement) { diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt index c17847a742e..6fb148a8c98 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt @@ -51,12 +51,7 @@ fun CFGNode<*>.render(): String = is ConstExpressionNode -> "Const: ${fir.render()}" is VariableDeclarationNode -> "Variable declaration: ${ - buildString { - FirRenderer( - this, - CfgRenderMode - ).Visitor().visitCallableDeclaration(fir) - } + FirRenderer(mode = CfgRenderMode).renderAsCallableDeclarationString(fir) }" is VariableAssignmentNode -> "Assignment: ${fir.lValue.render(CfgRenderMode)}" diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt index 19868578315..dc513baa3fc 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt @@ -83,8 +83,8 @@ val FirContextReceiver.labelName: Name? get() = customLabelName ?: labelNameFrom fun FirElement.renderWithType(mode: FirRenderer.RenderMode = FirRenderer.RenderMode.Normal): String = buildString { append(this@renderWithType) append(": ") - this@renderWithType.accept(FirRenderer(this, mode).Visitor()) + FirRenderer(this, mode).renderElementAsString(this@renderWithType) } fun FirElement.render(mode: FirRenderer.RenderMode = FirRenderer.RenderMode.Normal): String = - buildString { this@render.accept(FirRenderer(this, mode).Visitor()) } + FirRenderer(mode = mode).renderElementAsString(this) 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 d12bc2e5d3f..58dafdfbc9f 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 @@ -46,4 +46,8 @@ open class FirPrinter(builder: StringBuilder) { popIndent() println(rightBrace) } + + override fun toString(): String { + return printer.toString() + } } \ No newline at end of file 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 1a558cd2a25..a71e1002159 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 @@ -40,7 +40,28 @@ open class FirRenderer private constructor( components: FirComponentsImpl ) : FirPrinter(builder) { - constructor(builder: StringBuilder, mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl()) + companion object { + private val visibilitiesToRenderEffectiveSet = setOf( + Visibilities.Private, Visibilities.PrivateToThis, Visibilities.Internal, + Visibilities.Protected, Visibilities.Public, Visibilities.Local + ) + } + + constructor(builder: StringBuilder = StringBuilder(), mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl()) + + fun renderElementAsString(element: FirElement): String { + element.accept(visitor) + return toString() + } + + fun renderAsCallableDeclarationString(callableDeclaration: FirCallableDeclaration): String { + visitor.visitCallableDeclaration(callableDeclaration) + return toString() + } + + fun renderMemberDeclarationClass(firClass: FirClass) { + visitor.visitMemberDeclaration(firClass) + } private class FirComponentsImpl : FirRendererComponents { override var annotationRenderer: FirAnnotationRenderer? = null @@ -54,13 +75,6 @@ open class FirRenderer private constructor( override lateinit var printer: FirPrinter } - companion object { - private val visibilitiesToRenderEffectiveSet = setOf( - Visibilities.Private, Visibilities.PrivateToThis, Visibilities.Internal, - Visibilities.Protected, Visibilities.Public, Visibilities.Local - ) - } - data class RenderMode( val renderCallArguments: Boolean, val renderCallableFqNames: Boolean, @@ -334,7 +348,7 @@ open class FirRenderer private constructor( rValue.accept(visitor) } - inner class Visitor : FirVisitorVoid() { + inner class Visitor internal constructor() : FirVisitorVoid() { override fun visitElement(element: FirElement) { element.acceptChildren(this) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt index 5948de62d2c..ed6cdf9b891 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt @@ -39,7 +39,7 @@ class FirDumpHandler( val renderer = FirRendererWithGeneratedDeclarations(info.session, builderForModule) allFiles.forEach { - it.accept(renderer.Visitor()) + renderer.renderElementAsString(it) } } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt index 92531bb0217..d867d81c62f 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt @@ -103,7 +103,9 @@ abstract class AbstractKtDiagnosticsTest : AbstractFirBaseDiagnosticsTest() { } fun checkFir(testDataFile: File, firFiles: List) { - val firFileDump = StringBuilder().apply { firFiles.forEach { it.accept(FirRenderer(this).Visitor(), null) } }.toString() + val renderer = FirRenderer() + firFiles.forEach { renderer.renderElementAsString(it) } + val firFileDump = renderer.toString() val expectedPath = testDataFile.absolutePath.replace(".kt", ".txt") KotlinTestUtils.assertEqualsToFile( File(expectedPath),