New J2K: Correctly support variables mutability
This commit is contained in:
committed by
Ilya Kirillov
parent
f147907799
commit
bc5ff67aff
@@ -24,6 +24,7 @@ import com.intellij.psi.impl.source.tree.ChildRole
|
||||
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
|
||||
import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl
|
||||
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
|
||||
import org.jetbrains.kotlin.j2k.ast.Mutability
|
||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||
import org.jetbrains.kotlin.j2k.tree.*
|
||||
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
|
||||
@@ -272,7 +273,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
|
||||
fun PsiField.toJK(): JKJavaField {
|
||||
return JKJavaFieldImpl(
|
||||
with(modifierMapper) { modifierList.toJK() },
|
||||
with(modifierMapper) { modifierList.toJK(finalAsMutability = true) },
|
||||
with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(),
|
||||
JKNameIdentifierImpl(name),
|
||||
with(expressionTreeMapper) { initializer.toJK() }
|
||||
@@ -361,10 +362,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
}
|
||||
|
||||
private inner class ModifierMapper {
|
||||
fun PsiModifierList?.toJK(): JKModifierList {
|
||||
fun PsiModifierList?.toJK(finalAsMutability: Boolean = false): JKModifierList {
|
||||
|
||||
val modifiers = if (this == null) mutableListOf()
|
||||
else PsiModifier.MODIFIERS.filter { hasExplicitModifier(it) }.mapNotNull { modifierToJK(it) }.toMutableList()
|
||||
else PsiModifier.MODIFIERS.filter { hasExplicitModifier(it) }.mapNotNull { modifierToJK(it, finalAsMutability) }.toMutableList()
|
||||
|
||||
modifiers += extractAccess()
|
||||
modifiers += extractModality()
|
||||
@@ -397,7 +398,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
return JKAccessModifierImpl(visibility)
|
||||
}
|
||||
|
||||
fun modifierToJK(name: String): JKModifier? = when (name) {
|
||||
fun modifierToJK(name: String, finalAsMutability: Boolean): JKModifier? = when (name) {
|
||||
PsiModifier.NATIVE -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.NATIVE)
|
||||
PsiModifier.STATIC -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STATIC)
|
||||
PsiModifier.STRICTFP -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STRICTFP)
|
||||
@@ -409,7 +410,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
PsiModifier.PUBLIC -> null
|
||||
PsiModifier.PRIVATE -> null
|
||||
|
||||
PsiModifier.FINAL -> null
|
||||
PsiModifier.FINAL -> if (finalAsMutability) JKMutabilityModifierImpl(Mutability.NonMutable) else null
|
||||
PsiModifier.ABSTRACT -> null
|
||||
|
||||
else -> TODO("Not yet supported")
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.kotlin.j2k
|
||||
|
||||
import org.jetbrains.kotlin.j2k.NewCodeBuilder.ParenthesisKind.*
|
||||
import org.jetbrains.kotlin.j2k.ast.Mutability
|
||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||
import org.jetbrains.kotlin.j2k.tree.*
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||
@@ -83,6 +84,8 @@ class NewCodeBuilder {
|
||||
)
|
||||
}
|
||||
|
||||
override fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier) {}
|
||||
|
||||
override fun visitKtModifier(ktModifier: JKKtModifier) {
|
||||
printer.printWithNoIndent(
|
||||
when (ktModifier.type) {
|
||||
@@ -143,11 +146,11 @@ class NewCodeBuilder {
|
||||
}
|
||||
|
||||
override fun visitKtProperty(ktProperty: JKKtProperty) {
|
||||
// TODO: Fix this, as Modality is not mutability
|
||||
if (ktProperty.modifierList.modality == JKModalityModifier.Modality.FINAL) {
|
||||
printer.print("val")
|
||||
} else {
|
||||
printer.print("var")
|
||||
ktProperty.modifierList.accept(this)
|
||||
|
||||
when (ktProperty.modifierList.mutability) {
|
||||
Mutability.Default, Mutability.Mutable -> printer.print("var")
|
||||
Mutability.NonMutable -> printer.print("val")
|
||||
}
|
||||
|
||||
printer.printWithNoIndent(" ", ktProperty.name.value, ": ")
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.j2k.tree.impl
|
||||
|
||||
import org.jetbrains.kotlin.j2k.ast.Mutability
|
||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||
import org.jetbrains.kotlin.j2k.tree.*
|
||||
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType
|
||||
@@ -68,6 +69,12 @@ var JKModifierList.visibility
|
||||
modifiers = modifiers.filterNot { it is JKAccessModifier } + JKAccessModifierImpl(value)
|
||||
}
|
||||
|
||||
var JKModifierList.mutability
|
||||
get() = modifiers.filterIsInstance<JKMutabilityModifier>().firstOrNull()?.mutability ?: Mutability.Default
|
||||
set(value) {
|
||||
modifiers = modifiers.filterNot { it is JKMutabilityModifier } +
|
||||
listOfNotNull(if (value != Mutability.Default) JKMutabilityModifierImpl(value) else null)
|
||||
}
|
||||
|
||||
class JKParameterImpl(
|
||||
type: JKTypeElement,
|
||||
@@ -317,6 +324,10 @@ class JKAccessModifierImpl(override val visibility: JKAccessModifier.Visibility)
|
||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitAccessModifier(this, data)
|
||||
}
|
||||
|
||||
class JKMutabilityModifierImpl(override val mutability: Mutability) : JKMutabilityModifier, JKElementBase() {
|
||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitMutabilityModifier(this, data)
|
||||
}
|
||||
|
||||
class JKLambdaExpressionImpl(parameters: List<JKParameter>, returnType: JKTypeElement, statement: JKStatement) :
|
||||
JKLambdaExpression, JKBranchElementBase() {
|
||||
override var statement by child(statement)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.j2k.tree
|
||||
|
||||
import org.jetbrains.kotlin.j2k.ast.Mutability
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKFieldSymbol
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol
|
||||
@@ -91,6 +92,10 @@ interface JKModalityModifier : JKModifier {
|
||||
val modality: Modality
|
||||
}
|
||||
|
||||
interface JKMutabilityModifier : JKModifier {
|
||||
val mutability: Mutability
|
||||
}
|
||||
|
||||
interface JKTypeElement : JKTreeElement {
|
||||
val type: JKType
|
||||
}
|
||||
@@ -109,7 +114,7 @@ interface JKNameIdentifier : JKIdentifier {
|
||||
|
||||
interface JKExpression : JKTreeElement
|
||||
|
||||
interface JKExpressionStatement : JKBranchElement, JKStatement {
|
||||
interface JKExpressionStatement : JKStatement, JKBranchElement {
|
||||
val expression: JKExpression
|
||||
}
|
||||
|
||||
@@ -138,7 +143,7 @@ interface JKQualifiedExpression : JKExpression, JKAssignableExpression {
|
||||
var selector: JKExpression
|
||||
}
|
||||
|
||||
interface JKMethodCallExpression : JKExpression {
|
||||
interface JKMethodCallExpression : JKExpression, JKBranchElement {
|
||||
val identifier: JKMethodSymbol
|
||||
val arguments: JKExpressionList
|
||||
}
|
||||
@@ -165,7 +170,7 @@ interface JKTypeCastExpression : JKExpression {
|
||||
val type: JKTypeElement
|
||||
}
|
||||
|
||||
interface JKExpressionList : JKTreeElement {
|
||||
interface JKExpressionList : JKTreeElement, JKBranchElement {
|
||||
var expressions: List<JKExpression>
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ interface JKVisitor<out R, in D> {
|
||||
fun visitModifierList(modifierList: JKModifierList, data: D): R = visitTreeElement(modifierList, data)
|
||||
fun visitAccessModifier(accessModifier: JKAccessModifier, data: D): R = visitModifier(accessModifier, data)
|
||||
fun visitModalityModifier(modalityModifier: JKModalityModifier, data: D): R = visitModifier(modalityModifier, data)
|
||||
fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier, data: D): R = visitModifier(mutabilityModifier, data)
|
||||
fun visitTypeElement(typeElement: JKTypeElement, data: D): R = visitTreeElement(typeElement, data)
|
||||
fun visitStatement(statement: JKStatement, data: D): R = visitTreeElement(statement, data)
|
||||
fun visitBlock(block: JKBlock, data: D): R = visitTreeElement(block, data)
|
||||
|
||||
@@ -27,6 +27,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
|
||||
override fun visitAccessModifier(accessModifier: JKAccessModifier, data: Nothing?) = visitAccessModifier(accessModifier)
|
||||
fun visitModalityModifier(modalityModifier: JKModalityModifier) = visitModifier(modalityModifier, null)
|
||||
override fun visitModalityModifier(modalityModifier: JKModalityModifier, data: Nothing?) = visitModalityModifier(modalityModifier)
|
||||
fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier) = visitModifier(mutabilityModifier, null)
|
||||
override fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier, data: Nothing?) = visitMutabilityModifier(mutabilityModifier)
|
||||
fun visitTypeElement(typeElement: JKTypeElement) = visitTreeElement(typeElement, null)
|
||||
override fun visitTypeElement(typeElement: JKTypeElement, data: Nothing?) = visitTypeElement(typeElement)
|
||||
fun visitStatement(statement: JKStatement) = visitTreeElement(statement, null)
|
||||
|
||||
Reference in New Issue
Block a user