From d688b6c6dab68922d4914a6cb20fd5bbc15befe9 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 9 Oct 2018 12:54:37 +0300 Subject: [PATCH] New J2K: Add filter & sort modifiers conversion --- .../j2k/conversions/ModifiersConversion.kt | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt index 94b6d1d1216..c31c0114de7 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ModifiersConversion.kt @@ -6,8 +6,10 @@ 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.JKKtModifierImpl +import org.jetbrains.kotlin.j2k.tree.impl.mutability import org.jetbrains.kotlin.j2k.tree.impl.visibility class ModifiersConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { @@ -24,10 +26,34 @@ class ModifiersConversion(private val context: ConversionContext) : RecursiveApp if (context.converter.settings.noInternalForMembersOfInternal) { relaxVisibility(element) } + if (element is JKParameter) { + convertParameterModifiers(element) + } + element.sortModifiers() } return recurse(element) } + private fun convertParameterModifiers(jkParameter: JKParameter) { + jkParameter.filterModifiers { + when (it) { + is JKModalityModifier -> it.modality != JKModalityModifier.Modality.OPEN + else -> true + } + } + if (jkParameter.parent is JKKtPrimaryConstructor) { + val hasNonDefaultMutabilityModifier = + jkParameter.modifierList.modifiers.find { + it is JKMutabilityModifier && it.mutability != Mutability.Default + } != null + if (!hasNonDefaultMutabilityModifier) + jkParameter.modifierList.modifiers = emptyList() + } else { + jkParameter.modifierList.modifiers = emptyList() + } + } + + private fun relaxVisibility(element: JKTreeElement) { if (element is JKParameter) return element as JKModifierListOwner // TODO: Assert @@ -35,7 +61,8 @@ class ModifiersConversion(private val context: ConversionContext) : RecursiveApp val parent = element.parent as? JKClass if (parent == null || modifierList.visibility != JKAccessModifier.Visibility.PACKAGE_PRIVATE - || parent.modifierList.visibility != JKAccessModifier.Visibility.PACKAGE_PRIVATE) return + || parent.modifierList.visibility != JKAccessModifier.Visibility.PACKAGE_PRIVATE + ) return modifierList.visibility = JKAccessModifier.Visibility.PUBLIC } @@ -50,4 +77,27 @@ class ModifiersConversion(private val context: ConversionContext) : RecursiveApp } } } + + private fun JKModifierListOwner.sortModifiers() { + modifierList.modifiers = modifierList.modifiers.sortedBy { it.priority } + } + + private val JKModifier.priority: Int + get() = + when (this) { + is JKAccessModifier -> 0 + is JKModalityModifier -> + when (this.modality) { + JKModalityModifier.Modality.FINAL, JKModalityModifier.Modality.OPEN, JKModalityModifier.Modality.ABSTRACT -> 1 + JKModalityModifier.Modality.OVERRIDE -> 2 + } + is JKJavaModifier -> 3 + is JKMutabilityModifier -> 4 + else -> TODO(this.toString()) + } + + + private fun JKModifierListOwner.filterModifiers(filter: (JKModifier) -> Boolean) { + modifierList.modifiers = modifierList.modifiers.filter(filter) + } } \ No newline at end of file