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 {
|
fun PsiInstanceOfExpression.toJK(): JKKtIsExpression =
|
||||||
return JKJavaInstanceOfExpressionImpl(operand.toJK(), checkType?.toJK() ?: TODO())
|
JKKtIsExpressionImpl(operand.toJK(), checkType?.toJK() ?: JKTypeElementImpl(JKNoTypeImpl))
|
||||||
}
|
|
||||||
|
|
||||||
fun PsiAssignmentExpression.toJK(): JKJavaAssignmentExpression {
|
fun PsiAssignmentExpression.toJK(): JKJavaAssignmentExpression {
|
||||||
return JKJavaAssignmentExpressionImpl(
|
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)
|
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,
|
class JKJavaPolyadicExpressionImpl(operands: List<JKExpression>, override var tokens: List<JKOperator>) : JKJavaPolyadicExpression,
|
||||||
JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
|
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 type by child(type)
|
||||||
override var expression by child(expression)
|
override var expression by child(expression)
|
||||||
|
|
||||||
|
|||||||
@@ -88,10 +88,6 @@ interface JKJavaForLoopStatement : JKLoopStatement {
|
|||||||
var updaters: List<JKStatement>
|
var updaters: List<JKStatement>
|
||||||
}
|
}
|
||||||
|
|
||||||
interface JKJavaInstanceOfExpression : JKExpression {
|
|
||||||
var expression: JKExpression
|
|
||||||
var type: JKTypeElement
|
|
||||||
}
|
|
||||||
|
|
||||||
interface JKJavaPolyadicExpression : JKExpression {
|
interface JKJavaPolyadicExpression : JKExpression {
|
||||||
var operands: List<JKExpression>
|
var operands: List<JKExpression>
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ interface JKKtValueWhenLabel : JKKtWhenLabel {
|
|||||||
var expression: JKExpression
|
var expression: JKExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
interface JKKtIsExpression : JKExpression {
|
interface JKKtIsExpression : JKExpression, PsiOwner {
|
||||||
var expression: JKExpression
|
var expression: JKExpression
|
||||||
var type: JKTypeElement
|
var type: JKTypeElement
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,24 +7,25 @@ package org.jetbrains.kotlin.j2k.tree
|
|||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
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.ConversionContext
|
||||||
import org.jetbrains.kotlin.j2k.JKSymbolProvider
|
import org.jetbrains.kotlin.j2k.JKSymbolProvider
|
||||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||||
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
|
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
|
||||||
|
import org.jetbrains.kotlin.j2k.kotlinTypeByName
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
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.KtTypeElement
|
||||||
import org.jetbrains.kotlin.psi.KtUserType
|
import org.jetbrains.kotlin.psi.KtUserType
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
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? =
|
fun JKExpression.type(context: ConversionContext): JKType? =
|
||||||
when (this) {
|
when (this) {
|
||||||
is JKLiteralExpression -> type.toJkType(context.symbolProvider)
|
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 JKKtThrowExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES.nothing.asString(), context.symbolProvider)
|
||||||
is JKClassAccessExpression -> null
|
is JKClassAccessExpression -> null
|
||||||
is JKJavaNewExpression -> JKClassTypeImpl(classSymbol)
|
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 JKParenthesizedExpression -> expression.type(context)
|
||||||
is JKTypeCastExpression -> type.type
|
is JKTypeCastExpression -> type.type
|
||||||
is JKThisExpression -> null// TODO return actual 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 visitReturnStatement(returnStatement: JKReturnStatement, data: D): R = visitStatement(returnStatement, data)
|
||||||
fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: D): R = visitStatement(javaAssertStatement, data)
|
fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: D): R = visitStatement(javaAssertStatement, data)
|
||||||
fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: D): R = visitLoopStatement(javaForLoopStatement, 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 visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: D): R = visitExpression(javaPolyadicExpression, data)
|
||||||
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): R = visitExpression(javaAssignmentExpression, data)
|
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): R = visitExpression(javaAssignmentExpression, data)
|
||||||
fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement, data: D): R = visitStatement(javaThrowStatement, 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)
|
override fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: Nothing?) = visitJavaAssertStatement(javaAssertStatement)
|
||||||
fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement) = visitLoopStatement(javaForLoopStatement, null)
|
fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement) = visitLoopStatement(javaForLoopStatement, null)
|
||||||
override fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: Nothing?) = visitJavaForLoopStatement(javaForLoopStatement)
|
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)
|
fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression) = visitExpression(javaPolyadicExpression, null)
|
||||||
override fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: Nothing?) = visitJavaPolyadicExpression(javaPolyadicExpression)
|
override fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: Nothing?) = visitJavaPolyadicExpression(javaPolyadicExpression)
|
||||||
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression) = visitExpression(javaAssignmentExpression, null)
|
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression) = visitExpression(javaAssignmentExpression, null)
|
||||||
|
|||||||
Reference in New Issue
Block a user