New J2K: Add filter & sort modifiers conversion

This commit is contained in:
Ilya Kirillov
2018-10-09 12:54:37 +03:00
committed by Ilya Kirillov
parent a7e0f18a57
commit d688b6c6da
@@ -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)
}
}