FirRenderer: get rid of direct Visitor usages
This commit is contained in:
+2
-2
@@ -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)
|
||||
}
|
||||
|
||||
+2
-2
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
+3
-4
@@ -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
|
||||
}
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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>")
|
||||
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
+2
-4
@@ -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")
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-6
@@ -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)
|
||||
|
||||
+1
-1
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user