From 0873045718692f0541ab8015de84bac9ffae0fe5 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 8 Nov 2018 19:46:22 +0300 Subject: [PATCH] New J2K: Print & filter primary constructor modifiers --- .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 26 ++++++++++++++----- .../j2k/conversions/ModifiersConversion.kt | 8 ++++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 06e99c9fed2..c9c098b3efa 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -194,11 +194,10 @@ class NewCodeBuilder { builder.append(" ") printer.printWithNoIndent(klass.name.value) klass.typeParameterList.accept(this) + printer.printWithNoIndent(" ") val primaryConstructor = klass.primaryConstructor() - if (primaryConstructor != null && primaryConstructor.parameters.isNotEmpty()) { - renderParameterList(primaryConstructor.parameters) - } + primaryConstructor?.accept(this) if (klass.inheritance.inherit.isNotEmpty()) { printer.printWithNoIndent(" : ") @@ -217,10 +216,11 @@ class NewCodeBuilder { //TODO should it be here? renderExtraTypeParametersUpperBounds(klass.typeParameterList) - if (klass.declarationList.any { it !is JKKtPrimaryConstructor }) { + val declarationsToPrint = klass.declarationList.filterNot { it is JKKtPrimaryConstructor} + if (declarationsToPrint.isNotEmpty()) { printer.block(multiline = true) { - renderEnumConstants(klass.declarationList.filterIsInstance()) - renderNonEnumClassDeclarations(klass.declarationList.filterNot { it is JKEnumConstant }) + renderEnumConstants(declarationsToPrint.filterIsInstance()) + renderNonEnumClassDeclarations(declarationsToPrint.filterNot { it is JKEnumConstant }) } } else { printer.println() @@ -610,7 +610,19 @@ class NewCodeBuilder { } } - override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) {} + override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) { + val hasInitDeclaration = + (ktPrimaryConstructor.parent as JKClass).declarationList.any { it is JKKtInitDeclaration } + val hasAccessModifier = + ktPrimaryConstructor.modifierList.modifiers.any { it is JKAccessModifier } + if (hasAccessModifier && hasInitDeclaration && ktPrimaryConstructor.parameters.isNotEmpty()) { + ktPrimaryConstructor.modifierList.accept(this) + printer.printWithNoIndent(" constructor ") + } + if (ktPrimaryConstructor.parameters.isNotEmpty()) { + renderParameterList(ktPrimaryConstructor.parameters) + } + } private inline fun Printer.indented(block: () -> Unit) { this.pushIndent() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt index 60f7e702e29..fac9d192a87 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.j2k.conversions import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ast.Mutability import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.j2k.tree.impl.JKKtConstructorImpl import org.jetbrains.kotlin.j2k.tree.impl.JKKtModifierImpl import org.jetbrains.kotlin.j2k.tree.impl.mutability import org.jetbrains.kotlin.j2k.tree.impl.visibility @@ -29,11 +30,18 @@ class ModifiersConversion(private val context: ConversionContext) : RecursiveApp if (element is JKParameter) { convertParameterModifiers(element) } + if (element is JKKtConstructor) { + convertConstructorModifiers(element) + } element.sortModifiers() } return recurse(element) } + private fun convertConstructorModifiers(constructor: JKKtConstructor) { + constructor.filterModifiers { it !is JKModalityModifier } + } + private fun convertParameterModifiers(jkParameter: JKParameter) { if (jkParameter.modifierList.mutability == Mutability.Default) { jkParameter.modifierList.modifiers = emptyList()