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
|
bodyBuildingMode = BodyBuildingMode.NORMAL
|
||||||
).buildFirFile(ktFile)
|
).buildFirFile(ktFile)
|
||||||
|
|
||||||
val laziedFirFileDump = StringBuilder().also { FirRenderer(it).Visitor().visitFile(laziedFirFile) }.toString()
|
val laziedFirFileDump = FirRenderer().renderElementAsString(laziedFirFile)
|
||||||
val fullFirFileDump = StringBuilder().also { FirRenderer(it).Visitor().visitFile(fullFirFile) }.toString()
|
val fullFirFileDump = FirRenderer().renderElementAsString(fullFirFile)
|
||||||
|
|
||||||
TestCase.assertEquals(laziedFirFileDump, fullFirFileDump)
|
TestCase.assertEquals(laziedFirFileDump, fullFirFileDump)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -37,14 +37,14 @@ abstract class AbstractFirLoadBinariesTest : AbstractFirResolveWithSessionTestCa
|
|||||||
|
|
||||||
for (name in declarationNames) {
|
for (name in declarationNames) {
|
||||||
for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) {
|
for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) {
|
||||||
symbol.fir.accept(firRenderer.Visitor())
|
firRenderer.renderElementAsString(symbol.fir)
|
||||||
builder.appendLine()
|
builder.appendLine()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (name in declarationNames) {
|
for (name in declarationNames) {
|
||||||
val classLikeSymbol = provider.getClassLikeSymbolByClassId(ClassId.topLevel(packageFqName.child(name))) ?: continue
|
val classLikeSymbol = provider.getClassLikeSymbolByClassId(ClassId.topLevel(packageFqName.child(name))) ?: continue
|
||||||
classLikeSymbol.fir.accept(firRenderer.Visitor())
|
firRenderer.renderElementAsString(classLikeSymbol.fir)
|
||||||
builder.appendLine()
|
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 memberScope = javaClass.unsubstitutedScope(session, ScopeSession(), withForcedTypeCalculator = true)
|
||||||
|
|
||||||
val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession())
|
val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession())
|
||||||
val visitor = renderer.Visitor()
|
|
||||||
|
|
||||||
renderer.renderAnnotations(javaClass)
|
renderer.renderAnnotations(javaClass)
|
||||||
visitor.visitMemberDeclaration(javaClass)
|
renderer.renderMemberDeclarationClass(javaClass)
|
||||||
renderer.renderSupertypes(javaClass)
|
renderer.renderSupertypes(javaClass)
|
||||||
renderer.renderInBraces {
|
renderer.renderInBraces {
|
||||||
val renderedDeclarations = mutableListOf<FirDeclaration>()
|
val renderedDeclarations = mutableListOf<FirDeclaration>()
|
||||||
@@ -35,7 +34,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
|
|||||||
fun renderAndCache(symbol: FirCallableSymbol<*>) {
|
fun renderAndCache(symbol: FirCallableSymbol<*>) {
|
||||||
val enhanced = symbol.fir
|
val enhanced = symbol.fir
|
||||||
if (enhanced !in renderedDeclarations) {
|
if (enhanced !in renderedDeclarations) {
|
||||||
enhanced.accept(visitor, null)
|
renderer.renderElementAsString(enhanced)
|
||||||
renderer.newLine()
|
renderer.newLine()
|
||||||
renderedDeclarations += enhanced
|
renderedDeclarations += enhanced
|
||||||
}
|
}
|
||||||
@@ -56,7 +55,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
|
|||||||
is FirJavaField -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache)
|
is FirJavaField -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache)
|
||||||
is FirEnumEntry -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache)
|
is FirEnumEntry -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache)
|
||||||
else -> {
|
else -> {
|
||||||
declaration.accept(visitor, null)
|
renderer.renderElementAsString(declaration)
|
||||||
renderer.newLine()
|
renderer.newLine()
|
||||||
renderedDeclarations += declaration
|
renderedDeclarations += declaration
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -33,7 +33,7 @@ class TotalKotlinTest : AbstractRawFirBuilderTestCase() {
|
|||||||
DebugUtil.psiTreeToString(ktFile, false)
|
DebugUtil.psiTreeToString(ktFile, false)
|
||||||
} else {
|
} else {
|
||||||
val firFile = ktFile.toFirFile()
|
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)
|
DebugUtil.lightTreeToString(lightTree, false)
|
||||||
} else {
|
} else {
|
||||||
val firFile = converter.buildFirFile(text, sourceFile, linesMapping)
|
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
|
//psi
|
||||||
val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text.toString().trim()) as KtFile
|
val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text.toString().trim()) as KtFile
|
||||||
val firFileFromPsi = ktFile.toFirFile()
|
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>")
|
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
|
||||||
|
|
||||||
//light tree
|
//light tree
|
||||||
val firFileFromLightTree = lightTreeConverter.buildFirFile(text, KtIoFileSourceFile(file), linesMapping)
|
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>")
|
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
|
||||||
|
|
||||||
return@compareBase treeFromLightTree == treeFromPsi
|
return@compareBase treeFromLightTree == treeFromPsi
|
||||||
@@ -104,7 +104,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
|
|||||||
//psi
|
//psi
|
||||||
val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile
|
val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile
|
||||||
val firFileFromPsi = ktFile.toFirFile()
|
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("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
|
||||||
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
|
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
|
|||||||
KtInMemoryTextSourceFile(file.name, file.path, text),
|
KtInMemoryTextSourceFile(file.name, file.path, text),
|
||||||
text.toSourceLinesMapping()
|
text.toSourceLinesMapping()
|
||||||
)
|
)
|
||||||
val treeFromLightTree = StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFileFromLightTree) }.toString()
|
val treeFromLightTree = FirRenderer().renderElementAsString(firFileFromLightTree)
|
||||||
.replace("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
|
.replace("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
|
||||||
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
|
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ abstract class AbstractRawFirBuilderLazyBodiesTestCase : AbstractRawFirBuilderTe
|
|||||||
override fun doRawFirTest(filePath: String) {
|
override fun doRawFirTest(filePath: String) {
|
||||||
val file = createKtFile(filePath)
|
val file = createKtFile(filePath)
|
||||||
val firFile = file.toFirFile(BodyBuildingMode.LAZY_BODIES)
|
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")
|
val expectedPath = filePath.replace(".kt", ".lazyBodies.txt")
|
||||||
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-4
@@ -65,9 +65,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase(
|
|||||||
protected open fun doRawFirTest(filePath: String) {
|
protected open fun doRawFirTest(filePath: String) {
|
||||||
val file = createKtFile(filePath)
|
val file = createKtFile(filePath)
|
||||||
val firFile = file.toFirFile(BodyBuildingMode.NORMAL)
|
val firFile = file.toFirFile(BodyBuildingMode.NORMAL)
|
||||||
val firFileDump = StringBuilder().also {
|
val firFileDump = FirRenderer(mode = FirRenderer.RenderMode.WithDeclarationAttributes).renderElementAsString(firFile)
|
||||||
FirRenderer(it, mode = FirRenderer.RenderMode.WithDeclarationAttributes).Visitor().visitFile(firFile)
|
|
||||||
}.toString()
|
|
||||||
val expectedPath = filePath.replace(".kt", ".txt")
|
val expectedPath = filePath.replace(".kt", ".txt")
|
||||||
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
||||||
}
|
}
|
||||||
@@ -193,7 +191,7 @@ private fun throwTwiceVisitingError(element: FirElement) {
|
|||||||
if (psiParent is KtPropertyDelegate || psiParent?.parent is KtPropertyDelegate) return
|
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")
|
throw AssertionError("FirElement ${element.javaClass} is visited twice: $elementDump")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -65,7 +65,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() {
|
|||||||
time += measureNanoTime {
|
time += measureNanoTime {
|
||||||
firFile = ktFile.toFirFile()
|
firFile = ktFile.toFirFile()
|
||||||
}
|
}
|
||||||
totalLength += StringBuilder().also { FirRenderer(it).Visitor().visitFile(firFile) }.length
|
totalLength += FirRenderer().renderElementAsString(firFile).length
|
||||||
counter++
|
counter++
|
||||||
firFile.accept(object : FirVisitorVoid() {
|
firFile.accept(object : FirVisitorVoid() {
|
||||||
override fun visitElement(element: FirElement) {
|
override fun visitElement(element: FirElement) {
|
||||||
|
|||||||
+1
-6
@@ -51,12 +51,7 @@ fun CFGNode<*>.render(): String =
|
|||||||
is ConstExpressionNode -> "Const: ${fir.render()}"
|
is ConstExpressionNode -> "Const: ${fir.render()}"
|
||||||
is VariableDeclarationNode ->
|
is VariableDeclarationNode ->
|
||||||
"Variable declaration: ${
|
"Variable declaration: ${
|
||||||
buildString {
|
FirRenderer(mode = CfgRenderMode).renderAsCallableDeclarationString(fir)
|
||||||
FirRenderer(
|
|
||||||
this,
|
|
||||||
CfgRenderMode
|
|
||||||
).Visitor().visitCallableDeclaration(fir)
|
|
||||||
}
|
|
||||||
}"
|
}"
|
||||||
|
|
||||||
is VariableAssignmentNode -> "Assignment: ${fir.lValue.render(CfgRenderMode)}"
|
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 {
|
fun FirElement.renderWithType(mode: FirRenderer.RenderMode = FirRenderer.RenderMode.Normal): String = buildString {
|
||||||
append(this@renderWithType)
|
append(this@renderWithType)
|
||||||
append(": ")
|
append(": ")
|
||||||
this@renderWithType.accept(FirRenderer(this, mode).Visitor())
|
FirRenderer(this, mode).renderElementAsString(this@renderWithType)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirElement.render(mode: FirRenderer.RenderMode = FirRenderer.RenderMode.Normal): String =
|
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()
|
popIndent()
|
||||||
println(rightBrace)
|
println(rightBrace)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return printer.toString()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -40,7 +40,28 @@ open class FirRenderer private constructor(
|
|||||||
components: FirComponentsImpl
|
components: FirComponentsImpl
|
||||||
) : FirPrinter(builder) {
|
) : 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 {
|
private class FirComponentsImpl : FirRendererComponents {
|
||||||
override var annotationRenderer: FirAnnotationRenderer? = null
|
override var annotationRenderer: FirAnnotationRenderer? = null
|
||||||
@@ -54,13 +75,6 @@ open class FirRenderer private constructor(
|
|||||||
override lateinit var printer: FirPrinter
|
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(
|
data class RenderMode(
|
||||||
val renderCallArguments: Boolean,
|
val renderCallArguments: Boolean,
|
||||||
val renderCallableFqNames: Boolean,
|
val renderCallableFqNames: Boolean,
|
||||||
@@ -334,7 +348,7 @@ open class FirRenderer private constructor(
|
|||||||
rValue.accept(visitor)
|
rValue.accept(visitor)
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class Visitor : FirVisitorVoid() {
|
inner class Visitor internal constructor() : FirVisitorVoid() {
|
||||||
|
|
||||||
override fun visitElement(element: FirElement) {
|
override fun visitElement(element: FirElement) {
|
||||||
element.acceptChildren(this)
|
element.acceptChildren(this)
|
||||||
|
|||||||
+1
-1
@@ -39,7 +39,7 @@ class FirDumpHandler(
|
|||||||
|
|
||||||
val renderer = FirRendererWithGeneratedDeclarations(info.session, builderForModule)
|
val renderer = FirRendererWithGeneratedDeclarations(info.session, builderForModule)
|
||||||
allFiles.forEach {
|
allFiles.forEach {
|
||||||
it.accept(renderer.Visitor())
|
renderer.renderElementAsString(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,9 @@ abstract class AbstractKtDiagnosticsTest : AbstractFirBaseDiagnosticsTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun checkFir(testDataFile: File, firFiles: List<FirFile>) {
|
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")
|
val expectedPath = testDataFile.absolutePath.replace(".kt", ".txt")
|
||||||
KotlinTestUtils.assertEqualsToFile(
|
KotlinTestUtils.assertEqualsToFile(
|
||||||
File(expectedPath),
|
File(expectedPath),
|
||||||
|
|||||||
Reference in New Issue
Block a user