From bc5ff67affb760e67b5f09ec78232eac7818c482 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 7 Aug 2018 07:05:21 +0300 Subject: [PATCH] New J2K: Correctly support variables mutability --- .../org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt | 11 ++++++----- .../org/jetbrains/kotlin/j2k/NewCodeBuilder.kt | 13 ++++++++----- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 11 +++++++++++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt | 11 ++++++++--- .../jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt | 1 + .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 2 ++ 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 9428f839248..3eaba2cc32b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -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") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 963891dd361..9cc5b9fe8d3 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -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, ": ") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index bea623f376f..641d22607e5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -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().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 accept(visitor: JKVisitor, data: D): R = visitor.visitAccessModifier(this, data) } +class JKMutabilityModifierImpl(override val mutability: Mutability) : JKMutabilityModifier, JKElementBase() { + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitMutabilityModifier(this, data) +} + class JKLambdaExpressionImpl(parameters: List, returnType: JKTypeElement, statement: JKStatement) : JKLambdaExpression, JKBranchElementBase() { override var statement by child(statement) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 6fb99c2af70..96d90fc4fd8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -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 } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index ea54d127301..0ce053e5a92 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -15,6 +15,7 @@ interface JKVisitor { 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) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index c4dcf95956c..68059652935 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -27,6 +27,8 @@ interface JKVisitorVoid : JKVisitor { 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)