Extract separate FirCallArgumentsRenderer
This commit is contained in:
+2
-2
@@ -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."
|
||||
|
||||
+2
-5
@@ -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 -> "???"
|
||||
|
||||
+2
-6
@@ -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(")")
|
||||
}
|
||||
}
|
||||
|
||||
+14
-3
@@ -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
|
||||
|
||||
+2
-1
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user