FIR renderer: introduce separate body & annotation renderers

This commit is contained in:
Mikhail Glukhikh
2022-07-04 10:12:50 +02:00
committed by Space
parent f64a7d3ff9
commit 591143be7c
6 changed files with 220 additions and 133 deletions
@@ -0,0 +1,55 @@
/*
* 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.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
open class FirAnnotationRenderer internal constructor(components: FirRendererComponents) : FirRendererComponents by components {
fun render(annotationContainer: FirAnnotationContainer) {
renderAnnotations(annotationContainer.annotations)
}
internal fun renderAnnotations(annotations: List<FirAnnotation>) {
for (annotation in annotations) {
renderAnnotation(annotation)
}
}
private fun renderAnnotation(annotation: FirAnnotation) {
printer.print("@")
annotation.useSiteTarget?.let {
printer.print(it.name)
printer.print(":")
}
annotation.annotationTypeRef.accept(visitor)
when (annotation) {
is FirAnnotationCall -> if (annotation.calleeReference.let { it is FirResolvedNamedReference || it is FirErrorNamedReference }) {
annotation.renderArgumentMapping()
} else {
visitor.visitCall(annotation)
}
else -> annotation.renderArgumentMapping()
}
if (annotation.useSiteTarget == AnnotationUseSiteTarget.FILE) {
printer.println()
} else {
printer.print(" ")
}
}
protected open fun FirAnnotation.renderArgumentMapping() {
printer.print("(")
if (argumentMapping.mapping.isNotEmpty()) {
printer.print("...")
}
printer.print(")")
}
}
@@ -0,0 +1,29 @@
/*
* 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.fir.FirElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.name.Name
class FirAnnotationWithArgumentsRenderer internal constructor(components: FirRendererComponents) : FirAnnotationRenderer(components) {
override fun FirAnnotation.renderArgumentMapping() {
printer.print("(")
argumentMapping.mapping.renderSeparated()
printer.print(")")
}
private fun Map<Name, FirElement>.renderSeparated() {
for ((index, element) in this.entries.withIndex()) {
val (name, argument) = element
if (index > 0) {
printer.print(", ")
}
printer.print("$name = ")
argument.accept(visitor)
}
}
}
@@ -0,0 +1,36 @@
/*
* 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.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock
class FirBodyRenderer internal constructor(components: FirRendererComponents) : FirRendererComponents by components {
fun render(function: FirFunction) {
renderBody(function.body)
}
fun renderBody(block: FirBlock?, additionalStatements: List<FirStatement> = emptyList()) {
if (block == null) return
when (block) {
is FirLazyBlock -> {
println(" { LAZY_BLOCK }")
}
else -> {
annotationRenderer?.render(block)
printer.renderInBraces {
for (statement in additionalStatements + block.statements) {
statement.accept(visitor)
printer.println()
}
}
}
}
}
}
@@ -12,7 +12,7 @@ abstract class FirPrinter internal constructor(builder: StringBuilder) {
private var lineBeginning = true private var lineBeginning = true
protected fun print(vararg objects: Any) { fun print(vararg objects: Any) {
if (lineBeginning) { if (lineBeginning) {
lineBeginning = false lineBeginning = false
printer.print(*objects) printer.print(*objects)
@@ -21,7 +21,7 @@ abstract class FirPrinter internal constructor(builder: StringBuilder) {
} }
} }
protected fun println(vararg objects: Any) { fun println(vararg objects: Any) {
print(*objects) print(*objects)
printer.printlnWithNoIndent() printer.printlnWithNoIndent()
lineBeginning = true lineBeginning = true
@@ -35,8 +35,15 @@ abstract class FirPrinter internal constructor(builder: StringBuilder) {
printer.popIndent() printer.popIndent()
} }
protected fun newLine() { fun newLine() {
println() println()
} }
fun renderInBraces(leftBrace: String = "{", rightBrace: String = "}", f: () -> Unit) {
println(" $leftBrace")
pushIndent()
f()
popIndent()
println(rightBrace)
}
} }
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.contracts.* import org.jetbrains.kotlin.fir.contracts.*
import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer
@@ -27,7 +26,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -36,7 +34,24 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.* import java.util.*
import kotlin.reflect.KClass import kotlin.reflect.KClass
open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode = RenderMode.Normal) : FirPrinter(builder) { open class FirRenderer private constructor(
builder: StringBuilder,
protected val mode: RenderMode,
components: FirComponentsImpl
) : FirPrinter(builder) {
constructor(builder: StringBuilder, mode: RenderMode = RenderMode.Normal) : this(builder, mode, FirComponentsImpl())
private class FirComponentsImpl : FirRendererComponents {
override var annotationRenderer: FirAnnotationRenderer? = null
override var bodyRenderer: FirBodyRenderer? = null
override lateinit var visitor: Visitor
override lateinit var printer: FirPrinter
}
companion object { companion object {
private val visibilitiesToRenderEffectiveSet = setOf( private val visibilitiesToRenderEffectiveSet = setOf(
Visibilities.Private, Visibilities.PrivateToThis, Visibilities.Internal, Visibilities.Private, Visibilities.PrivateToThis, Visibilities.Internal,
@@ -133,6 +148,21 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
private val visitor = Visitor() private val visitor = Visitor()
private val annotationRenderer = when {
mode.renderAnnotation ->
if (mode.renderCallArguments) FirAnnotationWithArgumentsRenderer(components) else FirAnnotationRenderer(components)
else ->
null
}
private val bodyRenderer = if (mode.renderBodies) FirBodyRenderer(components) else null
init {
components.visitor = visitor
components.annotationRenderer = annotationRenderer
components.bodyRenderer = bodyRenderer
@Suppress("LeakingThis")
components.printer = this
}
private fun List<FirElement>.renderSeparated() { private fun List<FirElement>.renderSeparated() {
for ((index, element) in this.withIndex()) { for ((index, element) in this.withIndex()) {
@@ -169,17 +199,6 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
print(")") print(")")
} }
fun renderAnnotations(annotationContainer: FirAnnotationContainer) {
annotationContainer.annotations.renderAnnotations()
}
private fun List<FirAnnotation>.renderAnnotations() {
if (!mode.renderAnnotation) return
for (annotation in this) {
visitor.visitAnnotation(annotation)
}
}
private fun Variance.renderVariance() { private fun Variance.renderVariance() {
label.let { label.let {
print(it) print(it)
@@ -292,14 +311,6 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
} }
fun renderInBraces(leftBrace: String = "{", rightBrace: String = "}", f: () -> Unit) {
println(" $leftBrace")
pushIndent()
f()
popIndent()
println(rightBrace)
}
fun renderSupertypes(regularClass: FirRegularClass) { fun renderSupertypes(regularClass: FirRegularClass) {
if (regularClass.superTypeRefs.isNotEmpty()) { if (regularClass.superTypeRefs.isNotEmpty()) {
print(" : ") print(" : ")
@@ -313,35 +324,6 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
} }
private fun FirBlock.renderBody(additionalStatements: List<FirStatement> = emptyList()) {
if (!mode.renderBodies) return
when (this) {
is FirLazyBlock -> {
println(" { LAZY_BLOCK }")
}
else -> {
renderAnnotations(this)
renderInBraces {
for (statement in additionalStatements + statements) {
statement.accept(visitor)
println()
}
}
}
}
}
private fun Map<Name, FirElement>.renderSeparated() {
for ((index, element) in this.entries.withIndex()) {
val (name, argument) = element
if (index > 0) {
print(", ")
}
print("$name = ")
argument.accept(visitor)
}
}
private fun visitAssignment(operation: FirOperation, rValue: FirExpression) { private fun visitAssignment(operation: FirOperation, rValue: FirExpression) {
print(operation.operator) print(operation.operator)
print(" ") print(" ")
@@ -357,13 +339,16 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
override fun visitFile(file: FirFile) { override fun visitFile(file: FirFile) {
println("FILE: ${file.name}") println("FILE: ${file.name}")
pushIndent() pushIndent()
visitElement(file) annotationRenderer?.render(file)
visitPackageDirective(file.packageDirective)
file.imports.forEach { it.accept(this) }
file.declarations.forEach { it.accept(this) }
popIndent() popIndent()
} }
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) { override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
renderContexts(callableDeclaration.contextReceivers) renderContexts(callableDeclaration.contextReceivers)
callableDeclaration.annotations.renderAnnotations() annotationRenderer?.render(callableDeclaration)
visitMemberDeclaration(callableDeclaration) visitMemberDeclaration(callableDeclaration)
val receiverType = callableDeclaration.receiverTypeRef val receiverType = callableDeclaration.receiverTypeRef
print(" ") print(" ")
@@ -518,7 +503,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
override fun visitRegularClass(regularClass: FirRegularClass) { override fun visitRegularClass(regularClass: FirRegularClass) {
renderContexts(regularClass.contextReceivers) renderContexts(regularClass.contextReceivers)
regularClass.annotations.renderAnnotations() annotationRenderer?.render(regularClass)
visitMemberDeclaration(regularClass) visitMemberDeclaration(regularClass)
renderSupertypes(regularClass) renderSupertypes(regularClass)
renderClassDeclarations(regularClass) renderClassDeclarations(regularClass)
@@ -537,7 +522,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) {
anonymousObject.annotations.renderAnnotations() annotationRenderer?.render(anonymousObject)
print("object : ") print("object : ")
anonymousObject.superTypeRefs.renderSeparated() anonymousObject.superTypeRefs.renderSeparated()
anonymousObject.declarations.renderDeclarations() anonymousObject.declarations.renderDeclarations()
@@ -598,14 +583,14 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) {
visitCallableDeclaration(simpleFunction) visitCallableDeclaration(simpleFunction)
simpleFunction.body?.renderBody() bodyRenderer?.render(simpleFunction)
if (simpleFunction.body == null) { if (simpleFunction.body == null) {
println() println()
} }
} }
override fun visitConstructor(constructor: FirConstructor) { override fun visitConstructor(constructor: FirConstructor) {
constructor.annotations.renderAnnotations() annotationRenderer?.render(constructor)
// we can't access session.effectiveVisibilityResolver from here! // we can't access session.effectiveVisibilityResolver from here!
// print(constructor.visibility.asString(constructor.getEffectiveVisibility(...)) + " ") // print(constructor.visibility.asString(constructor.getEffectiveVisibility(...)) + " ")
print(constructor.visibility.asString() + " ") print(constructor.visibility.asString() + " ")
@@ -638,12 +623,12 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
println() println()
} }
} }
body?.renderBody(listOfNotNull<FirStatement>(delegatedConstructor)) bodyRenderer?.renderBody(body, listOfNotNull<FirStatement>(delegatedConstructor))
} }
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) { override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) {
propertyAccessor.renderDeclarationData() propertyAccessor.renderDeclarationData()
propertyAccessor.annotations.renderAnnotations() annotationRenderer?.render(propertyAccessor)
print(propertyAccessor.visibility.asString() + " ") print(propertyAccessor.visibility.asString() + " ")
print(if (propertyAccessor.isInline) "inline " else "") print(if (propertyAccessor.isInline) "inline " else "")
print(if (propertyAccessor.isExternal) "external " else "") print(if (propertyAccessor.isExternal) "external " else "")
@@ -652,7 +637,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
print(": ") print(": ")
propertyAccessor.returnTypeRef.accept(this) propertyAccessor.returnTypeRef.accept(this)
propertyAccessor.renderContractDescription() propertyAccessor.renderContractDescription()
propertyAccessor.body?.renderBody() bodyRenderer?.render(propertyAccessor)
} }
override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) { override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) {
@@ -661,7 +646,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) { override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
anonymousFunction.renderDeclarationData() anonymousFunction.renderDeclarationData()
anonymousFunction.annotations.renderAnnotations() annotationRenderer?.render(anonymousFunction)
val label = anonymousFunction.label val label = anonymousFunction.label
if (label != null) { if (label != null) {
print("${label.name}@") print("${label.name}@")
@@ -688,27 +673,27 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
print("> ") print("> ")
if (mode.renderLambdaBodies) { if (mode.renderLambdaBodies) {
anonymousFunction.body?.renderBody() bodyRenderer?.render(anonymousFunction)
} }
} }
override fun visitFunction(function: FirFunction) { override fun visitFunction(function: FirFunction) {
function.valueParameters.renderParameters() function.valueParameters.renderParameters()
visitDeclaration(function) visitDeclaration(function)
function.body?.renderBody() bodyRenderer?.render(function)
} }
override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer) { override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer) {
print("init") print("init")
anonymousInitializer.body?.renderBody() bodyRenderer?.renderBody(anonymousInitializer.body)
} }
override fun visitBlock(block: FirBlock) { override fun visitBlock(block: FirBlock) {
block.renderBody() bodyRenderer?.renderBody(block)
} }
override fun visitTypeAlias(typeAlias: FirTypeAlias) { override fun visitTypeAlias(typeAlias: FirTypeAlias) {
typeAlias.annotations.renderAnnotations() annotationRenderer?.render(typeAlias)
visitMemberDeclaration(typeAlias) visitMemberDeclaration(typeAlias)
print(" = ") print(" = ")
typeAlias.expandedTypeRef.accept(this) typeAlias.expandedTypeRef.accept(this)
@@ -716,7 +701,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitTypeParameter(typeParameter: FirTypeParameter) { override fun visitTypeParameter(typeParameter: FirTypeParameter) {
typeParameter.annotations.renderAnnotations() annotationRenderer?.render(typeParameter)
if (typeParameter.isReified) { if (typeParameter.isReified) {
print("reified ") print("reified ")
} }
@@ -749,7 +734,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
override fun visitValueParameter(valueParameter: FirValueParameter) { override fun visitValueParameter(valueParameter: FirValueParameter) {
valueParameter.renderDeclarationData() valueParameter.renderDeclarationData()
valueParameter.annotations.renderAnnotations() annotationRenderer?.render(valueParameter)
if (valueParameter.isCrossinline) { if (valueParameter.isCrossinline) {
print("crossinline ") print("crossinline ")
} }
@@ -786,7 +771,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitReturnExpression(returnExpression: FirReturnExpression) { override fun visitReturnExpression(returnExpression: FirReturnExpression) {
returnExpression.annotations.renderAnnotations() annotationRenderer?.render(returnExpression)
print("^") print("^")
val target = returnExpression.target val target = returnExpression.target
val labeledElement = target.labeledElement val labeledElement = target.labeledElement
@@ -814,7 +799,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitWhenExpression(whenExpression: FirWhenExpression) { override fun visitWhenExpression(whenExpression: FirWhenExpression) {
whenExpression.annotations.renderAnnotations() annotationRenderer?.render(whenExpression)
print("when (") print("when (")
val subjectVariable = whenExpression.subjectVariable val subjectVariable = whenExpression.subjectVariable
if (subjectVariable != null) { if (subjectVariable != null) {
@@ -836,7 +821,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitTryExpression(tryExpression: FirTryExpression) { override fun visitTryExpression(tryExpression: FirTryExpression) {
tryExpression.annotations.renderAnnotations() annotationRenderer?.render(tryExpression)
print("try") print("try")
tryExpression.tryBlock.accept(this) tryExpression.tryBlock.accept(this)
for (catchClause in tryExpression.catches) { for (catchClause in tryExpression.catches) {
@@ -898,20 +883,20 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitBreakExpression(breakExpression: FirBreakExpression) { override fun visitBreakExpression(breakExpression: FirBreakExpression) {
breakExpression.annotations.renderAnnotations() annotationRenderer?.render(breakExpression)
print("break") print("break")
visitLoopJump(breakExpression) visitLoopJump(breakExpression)
} }
override fun visitContinueExpression(continueExpression: FirContinueExpression) { override fun visitContinueExpression(continueExpression: FirContinueExpression) {
continueExpression.annotations.renderAnnotations() annotationRenderer?.render(continueExpression)
print("continue") print("continue")
visitLoopJump(continueExpression) visitLoopJump(continueExpression)
} }
override fun visitExpression(expression: FirExpression) { override fun visitExpression(expression: FirExpression) {
if (expression !is FirLazyExpression) { if (expression !is FirLazyExpression) {
expression.annotations.renderAnnotations() annotationRenderer?.render(expression)
} }
print( print(
when (expression) { when (expression) {
@@ -926,7 +911,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>) { override fun <T> visitConstExpression(constExpression: FirConstExpression<T>) {
constExpression.annotations.renderAnnotations() annotationRenderer?.render(constExpression)
val kind = constExpression.kind val kind = constExpression.kind
val value = constExpression.value val value = constExpression.value
print("$kind(") print("$kind(")
@@ -1000,44 +985,6 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
print(")") print(")")
} }
override fun visitAnnotationCall(annotationCall: FirAnnotationCall) {
visitAnnotation(annotationCall)
}
override fun visitAnnotation(annotation: FirAnnotation) {
print("@")
annotation.useSiteTarget?.let {
print(it.name)
print(":")
}
annotation.annotationTypeRef.accept(this)
when (annotation) {
is FirAnnotationCall -> if (annotation.calleeReference.let { it is FirResolvedNamedReference || it is FirErrorNamedReference }) {
annotation.renderArgumentMapping()
} else {
visitCall(annotation)
}
else -> annotation.renderArgumentMapping()
}
if (annotation.useSiteTarget == AnnotationUseSiteTarget.FILE) {
println()
} else {
print(" ")
}
}
private fun FirAnnotation.renderArgumentMapping() {
print("(")
if (mode.renderCallArguments) {
argumentMapping.mapping.renderSeparated()
} else {
if (argumentMapping.mapping.isNotEmpty()) {
print("...")
}
}
print(")")
}
override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
val dispatchReceiver = delegatedConstructorCall.dispatchReceiver val dispatchReceiver = delegatedConstructorCall.dispatchReceiver
if (dispatchReceiver !is FirNoReceiverExpression) { if (dispatchReceiver !is FirNoReceiverExpression) {
@@ -1055,12 +1002,12 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitTypeRef(typeRef: FirTypeRef) { override fun visitTypeRef(typeRef: FirTypeRef) {
typeRef.annotations.renderAnnotations() annotationRenderer?.render(typeRef)
visitElement(typeRef) visitElement(typeRef)
} }
override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef) { override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef) {
errorTypeRef.annotations.renderAnnotations() annotationRenderer?.render(errorTypeRef)
print("<ERROR TYPE REF: ${errorTypeRef.diagnostic.reason}>") print("<ERROR TYPE REF: ${errorTypeRef.diagnostic.reason}>")
} }
@@ -1075,7 +1022,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitDynamicTypeRef(dynamicTypeRef: FirDynamicTypeRef) { override fun visitDynamicTypeRef(dynamicTypeRef: FirDynamicTypeRef) {
dynamicTypeRef.annotations.renderAnnotations() annotationRenderer?.render(dynamicTypeRef)
print("<dynamic>") print("<dynamic>")
visitTypeRefWithNullability(dynamicTypeRef) visitTypeRefWithNullability(dynamicTypeRef)
} }
@@ -1087,7 +1034,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
print(")") print(")")
} }
functionTypeRef.annotations.dropExtensionFunctionAnnotation().renderAnnotations() annotationRenderer?.renderAnnotations(functionTypeRef.annotations.dropExtensionFunctionAnnotation())
print("( ") print("( ")
if (functionTypeRef.isSuspend) { if (functionTypeRef.isSuspend) {
print("suspend ") print("suspend ")
@@ -1116,7 +1063,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitUserTypeRef(userTypeRef: FirUserTypeRef) { override fun visitUserTypeRef(userTypeRef: FirUserTypeRef) {
userTypeRef.annotations.renderAnnotations() annotationRenderer?.render(userTypeRef)
if (userTypeRef.customRenderer) { if (userTypeRef.customRenderer) {
print(userTypeRef.toString()) print(userTypeRef.toString())
return return
@@ -1286,7 +1233,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) { override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) {
callableReferenceAccess.annotations.renderAnnotations() annotationRenderer?.render(callableReferenceAccess)
callableReferenceAccess.explicitReceiver?.accept(this) callableReferenceAccess.explicitReceiver?.accept(this)
if (callableReferenceAccess.hasQuestionMarkAtLHS && callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) { if (callableReferenceAccess.hasQuestionMarkAtLHS && callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) {
print("?") print("?")
@@ -1296,7 +1243,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) { override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
qualifiedAccessExpression.annotations.renderAnnotations() annotationRenderer?.render(qualifiedAccessExpression)
visitQualifiedAccess(qualifiedAccessExpression) visitQualifiedAccess(qualifiedAccessExpression)
qualifiedAccessExpression.calleeReference.accept(this) qualifiedAccessExpression.calleeReference.accept(this)
qualifiedAccessExpression.typeArguments.renderTypeArguments() qualifiedAccessExpression.typeArguments.renderTypeArguments()
@@ -1315,7 +1262,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment) { override fun visitVariableAssignment(variableAssignment: FirVariableAssignment) {
variableAssignment.annotations.renderAnnotations() annotationRenderer?.render(variableAssignment)
visitQualifiedAccess(variableAssignment) visitQualifiedAccess(variableAssignment)
variableAssignment.lValue.accept(this) variableAssignment.lValue.accept(this)
print(" ") print(" ")
@@ -1323,7 +1270,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitAugmentedArraySetCall(augmentedArraySetCall: FirAugmentedArraySetCall) { override fun visitAugmentedArraySetCall(augmentedArraySetCall: FirAugmentedArraySetCall) {
augmentedArraySetCall.annotations.renderAnnotations() annotationRenderer?.render(augmentedArraySetCall)
print("ArraySet:[") print("ArraySet:[")
augmentedArraySetCall.lhsGetCall.accept(this) augmentedArraySetCall.lhsGetCall.accept(this)
print(" ") print(" ")
@@ -1334,7 +1281,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitFunctionCall(functionCall: FirFunctionCall) { override fun visitFunctionCall(functionCall: FirFunctionCall) {
functionCall.annotations.renderAnnotations() annotationRenderer?.render(functionCall)
visitQualifiedAccess(functionCall) visitQualifiedAccess(functionCall)
functionCall.calleeReference.accept(this) functionCall.calleeReference.accept(this)
functionCall.typeArguments.renderTypeArguments() functionCall.typeArguments.renderTypeArguments()
@@ -1356,7 +1303,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitAssignmentOperatorStatement(assignmentOperatorStatement: FirAssignmentOperatorStatement) { override fun visitAssignmentOperatorStatement(assignmentOperatorStatement: FirAssignmentOperatorStatement) {
assignmentOperatorStatement.annotations.renderAnnotations() annotationRenderer?.render(assignmentOperatorStatement)
print(assignmentOperatorStatement.operation.operator) print(assignmentOperatorStatement.operation.operator)
print("(") print("(")
assignmentOperatorStatement.leftArgument.accept(visitor) assignmentOperatorStatement.leftArgument.accept(visitor)
@@ -1366,7 +1313,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall) { override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall) {
equalityOperatorCall.annotations.renderAnnotations() annotationRenderer?.render(equalityOperatorCall)
print(equalityOperatorCall.operation.operator) print(equalityOperatorCall.operation.operator)
visitCall(equalityOperatorCall) visitCall(equalityOperatorCall)
} }
@@ -1376,13 +1323,13 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitGetClassCall(getClassCall: FirGetClassCall) { override fun visitGetClassCall(getClassCall: FirGetClassCall) {
getClassCall.annotations.renderAnnotations() annotationRenderer?.render(getClassCall)
print("<getClass>") print("<getClass>")
visitCall(getClassCall) visitCall(getClassCall)
} }
override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) { override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) {
classReferenceExpression.annotations.renderAnnotations() annotationRenderer?.render(classReferenceExpression)
print("<getClass>") print("<getClass>")
print("(") print("(")
classReferenceExpression.classTypeRef.accept(this) classReferenceExpression.classTypeRef.accept(this)
@@ -1390,13 +1337,13 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall) { override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall) {
arrayOfCall.annotations.renderAnnotations() annotationRenderer?.render(arrayOfCall)
print("<implicitArrayOf>") print("<implicitArrayOf>")
visitCall(arrayOfCall) visitCall(arrayOfCall)
} }
override fun visitThrowExpression(throwExpression: FirThrowExpression) { override fun visitThrowExpression(throwExpression: FirThrowExpression) {
throwExpression.annotations.renderAnnotations() annotationRenderer?.render(throwExpression)
print("throw ") print("throw ")
throwExpression.exception.accept(this) throwExpression.exception.accept(this)
} }
@@ -1406,7 +1353,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) { override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) {
renderAnnotations(resolvedQualifier) annotationRenderer?.render(resolvedQualifier)
print("Q|") print("Q|")
val classId = resolvedQualifier.classId val classId = resolvedQualifier.classId
if (classId != null) { if (classId != null) {
@@ -0,0 +1,13 @@
/*
* 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
internal interface FirRendererComponents {
val visitor: FirRenderer.Visitor
val printer: FirPrinter
val annotationRenderer: FirAnnotationRenderer?
val bodyRenderer: FirBodyRenderer?
}