diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index fd0b517ed05..b0e8d4c778e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -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." diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt index 45d584a867d..d0754e5c978 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt @@ -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 -> "???" diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt index 8a53b22deba..92a2db24607 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt @@ -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() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt index 70ee6236a61..2952db00106 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt @@ -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(")") - } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationWithArgumentsRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirCallArgumentsRenderer.kt similarity index 56% rename from compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationWithArgumentsRenderer.kt rename to compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirCallArgumentsRenderer.kt index 6d95538f04c..beddde1ae5f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationWithArgumentsRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirCallArgumentsRenderer.kt @@ -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) { + printer.print("(") + printer.renderSeparated(arguments, visitor) + printer.print(")") + } + private fun Map.renderSeparated() { for ((index, element) in this.entries.withIndex()) { val (name, argument) = element diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirCallNoArgumentsRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirCallNoArgumentsRenderer.kt new file mode 100644 index 00000000000..fb9f7219819 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirCallNoArgumentsRenderer.kt @@ -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) { + printer.print("(") + if (arguments.isNotEmpty()) { + printer.print("...") + } + printer.print(")") + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt index 58dafdfbc9f..1b160b259b8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirPrinter.kt @@ -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, visitor: FirRenderer.Visitor) { + for ((index, element) in elements.withIndex()) { + if (index > 0) { + print(", ") + } + element.accept(visitor) + } + } + + internal fun renderSeparatedWithNewlines(elements: List, visitor: FirRenderer.Visitor) { + for ((index, element) in elements.withIndex()) { + if (index > 0) { + print(",") + newLine() + } + element.accept(visitor) + } + } + override fun toString(): String { return printer.toString() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt index 8a1051d5e12..02607a99c57 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt @@ -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.renderSeparated() { - for ((index, element) in this.withIndex()) { - if (index > 0) { - print(", ") - } - element.accept(visitor) - } - } - - private fun List.renderSeparatedWithNewlines() { - for ((index, element) in this.withIndex()) { - if (index > 0) { - print(",") - newLine() - } - element.accept(visitor) - } - } - private fun List.renderTypesSeparated() { for ((index, element) in this.withIndex()) { if (index > 0) { @@ -206,7 +189,7 @@ open class FirRenderer private constructor( private fun List.renderParameters() { print("(") - renderSeparated() + renderSeparated(this, visitor) print(")") } @@ -222,7 +205,7 @@ open class FirRenderer private constructor( private fun renderContexts(contextReceivers: List) { 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.renderTypeParameters() { if (isNotEmpty()) { print("<") - renderSeparated() + renderSeparated(this, visitor) print(">") } } @@ -268,7 +251,7 @@ open class FirRenderer private constructor( private fun List.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() } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt index 3464efd0e45..e10af84fcdc 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt @@ -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 diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt index a788f7734f7..890d1237a36 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirScopeDumpHandler.kt @@ -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")