New J2K: Correctly support variables mutability

This commit is contained in:
Simon Ogorodnik
2018-08-07 07:05:21 +03:00
committed by Ilya Kirillov
parent f147907799
commit bc5ff67aff
6 changed files with 36 additions and 13 deletions
@@ -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.PsiLiteralExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl 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.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.* import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
@@ -272,7 +273,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
fun PsiField.toJK(): JKJavaField { fun PsiField.toJK(): JKJavaField {
return JKJavaFieldImpl( return JKJavaFieldImpl(
with(modifierMapper) { modifierList.toJK() }, with(modifierMapper) { modifierList.toJK(finalAsMutability = true) },
with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(), with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(),
JKNameIdentifierImpl(name), JKNameIdentifierImpl(name),
with(expressionTreeMapper) { initializer.toJK() } with(expressionTreeMapper) { initializer.toJK() }
@@ -361,10 +362,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
} }
private inner class ModifierMapper { private inner class ModifierMapper {
fun PsiModifierList?.toJK(): JKModifierList { fun PsiModifierList?.toJK(finalAsMutability: Boolean = false): JKModifierList {
val modifiers = if (this == null) mutableListOf() 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 += extractAccess()
modifiers += extractModality() modifiers += extractModality()
@@ -397,7 +398,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
return JKAccessModifierImpl(visibility) 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.NATIVE -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.NATIVE)
PsiModifier.STATIC -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STATIC) PsiModifier.STATIC -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STATIC)
PsiModifier.STRICTFP -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STRICTFP) PsiModifier.STRICTFP -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STRICTFP)
@@ -409,7 +410,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
PsiModifier.PUBLIC -> null PsiModifier.PUBLIC -> null
PsiModifier.PRIVATE -> null PsiModifier.PRIVATE -> null
PsiModifier.FINAL -> null PsiModifier.FINAL -> if (finalAsMutability) JKMutabilityModifierImpl(Mutability.NonMutable) else null
PsiModifier.ABSTRACT -> null PsiModifier.ABSTRACT -> null
else -> TODO("Not yet supported") else -> TODO("Not yet supported")
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.j2k package org.jetbrains.kotlin.j2k
import org.jetbrains.kotlin.j2k.NewCodeBuilder.ParenthesisKind.* 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.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.j2k.tree.impl.*
@@ -83,6 +84,8 @@ class NewCodeBuilder {
) )
} }
override fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier) {}
override fun visitKtModifier(ktModifier: JKKtModifier) { override fun visitKtModifier(ktModifier: JKKtModifier) {
printer.printWithNoIndent( printer.printWithNoIndent(
when (ktModifier.type) { when (ktModifier.type) {
@@ -143,11 +146,11 @@ class NewCodeBuilder {
} }
override fun visitKtProperty(ktProperty: JKKtProperty) { override fun visitKtProperty(ktProperty: JKKtProperty) {
// TODO: Fix this, as Modality is not mutability ktProperty.modifierList.accept(this)
if (ktProperty.modifierList.modality == JKModalityModifier.Modality.FINAL) {
printer.print("val") when (ktProperty.modifierList.mutability) {
} else { Mutability.Default, Mutability.Mutable -> printer.print("var")
printer.print("var") Mutability.NonMutable -> printer.print("val")
} }
printer.printWithNoIndent(" ", ktProperty.name.value, ": ") printer.printWithNoIndent(" ", ktProperty.name.value, ": ")
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.j2k.tree.impl 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.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType
@@ -68,6 +69,12 @@ var JKModifierList.visibility
modifiers = modifiers.filterNot { it is JKAccessModifier } + JKAccessModifierImpl(value) 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( class JKParameterImpl(
type: JKTypeElement, 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) 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) : class JKLambdaExpressionImpl(parameters: List<JKParameter>, returnType: JKTypeElement, statement: JKStatement) :
JKLambdaExpression, JKBranchElementBase() { JKLambdaExpression, JKBranchElementBase() {
override var statement by child(statement) override var statement by child(statement)
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.j2k.tree 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.JKClassSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKFieldSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKFieldSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol
@@ -91,6 +92,10 @@ interface JKModalityModifier : JKModifier {
val modality: Modality val modality: Modality
} }
interface JKMutabilityModifier : JKModifier {
val mutability: Mutability
}
interface JKTypeElement : JKTreeElement { interface JKTypeElement : JKTreeElement {
val type: JKType val type: JKType
} }
@@ -109,7 +114,7 @@ interface JKNameIdentifier : JKIdentifier {
interface JKExpression : JKTreeElement interface JKExpression : JKTreeElement
interface JKExpressionStatement : JKBranchElement, JKStatement { interface JKExpressionStatement : JKStatement, JKBranchElement {
val expression: JKExpression val expression: JKExpression
} }
@@ -138,7 +143,7 @@ interface JKQualifiedExpression : JKExpression, JKAssignableExpression {
var selector: JKExpression var selector: JKExpression
} }
interface JKMethodCallExpression : JKExpression { interface JKMethodCallExpression : JKExpression, JKBranchElement {
val identifier: JKMethodSymbol val identifier: JKMethodSymbol
val arguments: JKExpressionList val arguments: JKExpressionList
} }
@@ -165,7 +170,7 @@ interface JKTypeCastExpression : JKExpression {
val type: JKTypeElement val type: JKTypeElement
} }
interface JKExpressionList : JKTreeElement { interface JKExpressionList : JKTreeElement, JKBranchElement {
var expressions: List<JKExpression> 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 visitModifierList(modifierList: JKModifierList, data: D): R = visitTreeElement(modifierList, data)
fun visitAccessModifier(accessModifier: JKAccessModifier, data: D): R = visitModifier(accessModifier, data) fun visitAccessModifier(accessModifier: JKAccessModifier, data: D): R = visitModifier(accessModifier, data)
fun visitModalityModifier(modalityModifier: JKModalityModifier, data: D): R = visitModifier(modalityModifier, 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 visitTypeElement(typeElement: JKTypeElement, data: D): R = visitTreeElement(typeElement, data)
fun visitStatement(statement: JKStatement, data: D): R = visitTreeElement(statement, data) fun visitStatement(statement: JKStatement, data: D): R = visitTreeElement(statement, data)
fun visitBlock(block: JKBlock, data: D): R = visitTreeElement(block, 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) override fun visitAccessModifier(accessModifier: JKAccessModifier, data: Nothing?) = visitAccessModifier(accessModifier)
fun visitModalityModifier(modalityModifier: JKModalityModifier) = visitModifier(modalityModifier, null) fun visitModalityModifier(modalityModifier: JKModalityModifier) = visitModifier(modalityModifier, null)
override fun visitModalityModifier(modalityModifier: JKModalityModifier, data: Nothing?) = visitModalityModifier(modalityModifier) 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) fun visitTypeElement(typeElement: JKTypeElement) = visitTreeElement(typeElement, null)
override fun visitTypeElement(typeElement: JKTypeElement, data: Nothing?) = visitTypeElement(typeElement) override fun visitTypeElement(typeElement: JKTypeElement, data: Nothing?) = visitTypeElement(typeElement)
fun visitStatement(statement: JKStatement) = visitTreeElement(statement, null) fun visitStatement(statement: JKStatement) = visitTreeElement(statement, null)