FirRenderer: get rid of direct Visitor usages

This commit is contained in:
Mikhail Glukhikh
2022-07-06 13:24:18 +02:00
committed by Space
parent 998ed8849f
commit 089044e5b0
14 changed files with 51 additions and 39 deletions
@@ -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)
}
@@ -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()
}
@@ -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<FirDeclaration>()
@@ -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
}
@@ -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)
}
}
@@ -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("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
//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("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
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("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
@@ -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("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
@@ -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)
}
@@ -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")
}
@@ -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) {
@@ -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)}"
@@ -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)
@@ -46,4 +46,8 @@ open class FirPrinter(builder: StringBuilder) {
popIndent()
println(rightBrace)
}
override fun toString(): String {
return printer.toString()
}
}
@@ -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)
@@ -39,7 +39,7 @@ class FirDumpHandler(
val renderer = FirRendererWithGeneratedDeclarations(info.session, builderForModule)
allFiles.forEach {
it.accept(renderer.Visitor())
renderer.renderElementAsString(it)
}
}
@@ -103,7 +103,9 @@ abstract class AbstractKtDiagnosticsTest : AbstractFirBaseDiagnosticsTest() {
}
fun checkFir(testDataFile: File, firFiles: List<FirFile>) {
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),