New J2K: Add conversion of Java instanceof expression to Kotlin is expression
This commit is contained in:
committed by
Ilya Kirillov
parent
c3ffaa34f8
commit
19c569e8e2
@@ -48,6 +48,7 @@ object ConversionsRunner {
|
|||||||
+PolyadicExpressionConversion()
|
+PolyadicExpressionConversion()
|
||||||
+BinaryExpressionConversion()
|
+BinaryExpressionConversion()
|
||||||
+SwitchStatementConversion(context)
|
+SwitchStatementConversion(context)
|
||||||
|
+InstanceofConversion()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun doApply(trees: List<JKTreeElement>, context: ConversionContext) {
|
fun doApply(trees: List<JKTreeElement>, context: ConversionContext) {
|
||||||
|
|||||||
@@ -173,6 +173,13 @@ class NewCodeBuilder {
|
|||||||
printer.printlnWithNoIndent()
|
printer.printlnWithNoIndent()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitKtIsExpression(ktIsExpression: JKKtIsExpression) {
|
||||||
|
ktIsExpression.expression.accept(this)
|
||||||
|
printer.printWithNoIndent(" is ")
|
||||||
|
ktIsExpression.type.accept(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun visitParameter(parameter: JKParameter) {
|
override fun visitParameter(parameter: JKParameter) {
|
||||||
printer.printWithNoIndent(parameter.name.value, ": ")
|
printer.printWithNoIndent(parameter.name.value, ": ")
|
||||||
parameter.type.accept(this)
|
parameter.type.accept(this)
|
||||||
@@ -339,6 +346,8 @@ class NewCodeBuilder {
|
|||||||
is JKClassType -> type.classReference.fqName?.let { printer.printWithNoIndent(FqName(it).shortName().asString()) }
|
is JKClassType -> type.classReference.fqName?.let { printer.printWithNoIndent(FqName(it).shortName().asString()) }
|
||||||
is JKUnresolvedClassType -> printer.printWithNoIndent(type.name)
|
is JKUnresolvedClassType -> printer.printWithNoIndent(type.name)
|
||||||
is JKContextType -> return
|
is JKContextType -> return
|
||||||
|
is JKStarProjectionType ->
|
||||||
|
printer.printWithNoIndent("*")
|
||||||
else -> printer.printWithNoIndent("Unit /* TODO: ${type::class} */")
|
else -> printer.printWithNoIndent("Unit /* TODO: ${type::class} */")
|
||||||
}
|
}
|
||||||
if (type is JKParametrizedType && type.parameters.isNotEmpty()) {
|
if (type is JKParametrizedType && type.parameters.isNotEmpty()) {
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* 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.tree.JKBinaryExpression
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.JKClassType
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.JKJavaInstanceOfExpression
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
|
|
||||||
|
|
||||||
|
class InstanceofConversion : RecursiveApplicableConversionBase() {
|
||||||
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
|
if (element is JKJavaInstanceOfExpression) {
|
||||||
|
val checkingType = element.type.type
|
||||||
|
val type =
|
||||||
|
when (checkingType) {
|
||||||
|
is JKClassType -> {
|
||||||
|
if (checkingType.parameters.isEmpty()) {
|
||||||
|
val resolvedClass = checkingType.classReference?.target
|
||||||
|
val parametersCount =
|
||||||
|
when (resolvedClass) {
|
||||||
|
is PsiClass -> resolvedClass.typeParameters.size
|
||||||
|
is KtClass -> resolvedClass.typeParameters.size
|
||||||
|
else -> 0
|
||||||
|
}
|
||||||
|
val typeParameters = List(parametersCount) { JKStarProjectionTypeImpl() }
|
||||||
|
JKClassTypeImpl(checkingType.classReference as JKClassSymbol,
|
||||||
|
typeParameters,
|
||||||
|
checkingType.nullability)
|
||||||
|
|
||||||
|
} else checkingType
|
||||||
|
}
|
||||||
|
else -> checkingType
|
||||||
|
}
|
||||||
|
return recurse(JKKtIsExpressionImpl(element.expression.also { it.detach(it.parent!!) }, JKTypeElementImpl(type)))
|
||||||
|
}
|
||||||
|
return recurse(element)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -187,6 +187,7 @@ class JKClassTypeImpl(
|
|||||||
override val nullability: Nullability = Nullability.Default
|
override val nullability: Nullability = Nullability.Default
|
||||||
) : JKClassType
|
) : JKClassType
|
||||||
|
|
||||||
|
class JKStarProjectionTypeImpl : JKStarProjectionType
|
||||||
|
|
||||||
class JKUnresolvedClassType(
|
class JKUnresolvedClassType(
|
||||||
val name: String,
|
val name: String,
|
||||||
|
|||||||
@@ -245,3 +245,11 @@ class JKKtValueWhenLabelImpl(expression: JKExpression) : JKKtValueWhenLabel, JKB
|
|||||||
override var expression: JKExpression by child(expression)
|
override var expression: JKExpression by child(expression)
|
||||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtValueWhenLabel(this, data)
|
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtValueWhenLabel(this, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class JKKtIsExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKKtIsExpression, JKBranchElementBase() {
|
||||||
|
override var type by child(type)
|
||||||
|
override var expression by child(expression)
|
||||||
|
|
||||||
|
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtIsExpression(this, data)
|
||||||
|
}
|
||||||
@@ -74,4 +74,9 @@ interface JKKtElseWhenLabel : JKKtWhenLabel
|
|||||||
|
|
||||||
interface JKKtValueWhenLabel : JKKtWhenLabel {
|
interface JKKtValueWhenLabel : JKKtWhenLabel {
|
||||||
var expression: JKExpression
|
var expression: JKExpression
|
||||||
|
}
|
||||||
|
|
||||||
|
interface JKKtIsExpression : JKExpression {
|
||||||
|
var expression: JKExpression
|
||||||
|
var type: JKTypeElement
|
||||||
}
|
}
|
||||||
@@ -68,6 +68,11 @@ interface JKJavaArrayType : JKType {
|
|||||||
val type: JKType
|
val type: JKType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface JKStarProjectionType : JKType {
|
||||||
|
override val nullability: Nullability
|
||||||
|
get() = Nullability.NotNull
|
||||||
|
}
|
||||||
|
|
||||||
inline fun <reified T> JKElement.getParentOfType(): T? {
|
inline fun <reified T> JKElement.getParentOfType(): T? {
|
||||||
var p = parent
|
var p = parent
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|||||||
@@ -88,4 +88,5 @@ interface JKVisitor<out R, in D> {
|
|||||||
fun visitKtWhenLabel(ktWhenLabel: JKKtWhenLabel, data: D): R = visitTreeElement(ktWhenLabel, data)
|
fun visitKtWhenLabel(ktWhenLabel: JKKtWhenLabel, data: D): R = visitTreeElement(ktWhenLabel, data)
|
||||||
fun visitKtElseWhenLabel(ktElseWhenLabel: JKKtElseWhenLabel, data: D): R = visitKtWhenLabel(ktElseWhenLabel, data)
|
fun visitKtElseWhenLabel(ktElseWhenLabel: JKKtElseWhenLabel, data: D): R = visitKtWhenLabel(ktElseWhenLabel, data)
|
||||||
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: D): R = visitKtWhenLabel(ktValueWhenLabel, data)
|
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: D): R = visitKtWhenLabel(ktValueWhenLabel, data)
|
||||||
|
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: D): R = visitExpression(ktIsExpression, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,4 +173,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
|
|||||||
override fun visitKtElseWhenLabel(ktElseWhenLabel: JKKtElseWhenLabel, data: Nothing?) = visitKtElseWhenLabel(ktElseWhenLabel)
|
override fun visitKtElseWhenLabel(ktElseWhenLabel: JKKtElseWhenLabel, data: Nothing?) = visitKtElseWhenLabel(ktElseWhenLabel)
|
||||||
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel) = visitKtWhenLabel(ktValueWhenLabel, null)
|
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel) = visitKtWhenLabel(ktValueWhenLabel, null)
|
||||||
override fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: Nothing?) = visitKtValueWhenLabel(ktValueWhenLabel)
|
override fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: Nothing?) = visitKtValueWhenLabel(ktValueWhenLabel)
|
||||||
|
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression) = visitExpression(ktIsExpression, null)
|
||||||
|
override fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: Nothing?) = visitKtIsExpression(ktIsExpression)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user