New J2K: Standardize modality and visibility

This commit is contained in:
Simon Ogorodnik
2018-06-16 20:22:33 +03:00
committed by Ilya Kirillov
parent 0ec2fb3d17
commit f6a5ac9d97
14 changed files with 152 additions and 64 deletions
@@ -11,6 +11,9 @@ import org.jetbrains.kotlin.j2k.tree.JKElement
data class ConversionContext(
val symbolProvider: JKSymbolProvider,
val project: Project,
val converter: NewJavaToKotlinConverter,
val backAnnotator: (JKElement) -> PsiElement?
)
) {
val project: Project get() = converter.project
}
@@ -24,6 +24,7 @@ object ConversionsRunner {
fun doApply(trees: List<JKTreeElement>, context: ConversionContext) {
trees.forEach {
ModalityConversion(context).runConversion(it, context)
FieldToPropertyConversion().runConversion(it, context)
TypeMappingConversion(context).runConversion(it, context)
AssignmentAsExpressionToAlsoConversion(context).runConversion(it, context)
@@ -324,18 +324,43 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
}
private inner class ModifierMapper {
fun PsiModifierList?.toJK(): JKModifierList = JKModifierListImpl(
if (this == null) emptyList()
else PsiModifier.MODIFIERS.filter { hasExplicitModifier(it) }.map { modifierToJK(it) }.toMutableList()
)
fun PsiModifierList?.toJK(): JKModifierList {
fun modifierToJK(name: String): JKModifier = when (name) {
PsiModifier.PUBLIC -> JKJavaAccessModifierImpl(JKJavaAccessModifier.AccessModifierType.PUBLIC)
PsiModifier.PRIVATE -> JKJavaAccessModifierImpl(JKJavaAccessModifier.AccessModifierType.PRIVATE)
PsiModifier.PROTECTED -> JKJavaAccessModifierImpl(JKJavaAccessModifier.AccessModifierType.PROTECTED)
val modifiers = if (this == null) mutableListOf()
else PsiModifier.MODIFIERS.filter { hasExplicitModifier(it) }.mapNotNull { modifierToJK(it) }.toMutableList()
PsiModifier.ABSTRACT -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.ABSTRACT)
PsiModifier.FINAL -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.FINAL)
modifiers += extractAccess()
modifiers += extractModality()
return JKModifierListImpl(
modifiers
)
}
fun PsiModifierList?.extractModality(): JKModalityModifier {
val modality = when {
this == null -> JKModalityModifier.Modality.OPEN
hasModifierProperty(PsiModifier.FINAL) -> JKModalityModifier.Modality.FINAL
hasModifierProperty(PsiModifier.ABSTRACT) -> JKModalityModifier.Modality.ABSTRACT
else -> JKModalityModifier.Modality.OPEN
}
return JKModalityModifierImpl(modality)
}
fun PsiModifierList?.extractAccess(): JKAccessModifier {
val visibility = when {
this == null -> JKAccessModifier.Visibility.PACKAGE_PRIVATE
hasModifierProperty(PsiModifier.PACKAGE_LOCAL) -> JKAccessModifier.Visibility.PACKAGE_PRIVATE
hasModifierProperty(PsiModifier.PRIVATE) -> JKAccessModifier.Visibility.PRIVATE
hasModifierProperty(PsiModifier.PROTECTED) -> JKAccessModifier.Visibility.PROTECTED
hasModifierProperty(PsiModifier.PUBLIC) -> JKAccessModifier.Visibility.PUBLIC
else -> JKAccessModifier.Visibility.PACKAGE_PRIVATE
}
return JKAccessModifierImpl(visibility)
}
fun modifierToJK(name: String): JKModifier? = when (name) {
PsiModifier.NATIVE -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.NATIVE)
PsiModifier.STATIC -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STATIC)
PsiModifier.STRICTFP -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STRICTFP)
@@ -343,8 +368,16 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
PsiModifier.TRANSIENT -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.TRANSIENT)
PsiModifier.VOLATILE -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.VOLATILE)
PsiModifier.PROTECTED -> null
PsiModifier.PUBLIC -> null
PsiModifier.PRIVATE -> null
PsiModifier.FINAL -> null
PsiModifier.ABSTRACT -> null
else -> TODO("Not yet supported")
}
}
private inner class ElementVisitor : JavaElementVisitor() {
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.JKBodyStub
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.j2k.tree.impl.modality
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitorVoid
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.name.FqName
@@ -60,6 +61,28 @@ class NewCodeBuilder {
}
}
override fun visitAccessModifier(accessModifier: JKAccessModifier) {
printer.printWithNoIndent(
when (accessModifier.visibility) {
JKAccessModifier.Visibility.PUBLIC -> "public"
JKAccessModifier.Visibility.PACKAGE_PRIVATE, JKAccessModifier.Visibility.INTERNAL -> "internal"
// JKAccessModifier.Visibility.PACKAGE_PRIVATE -> "internal /* package_local! */"
JKAccessModifier.Visibility.PROTECTED -> "protected"
JKAccessModifier.Visibility.PRIVATE -> "private"
}
)
}
override fun visitModalityModifier(modalityModifier: JKModalityModifier) {
printer.printWithNoIndent(
when (modalityModifier.modality) {
JKModalityModifier.Modality.OPEN -> "open"
JKModalityModifier.Modality.FINAL -> "final"
JKModalityModifier.Modality.ABSTRACT -> "abstract"
}
)
}
override fun visitKtModifier(ktModifier: JKKtModifier) {
printer.printWithNoIndent(
when (ktModifier.type) {
@@ -90,8 +113,8 @@ class NewCodeBuilder {
}
override fun visitKtProperty(ktProperty: JKKtProperty) {
// TODO: Fix this
if (ktProperty.modifierList.modifiers.any { (it as? JKJavaModifier)?.type == JKJavaModifier.JavaModifierType.FINAL }) {
// TODO: Fix this, as Modality is not mutability
if (ktProperty.modifierList.modality == JKModalityModifier.Modality.FINAL) {
printer.print("val")
} else {
printer.print("var")
@@ -174,7 +197,7 @@ class NewCodeBuilder {
}
override fun visitLocalVariable(localVariable: JKLocalVariable) {
if (localVariable.modifierList.modifiers.any { (it as? JKJavaModifier)?.type == JKJavaModifier.JavaModifierType.FINAL }) {
if (localVariable.modifierList.modality == JKModalityModifier.Modality.FINAL) {
printer.print("val")
} else {
printer.print("var")
@@ -24,8 +24,9 @@ import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.prettyDebugPrintTree
class NewJavaToKotlinConverter(
private val project: Project,
private val settings: ConverterSettings
val project: Project,
val settings: ConverterSettings,
val converterServices: NewJavaToKotlinServices
) {
private fun List<JKTreeElement>.prettyPrintTrees() = buildString {
@@ -46,7 +47,7 @@ class NewJavaToKotlinConverter(
val context = ConversionContext(
symbolProvider,
project
this
) { treeBuilder.backAnnotation[it] }
ConversionsRunner.doApply(fileTrees, context)
@@ -0,0 +1,34 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.j2k.conversions
import com.intellij.psi.PsiClass
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.JKClass
import org.jetbrains.kotlin.j2k.tree.JKModalityModifier
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.impl.modality
class ModalityConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKClass) {
processClass(element)
}
return recurse(element)
}
private fun processClass(klass: JKClass) {
if (klass.classKind != JKClass.ClassKind.CLASS) return
if (klass.modifierList.modality != JKModalityModifier.Modality.OPEN) return
if (context.converter.settings.openByDefault) return
if (!context.converter.converterServices.oldServices.referenceSearcher.hasInheritors(context.backAnnotator(klass) as PsiClass)) {
klass.modifierList.modality = JKModalityModifier.Modality.FINAL
}
}
}
@@ -15,38 +15,16 @@ class ModifiersConversion : RecursiveApplicableConversionBase() {
element.also {
var modifiers = it.modifierList.modifiers
if (element !is JKField) {
if (!modifiers.any { it is JKJavaModifier && it.type == JKJavaModifier.JavaModifierType.FINAL }) {
modifiers += JKKtModifierImpl(JKKtModifier.KtModifierType.OPEN)
}
modifiers = mapOtherModifiers(modifiers)
}
if (!modifiers.any { it is JKJavaAccessModifier }) {
modifiers += JKKtModifierImpl(JKKtModifier.KtModifierType.INTERNAL)
}
it.modifierList.modifiers = mapAccessModifiers(modifiers)
it.modifierList.modifiers = modifiers
} else recurse(element)
}
private fun mapAccessModifiers(modifiers: List<JKModifier>): List<JKModifier> {
return modifiers.mapNotNull {
when (it) {
is JKJavaAccessModifier -> when (it.type) {
JKJavaAccessModifier.AccessModifierType.PUBLIC -> null
JKJavaAccessModifier.AccessModifierType.PRIVATE -> JKKtModifierImpl(JKKtModifier.KtModifierType.PRIVATE)
JKJavaAccessModifier.AccessModifierType.PROTECTED -> JKKtModifierImpl(JKKtModifier.KtModifierType.PROTECTED)
}
else -> it
}
}
}
private fun mapOtherModifiers(modifiers: List<JKModifier>): List<JKModifier> {
return modifiers.mapNotNull {
return modifiers.map {
when (it) {
is JKJavaModifier -> when (it.type) {
JKJavaModifier.JavaModifierType.ABSTRACT -> JKKtModifierImpl(JKKtModifier.KtModifierType.ABSTRACT)
JKJavaModifier.JavaModifierType.FINAL -> null
JKJavaModifier.JavaModifierType.NATIVE -> JKKtModifierImpl(JKKtModifier.KtModifierType.EXTERNAL)
else -> it
}
@@ -36,10 +36,6 @@ private class DebugTreePrinter : JKVisitorVoid {
printer.println(javaModifier.classNameWithoutJK(), "(", javaModifier.type, ")")
}
override fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) {
printer.println(javaAccessModifier.classNameWithoutJK(), "(", javaAccessModifier.type, ")")
}
override fun visitJavaMethod(javaMethod: JKJavaMethod) {
printer.println(javaMethod.classNameWithoutJK(), " [")
printer.indented {
@@ -58,10 +58,6 @@ class JKJavaLiteralExpressionImpl(
}
}
class JKJavaAccessModifierImpl(override val type: JKJavaAccessModifier.AccessModifierType) : JKJavaAccessModifier, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaAccessModifier(this, data)
}
class JKJavaModifierImpl(override val type: JKJavaModifier.JavaModifierType) : JKJavaModifier, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaModifier(this, data)
}
@@ -52,6 +52,20 @@ class JKModifierListImpl(
override var modifiers: List<JKModifier> by children(modifiers)
}
var JKModifierList.modality
get() = modifiers.filterIsInstance<JKModalityModifier>().first().modality
set(value) {
modifiers = modifiers.filterNot { it is JKModalityModifier } + JKModalityModifierImpl(value)
}
var JKModifierList.visibility
get() = modifiers.filterIsInstance<JKAccessModifier>().first().visibility
set(value) {
modifiers = modifiers.filterNot { it is JKAccessModifier } + JKAccessModifierImpl(value)
}
class JKParameterImpl(
type: JKTypeElement,
name: JKNameIdentifier,
@@ -285,4 +299,12 @@ class JKIfElseExpressionImpl(condition: JKExpression, thenBranch: JKExpression,
class JKClassAccessExpressionImpl(override var identifier: JKClassSymbol) : JKClassAccessExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitClassAccessExpression(this, data)
}
class JKModalityModifierImpl(override val modality: JKModalityModifier.Modality) : JKModalityModifier, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitModalityModifier(this, data)
}
class JKAccessModifierImpl(override val visibility: JKAccessModifier.Visibility) : JKAccessModifier, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitAccessModifier(this, data)
}
@@ -43,19 +43,11 @@ interface JKJavaDefaultNewExpression : JKExpression {
val classSymbol: JKClassSymbol
}
interface JKJavaAccessModifier : JKAccessModifier {
val type: AccessModifierType
enum class AccessModifierType {
PUBLIC, PROTECTED, PRIVATE
}
}
interface JKJavaModifier : JKModifier {
val type: JavaModifierType
enum class JavaModifierType {
ABSTRACT, FINAL, NATIVE, STATIC, STRICTFP, SYNCHRONIZED, TRANSIENT, VOLATILE
NATIVE, STATIC, STRICTFP, SYNCHRONIZED, TRANSIENT, VOLATILE
}
}
+14 -2
View File
@@ -67,9 +67,21 @@ interface JKModifierList : JKTreeElement {
var modifiers: List<JKModifier>
}
interface JKAccessModifier : JKModifier
interface JKAccessModifier : JKModifier {
enum class Visibility {
PUBLIC, INTERNAL, PACKAGE_PRIVATE, PROTECTED, PRIVATE
}
interface JKModalityModifier : JKModifier
val visibility: Visibility
}
interface JKModalityModifier : JKModifier {
enum class Modality {
OPEN, FINAL, ABSTRACT
}
val modality: Modality
}
interface JKTypeElement : JKTreeElement {
val type: JKType
@@ -58,7 +58,6 @@ interface JKVisitor<out R, in D> {
fun visitJavaFieldAccessExpression(javaFieldAccessExpression: JKJavaFieldAccessExpression, data: D): R = visitFieldAccessExpression(javaFieldAccessExpression, data)
fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: D): R = visitExpression(javaNewExpression, data)
fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: D): R = visitExpression(javaDefaultNewExpression, data)
fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: D): R = visitAccessModifier(javaAccessModifier, data)
fun visitJavaModifier(javaModifier: JKJavaModifier, data: D): R = visitModifier(javaModifier, data)
fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: D): R = visitExpression(javaNewEmptyArray, data)
fun visitJavaNewArray(javaNewArray: JKJavaNewArray, data: D): R = visitExpression(javaNewArray, data)
@@ -113,8 +113,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: Nothing?) = visitJavaNewExpression(javaNewExpression)
fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression) = visitExpression(javaDefaultNewExpression, null)
override fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: Nothing?) = visitJavaDefaultNewExpression(javaDefaultNewExpression)
fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) = visitAccessModifier(javaAccessModifier, null)
override fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?) = visitJavaAccessModifier(javaAccessModifier)
fun visitJavaModifier(javaModifier: JKJavaModifier) = visitModifier(javaModifier, null)
override fun visitJavaModifier(javaModifier: JKJavaModifier, data: Nothing?) = visitJavaModifier(javaModifier)
fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray) = visitExpression(javaNewEmptyArray, null)