Extract separate FirCallArgumentsRenderer

This commit is contained in:
Mikhail Glukhikh
2022-07-08 11:25:15 +02:00
committed by Space
parent abfa33b200
commit 3fe35e6997
10 changed files with 96 additions and 73 deletions
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirGetClassCall
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.FirCallNoArgumentsRenderer
import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.resolve.toSymbol
@@ -161,7 +161,7 @@ internal class KtFirTypeProvider(
require(typeParameterSymbols.size == argumentTypes.size) {
val renderedSymbol = FirRenderer(mode = FirRenderer.RenderMode.NoBodies).with(
annotationRenderer = null, bodyRenderer = null
annotationRenderer = null, bodyRenderer = null, callArgumentsRenderer = FirCallNoArgumentsRenderer()
).renderElementAsString(symbol.fir)
"'$renderedSymbol' expects '${typeParameterSymbols.size}' type arguments " +
"but type '${this.renderForDebugging()}' has ${argumentTypes.size} type arguments."
@@ -14,10 +14,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer
import org.jetbrains.kotlin.fir.renderer.FirAnnotationRenderer
import org.jetbrains.kotlin.fir.renderer.FirNoClassMemberRenderer
import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.renderer.*
import org.jetbrains.kotlin.fir.renderer.FirRenderer.RenderMode.Companion.WithFqNames
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
@@ -36,8 +33,8 @@ object FirDiagnosticRenderers {
).with(
typeRenderer = ConeTypeRenderer(),
classMemberRenderer = FirNoClassMemberRenderer(),
annotationRenderer = FirAnnotationRenderer(),
bodyRenderer = null,
callArgumentsRenderer = FirCallNoArgumentsRenderer(),
).renderElementAsString(symbol.fir)
is FirTypeParameterSymbol -> symbol.name.asString()
else -> "???"
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.FirCallNoArgumentsRenderer
import org.jetbrains.kotlin.fir.renderer.FirRenderer
fun CFGNode<*>.render(): String =
@@ -133,12 +134,7 @@ fun CFGNode<*>.render(): String =
// NB: renderer has a state, so we have to create it each time
private val CfgRenderer
get() = FirRenderer(
mode = FirRenderer.RenderMode(
renderCallArguments = false,
renderCallableFqNames = false,
)
).with(annotationRenderer = null)
get() = FirRenderer().with(annotationRenderer = null, callArgumentsRenderer = FirCallNoArgumentsRenderer())
private fun FirFunction.name(): String = when (this) {
is FirSimpleFunction -> name.asString()
@@ -17,6 +17,7 @@ open class FirAnnotationRenderer {
internal lateinit var components: FirRendererComponents
protected val visitor get() = components.visitor
protected val printer get() = components.printer
protected val callArgumentsRenderer get() = components.callArgumentsRenderer
fun render(annotationContainer: FirAnnotationContainer) {
renderAnnotations(annotationContainer.annotations)
@@ -37,11 +38,12 @@ open class FirAnnotationRenderer {
annotation.annotationTypeRef.accept(visitor)
when (annotation) {
is FirAnnotationCall -> if (annotation.calleeReference.let { it is FirResolvedNamedReference || it is FirErrorNamedReference }) {
annotation.renderArgumentMapping()
callArgumentsRenderer.renderArgumentMapping(annotation.argumentMapping)
} else {
visitor.visitCall(annotation)
}
else -> annotation.renderArgumentMapping()
else -> callArgumentsRenderer.renderArgumentMapping(annotation.argumentMapping)
}
if (annotation.useSiteTarget == AnnotationUseSiteTarget.FILE) {
printer.println()
@@ -49,12 +51,4 @@ open class FirAnnotationRenderer {
printer.print(" ")
}
}
protected open fun FirAnnotation.renderArgumentMapping() {
printer.print("(")
if (argumentMapping.mapping.isNotEmpty()) {
printer.print("...")
}
printer.print(")")
}
}
@@ -6,16 +6,27 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.name.Name
class FirAnnotationWithArgumentsRenderer() : FirAnnotationRenderer() {
override fun FirAnnotation.renderArgumentMapping() {
open class FirCallArgumentsRenderer {
internal lateinit var components: FirRendererComponents
protected val visitor get() = components.visitor
protected val printer get() = components.printer
open fun renderArgumentMapping(argumentMapping: FirAnnotationArgumentMapping) {
printer.print("(")
argumentMapping.mapping.renderSeparated()
printer.print(")")
}
open fun renderArguments(arguments: List<FirExpression>) {
printer.print("(")
printer.renderSeparated(arguments, visitor)
printer.print(")")
}
private fun Map<Name, FirElement>.renderSeparated() {
for ((index, element) in this.entries.withIndex()) {
val (name, argument) = element
@@ -0,0 +1,28 @@
/*
* 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.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.FirExpression
class FirCallNoArgumentsRenderer : FirCallArgumentsRenderer() {
override fun renderArgumentMapping(argumentMapping: FirAnnotationArgumentMapping) {
printer.print("(")
if (argumentMapping.mapping.isNotEmpty()) {
printer.print("...")
}
printer.print(")")
}
override fun renderArguments(arguments: List<FirExpression>) {
printer.print("(")
if (arguments.isNotEmpty()) {
printer.print("...")
}
printer.print(")")
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.utils.Printer
open class FirPrinter(builder: StringBuilder) {
@@ -47,6 +48,25 @@ open class FirPrinter(builder: StringBuilder) {
println(rightBrace)
}
internal fun renderSeparated(elements: List<FirElement>, visitor: FirRenderer.Visitor) {
for ((index, element) in elements.withIndex()) {
if (index > 0) {
print(", ")
}
element.accept(visitor)
}
}
internal fun renderSeparatedWithNewlines(elements: List<FirElement>, visitor: FirRenderer.Visitor) {
for ((index, element) in elements.withIndex()) {
if (index > 0) {
print(",")
newLine()
}
element.accept(visitor)
}
}
override fun toString(): String {
return printer.toString()
}
@@ -39,6 +39,7 @@ open class FirRenderer private constructor(
components: FirComponentsImpl,
private val annotationRenderer: FirAnnotationRenderer?,
private val bodyRenderer: FirBodyRenderer?,
private val callArgumentsRenderer: FirCallArgumentsRenderer,
private val classMemberRenderer: FirClassMemberRenderer,
private val declarationRenderer: FirDeclarationRenderer,
private val packageDirectiveRenderer: FirPackageDirectiveRenderer?,
@@ -58,6 +59,7 @@ open class FirRenderer private constructor(
components.visitor = visitor
components.annotationRenderer = annotationRenderer
components.bodyRenderer = bodyRenderer
components.callArgumentsRenderer = callArgumentsRenderer
components.classMemberRenderer = classMemberRenderer
components.declarationRenderer = declarationRenderer
components.packageDirectiveRenderer = packageDirectiveRenderer
@@ -66,6 +68,7 @@ open class FirRenderer private constructor(
components.printer = this
annotationRenderer?.components = components
bodyRenderer?.components = components
callArgumentsRenderer.components = components
classMemberRenderer.components = components
declarationRenderer.components = components
packageDirectiveRenderer?.components = components
@@ -80,8 +83,9 @@ open class FirRenderer private constructor(
builder,
mode,
components,
FirAnnotationWithArgumentsRenderer(),
FirAnnotationRenderer(),
FirBodyRenderer(),
FirCallArgumentsRenderer(),
FirClassMemberRenderer(),
FirDeclarationRenderer(),
packageDirectiveRenderer = null,
@@ -93,13 +97,14 @@ open class FirRenderer private constructor(
fun with(
annotationRenderer: FirAnnotationRenderer? = this.annotationRenderer,
bodyRenderer: FirBodyRenderer? = this.bodyRenderer,
callArgumentsRenderer: FirCallArgumentsRenderer = this.callArgumentsRenderer,
classMemberRenderer: FirClassMemberRenderer = this.classMemberRenderer,
declarationRenderer: FirDeclarationRenderer = this.declarationRenderer,
packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer,
typeRenderer: ConeTypeRenderer = this.typeRenderer
): FirRenderer = FirRenderer(
builder, mode, FirComponentsImpl(),
annotationRenderer, bodyRenderer, classMemberRenderer,
annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer,
declarationRenderer, packageDirectiveRenderer, typeRenderer
)
@@ -130,6 +135,8 @@ open class FirRenderer private constructor(
override var packageDirectiveRenderer: FirPackageDirectiveRenderer? = null
override lateinit var callArgumentsRenderer: FirCallArgumentsRenderer
override lateinit var classMemberRenderer: FirClassMemberRenderer
override lateinit var declarationRenderer: FirDeclarationRenderer
@@ -142,7 +149,6 @@ open class FirRenderer private constructor(
}
data class RenderMode(
val renderCallArguments: Boolean,
val renderCallableFqNames: Boolean,
val renderPropertyAccessors: Boolean = true,
val renderDefaultParameterValues: Boolean = true,
@@ -150,23 +156,19 @@ open class FirRenderer private constructor(
) {
companion object {
val Normal = RenderMode(
renderCallArguments = true,
renderCallableFqNames = false,
)
val WithFqNames = RenderMode(
renderCallArguments = true,
renderCallableFqNames = true,
)
val NoBodies = RenderMode(
renderCallArguments = false,
renderCallableFqNames = false,
renderPropertyAccessors = false,
)
val DeclarationHeader = RenderMode(
renderCallArguments = false,
renderCallableFqNames = false,
renderPropertyAccessors = false,
renderDefaultParameterValues = false,
@@ -175,25 +177,6 @@ open class FirRenderer private constructor(
}
}
private fun List<FirElement>.renderSeparated() {
for ((index, element) in this.withIndex()) {
if (index > 0) {
print(", ")
}
element.accept(visitor)
}
}
private fun List<FirElement>.renderSeparatedWithNewlines() {
for ((index, element) in this.withIndex()) {
if (index > 0) {
print(",")
newLine()
}
element.accept(visitor)
}
}
private fun List<ConeKotlinType>.renderTypesSeparated() {
for ((index, element) in this.withIndex()) {
if (index > 0) {
@@ -206,7 +189,7 @@ open class FirRenderer private constructor(
private fun List<FirValueParameter>.renderParameters() {
print("(")
renderSeparated()
renderSeparated(this, visitor)
print(")")
}
@@ -222,7 +205,7 @@ open class FirRenderer private constructor(
private fun renderContexts(contextReceivers: List<FirContextReceiver>) {
if (contextReceivers.isEmpty()) return
print("context(")
contextReceivers.renderSeparated()
renderSeparated(contextReceivers, visitor)
print(")")
newLine()
}
@@ -260,7 +243,7 @@ open class FirRenderer private constructor(
private fun List<FirTypeParameterRef>.renderTypeParameters() {
if (isNotEmpty()) {
print("<")
renderSeparated()
renderSeparated(this, visitor)
print(">")
}
}
@@ -268,7 +251,7 @@ open class FirRenderer private constructor(
private fun List<FirTypeProjection>.renderTypeArguments() {
if (isNotEmpty()) {
print("<")
renderSeparated()
renderSeparated(this, visitor)
print(">")
}
}
@@ -276,7 +259,7 @@ open class FirRenderer private constructor(
fun renderSupertypes(regularClass: FirRegularClass) {
if (regularClass.superTypeRefs.isNotEmpty()) {
print(" : ")
regularClass.superTypeRefs.renderSeparated()
renderSeparated(regularClass.superTypeRefs, visitor)
}
}
@@ -496,7 +479,7 @@ open class FirRenderer private constructor(
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) {
annotationRenderer?.render(anonymousObject)
print("object : ")
anonymousObject.superTypeRefs.renderSeparated()
renderSeparated(anonymousObject.superTypeRefs, visitor)
classMemberRenderer.render(anonymousObject.declarations)
}
@@ -680,7 +663,7 @@ open class FirRenderer private constructor(
if (meaningfulBounds.isNotEmpty()) {
print(" : ")
meaningfulBounds.renderSeparated()
renderSeparated(meaningfulBounds, visitor)
}
}
@@ -917,20 +900,12 @@ open class FirRenderer private constructor(
override fun visitVarargArgumentsExpression(varargArgumentsExpression: FirVarargArgumentsExpression) {
print("vararg(")
varargArgumentsExpression.arguments.renderSeparated()
renderSeparated(varargArgumentsExpression.arguments, visitor)
print(")")
}
override fun visitCall(call: FirCall) {
print("(")
if (mode.renderCallArguments) {
call.arguments.renderSeparated()
} else {
if (call.arguments.isNotEmpty()) {
print("...")
}
}
print(")")
callArgumentsRenderer.renderArguments(call.arguments)
}
override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall) {
@@ -993,7 +968,7 @@ open class FirRenderer private constructor(
override fun visitFunctionTypeRef(functionTypeRef: FirFunctionTypeRef) {
if (functionTypeRef.contextReceiverTypeRefs.isNotEmpty()) {
print("context(")
functionTypeRef.contextReceiverTypeRefs.renderSeparated()
renderSeparated(functionTypeRef.contextReceiverTypeRefs, visitor)
print(")")
}
@@ -1030,7 +1005,7 @@ open class FirRenderer private constructor(
print(qualifier.name)
if (qualifier.typeArgumentList.typeArguments.isNotEmpty()) {
print("<")
qualifier.typeArgumentList.typeArguments.renderSeparated()
renderSeparated(qualifier.typeArgumentList.typeArguments, visitor)
print(">")
}
}
@@ -1345,7 +1320,7 @@ open class FirRenderer private constructor(
newLine()
print("[Contract description]")
renderInBraces("<", ">") {
rawContractDescription.rawEffects.renderSeparatedWithNewlines()
renderSeparatedWithNewlines(rawContractDescription.rawEffects, visitor)
newLine()
}
}
@@ -11,6 +11,7 @@ internal interface FirRendererComponents {
val declarationRenderer: FirDeclarationRenderer
val annotationRenderer: FirAnnotationRenderer?
val bodyRenderer: FirBodyRenderer?
val callArgumentsRenderer: FirCallArgumentsRenderer
val classMemberRenderer: FirClassMemberRenderer
val packageDirectiveRenderer: FirPackageDirectiveRenderer?
val typeRenderer: ConeTypeRenderer
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.FirCallNoArgumentsRenderer
import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
@@ -137,7 +138,7 @@ class FirScopeDumpHandler(testServices: TestServices) : FirAnalysisHandler(testS
private fun SmartPrinter.printInfo(declaration: FirCallableDeclaration, scope: FirTypeScope, counter: SymbolCounter) {
print("[${declaration.origin}]: ")
val renderedDeclaration = FirRenderer(mode = FirRenderer.RenderMode.NoBodies).with(
annotationRenderer = null, bodyRenderer = null
annotationRenderer = null, bodyRenderer = null, callArgumentsRenderer = FirCallNoArgumentsRenderer()
).renderElementAsString(declaration).trim()
print(renderedDeclaration)
print(" from $scope")