diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt index ee7bca1af9d..f9e76d9b162 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.tree.generator.model.* import org.jetbrains.kotlin.generators.tree.ImportCollector import org.jetbrains.kotlin.generators.tree.StandardTypes import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile +import org.jetbrains.kotlin.generators.tree.printer.printBlock import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType import org.jetbrains.kotlin.generators.tree.render import org.jetbrains.kotlin.utils.SmartPrinter @@ -50,8 +51,7 @@ private fun SmartPrinter.printBuilder(builder: Builder) { print(builder.parents.joinToString(separator = ", ", prefix = " : ") { it.render() }) } var hasRequiredFields = false - println(" {") - withIndent { + printBlock { var needNewLine = false for (field in builder.allFields) { val (newLine, requiredFields) = printFieldInBuilder(field, builder, fieldIsUseless = false) @@ -74,8 +74,7 @@ private fun SmartPrinter.printBuilder(builder: Builder) { } print("fun build(): $buildType") if (builder is LeafBuilder) { - println(" {") - withIndent { + printBlock { println("return ${builder.implementation.render()}(") withIndent { for (field in builder.allFields) { @@ -91,7 +90,6 @@ private fun SmartPrinter.printBuilder(builder: Builder) { } println(")") } - println("}") if (hasBackingFields) { println() } @@ -116,7 +114,6 @@ private fun SmartPrinter.printBuilder(builder: Builder) { } } } - println("}") if (builder is LeafBuilder) { println() printDslBuildFunction(builder, hasRequiredFields) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt index 4a6b9a698fc..6961a0dc906 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt @@ -109,8 +109,7 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { print("${pureAbstractElementType.render()}(), ") } print(allParents.joinToString { "${it.render()}${it.kind.braces()}" }) - println(" {") - withIndent { + printBlock { if (isInterface || isAbstract) { allFields.forEach { fieldPrinter.printField(it, override = true, modality = Modality.ABSTRACT.takeIf { isAbstract }) @@ -217,15 +216,14 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { if (hasTransformChildrenMethod) { printTransformChildrenMethod( - this, + implementation, firTransformerType, - this, + implementation, modality = Modality.ABSTRACT.takeIf { isAbstract }, override = true, ) if (!isInterface && !isAbstract) { - println(" {") - withIndent { + printBlock { for (field in transformableChildren) { when { field.name == "explicitReceiver" -> { @@ -275,24 +273,21 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { } println("return this") } - print("}") } - println() } for (field in allFields) { if (!field.needsSeparateTransform) continue println() - transformFunctionDeclaration(field, this, override = true, kind!!) + transformFunctionDeclaration(field, implementation, override = true, kind!!) if (isInterface || isAbstract) { println() continue } - println(" {") - withIndent { + printBlock { if (field.isMutable && field.isFirType) { // TODO: replace with smth normal - if (this.typeName == "FirWhenExpressionImpl" && field.name == "subject") { + if (typeName == "FirWhenExpressionImpl" && field.name == "subject") { println( """ |if (subjectVariable != null) { @@ -309,17 +304,15 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { } println("return this") } - println("}") } if (element.needTransformOtherChildren) { println() - transformOtherChildrenFunctionDeclaration(this, override = true, kind!!) + transformOtherChildrenFunctionDeclaration(implementation, override = true, kind!!) if (isInterface || isAbstract) { println() } else { - println(" {") - withIndent { + printBlock { for (field in allFields) { if (!field.isMutable || !field.isFirType || field.name == "subjectVariable") continue if (!field.needsSeparateTransform) { @@ -331,7 +324,6 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { } println("return this") } - println("}") } } @@ -396,7 +388,6 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { } } } - println("}") } } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt index 504cbfd1ae5..0d0dfa58e79 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt @@ -12,13 +12,8 @@ import org.jetbrains.kotlin.fir.tree.generator.firVisitorType import org.jetbrains.kotlin.fir.tree.generator.model.Element import org.jetbrains.kotlin.fir.tree.generator.model.Field import org.jetbrains.kotlin.generators.tree.* -import org.jetbrains.kotlin.generators.tree.printer.FunctionParameter -import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile -import org.jetbrains.kotlin.generators.tree.printer.printFunctionDeclaration -import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType -import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.generators.tree.printer.* import org.jetbrains.kotlin.utils.SmartPrinter -import org.jetbrains.kotlin.utils.withIndent import java.io.File private class TransformerPrinter( @@ -61,7 +56,7 @@ private class TransformerPrinter( ) println() } else { - printFunctionDeclaration( + printFunctionWithBlockBody( name = "transform" + element.name, parameters = listOf( FunctionParameter(elementParameterName, element), @@ -70,12 +65,9 @@ private class TransformerPrinter( returnType = visitMethodReturnType(element), typeParameters = element.params, modality = Modality.OPEN, - ) - println(" {") - withIndent { + ) { println("return transformElement(", elementParameterName, ", data)") } - println("}") } println() printVisitMethodDeclaration( @@ -83,8 +75,7 @@ private class TransformerPrinter( modality = Modality.FINAL, override = true, ) - println(" {") - withIndent { + printBlock { println( "return transform", element.name, @@ -94,7 +85,6 @@ private class TransformerPrinter( "data)" ) } - println("}") } } } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt index 17632822c82..a43e5181716 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.ValueClassRepresentation import org.jetbrains.kotlin.generators.tree.* import org.jetbrains.kotlin.generators.tree.printer.FunctionParameter import org.jetbrains.kotlin.generators.tree.printer.printFunctionDeclaration +import org.jetbrains.kotlin.generators.tree.printer.printFunctionWithBlockBody import org.jetbrains.kotlin.ir.generator.config.AbstractTreeBuilder import org.jetbrains.kotlin.ir.generator.config.ElementConfig import org.jetbrains.kotlin.ir.generator.config.ElementConfig.Category.* @@ -776,12 +777,9 @@ object IrTree : AbstractTreeBuilder() { vararg statements: String, ) { println() - printFunctionDeclaration(name, listOf(indexParam) + listOfNotNull(additionalParameter), returnType) - println(" {") - withIndent { + printFunctionWithBlockBody(name, listOf(indexParam) + listOfNotNull(additionalParameter), returnType) { statements.forEach { println(it) } } - println("}") } printFunction( diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt index 53ceb82248e..86cba7f216e 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt @@ -60,8 +60,7 @@ private class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter { if (irTypeFields.singleOrNull()?.name != "typeArguments") { @@ -385,7 +368,6 @@ private class TypeTransformerPrinter( ", data)" ) } - println("}") } } } diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt index b0cc11135b1..422b2af6e13 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt @@ -146,8 +146,7 @@ abstract class AbstractVisitorPrinter, print(" : ", it.render(), it.inheritanceClauseParenthesis()) } print(visitorTypeParameters.multipleUpperBoundsList()) - println(" {") - withIndent { + printBlock { printAdditionalMethods() for (element in elements) { if (element.isRootElement && visitSuperTypeByDefault) continue @@ -155,7 +154,6 @@ abstract class AbstractVisitorPrinter, printMethodsForElement(element) } } - println("}") } } } \ No newline at end of file diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt index 09672ff4171..27a8da16160 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.generators.tree import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.generators.tree.printer.printBlock import org.jetbrains.kotlin.utils.SmartPrinter -import org.jetbrains.kotlin.utils.withIndent abstract class AbstractVisitorVoidPrinter( printer: SmartPrinter, @@ -50,13 +50,11 @@ abstract class AbstractVisitorVoidPrinter( ) fun SmartPrinter.printBody(parentInVisitor: Element?) { - println(" {") - if (parentInVisitor != null) { - withIndent { + printBlock { + if (parentInVisitor != null) { println(parentInVisitor.visitFunctionName, "(", element.visitorParameterName, ")") } } - println("}") } printer.run { diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt index 680dd78d340..2968b73b6f7 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt @@ -161,6 +161,41 @@ fun SmartPrinter.printFunctionDeclaration( print(typeParameters.multipleUpperBoundsList()) } +context(ImportCollector) +inline fun SmartPrinter.printFunctionWithBlockBody( + name: String, + parameters: List, + returnType: TypeRef, + typeParameters: List = emptyList(), + extensionReceiver: TypeRef? = null, + visibility: Visibility = Visibility.PUBLIC, + modality: Modality? = null, + override: Boolean = false, + isInline: Boolean = false, + allParametersOnSeparateLines: Boolean = false, + blockBody: () -> Unit, +) { + printFunctionDeclaration( + name, + parameters, + returnType, + typeParameters, + extensionReceiver, + visibility, + modality, + override, + isInline, + allParametersOnSeparateLines, + ) + printBlock(blockBody) +} + +inline fun SmartPrinter.printBlock(body: () -> Unit) { + println(" {") + withIndent(body) + println("}") +} + private val dataTP = TypeVariable("D") private val dataParameter = FunctionParameter("data", dataTP)