New J2K: Replace java instanceof with kotlin is expression
This commit is contained in:
committed by
Ilya Kirillov
parent
eda99a588d
commit
325eec2454
@@ -112,9 +112,9 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
)
|
||||
}
|
||||
|
||||
fun PsiInstanceOfExpression.toJK(): JKJavaInstanceOfExpression {
|
||||
return JKJavaInstanceOfExpressionImpl(operand.toJK(), checkType?.toJK() ?: TODO())
|
||||
}
|
||||
fun PsiInstanceOfExpression.toJK(): JKKtIsExpression =
|
||||
JKKtIsExpressionImpl(operand.toJK(), checkType?.toJK() ?: JKTypeElementImpl(JKNoTypeImpl))
|
||||
|
||||
|
||||
fun PsiAssignmentExpression.toJK(): JKJavaAssignmentExpression {
|
||||
return JKJavaAssignmentExpressionImpl(
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* 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.ast.Nullability
|
||||
import org.jetbrains.kotlin.j2k.tree.*
|
||||
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) return recurse(element)
|
||||
val checkingType = element.type.type.updateNullability(Nullability.NotNull)
|
||||
val type =
|
||||
if (checkingType is JKClassType && 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,
|
||||
typeParameters,
|
||||
checkingType.nullability
|
||||
)
|
||||
|
||||
} else checkingType
|
||||
return recurse(JKKtIsExpressionImpl(element::expression.detached(), JKTypeElementImpl(type)))
|
||||
}
|
||||
}
|
||||
@@ -295,12 +295,6 @@ class JKJavaForLoopStatementImpl(initializer: JKStatement, condition: JKExpressi
|
||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaForLoopStatement(this, data)
|
||||
}
|
||||
|
||||
class JKJavaInstanceOfExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKJavaInstanceOfExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
|
||||
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.visitJavaInstanceOfExpression(this, data)
|
||||
}
|
||||
|
||||
class JKJavaPolyadicExpressionImpl(operands: List<JKExpression>, override var tokens: List<JKOperator>) : JKJavaPolyadicExpression,
|
||||
JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
|
||||
|
||||
@@ -229,7 +229,7 @@ class JKKtValueWhenLabelImpl(expression: JKExpression) : JKKtValueWhenLabel, JKB
|
||||
}
|
||||
|
||||
|
||||
class JKKtIsExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKKtIsExpression, JKBranchElementBase() {
|
||||
class JKKtIsExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKKtIsExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
|
||||
override var type by child(type)
|
||||
override var expression by child(expression)
|
||||
|
||||
|
||||
@@ -88,10 +88,6 @@ interface JKJavaForLoopStatement : JKLoopStatement {
|
||||
var updaters: List<JKStatement>
|
||||
}
|
||||
|
||||
interface JKJavaInstanceOfExpression : JKExpression {
|
||||
var expression: JKExpression
|
||||
var type: JKTypeElement
|
||||
}
|
||||
|
||||
interface JKJavaPolyadicExpression : JKExpression {
|
||||
var operands: List<JKExpression>
|
||||
|
||||
@@ -81,7 +81,7 @@ interface JKKtValueWhenLabel : JKKtWhenLabel {
|
||||
var expression: JKExpression
|
||||
}
|
||||
|
||||
interface JKKtIsExpression : JKExpression {
|
||||
interface JKKtIsExpression : JKExpression, PsiOwner {
|
||||
var expression: JKExpression
|
||||
var type: JKTypeElement
|
||||
}
|
||||
|
||||
@@ -7,24 +7,25 @@ package org.jetbrains.kotlin.j2k.tree
|
||||
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaClassDescriptor
|
||||
import org.jetbrains.kotlin.j2k.ConversionContext
|
||||
import org.jetbrains.kotlin.j2k.JKSymbolProvider
|
||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
|
||||
import org.jetbrains.kotlin.j2k.kotlinTypeByName
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtNullableType
|
||||
import org.jetbrains.kotlin.psi.KtTypeElement
|
||||
import org.jetbrains.kotlin.psi.KtUserType
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.util.*
|
||||
import org.jetbrains.kotlin.j2k.kotlinTypeByName
|
||||
import org.jetbrains.kotlin.psi.KtNullableType
|
||||
|
||||
fun JKExpression.type(context: ConversionContext): JKType? =
|
||||
when (this) {
|
||||
is JKLiteralExpression -> type.toJkType(context.symbolProvider)
|
||||
@@ -43,7 +44,7 @@ fun JKExpression.type(context: ConversionContext): JKType? =
|
||||
is JKKtThrowExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES.nothing.asString(), context.symbolProvider)
|
||||
is JKClassAccessExpression -> null
|
||||
is JKJavaNewExpression -> JKClassTypeImpl(classSymbol)
|
||||
is JKJavaInstanceOfExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES._boolean.asString(), context.symbolProvider)
|
||||
is JKKtIsExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES._boolean.asString(), context.symbolProvider)
|
||||
is JKParenthesizedExpression -> expression.type(context)
|
||||
is JKTypeCastExpression -> type.type
|
||||
is JKThisExpression -> null// TODO return actual type
|
||||
|
||||
@@ -90,7 +90,6 @@ interface JKVisitor<out R, in D> {
|
||||
fun visitReturnStatement(returnStatement: JKReturnStatement, data: D): R = visitStatement(returnStatement, data)
|
||||
fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: D): R = visitStatement(javaAssertStatement, data)
|
||||
fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: D): R = visitLoopStatement(javaForLoopStatement, data)
|
||||
fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression, data: D): R = visitExpression(javaInstanceOfExpression, data)
|
||||
fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: D): R = visitExpression(javaPolyadicExpression, data)
|
||||
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): R = visitExpression(javaAssignmentExpression, data)
|
||||
fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement, data: D): R = visitStatement(javaThrowStatement, data)
|
||||
|
||||
@@ -177,8 +177,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
|
||||
override fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: Nothing?) = visitJavaAssertStatement(javaAssertStatement)
|
||||
fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement) = visitLoopStatement(javaForLoopStatement, null)
|
||||
override fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: Nothing?) = visitJavaForLoopStatement(javaForLoopStatement)
|
||||
fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression) = visitExpression(javaInstanceOfExpression, null)
|
||||
override fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression, data: Nothing?) = visitJavaInstanceOfExpression(javaInstanceOfExpression)
|
||||
fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression) = visitExpression(javaPolyadicExpression, null)
|
||||
override fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: Nothing?) = visitJavaPolyadicExpression(javaPolyadicExpression)
|
||||
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression) = visitExpression(javaAssignmentExpression, null)
|
||||
|
||||
Reference in New Issue
Block a user