New J2K: Refactor code

This commit is contained in:
Ilya Kirillov
2018-11-01 12:12:13 +03:00
committed by Ilya Kirillov
parent 3030a03584
commit 753070b6c7
9 changed files with 61 additions and 74 deletions
@@ -49,7 +49,7 @@ object ConversionsRunner {
+ClassToObjectPromotionConversion()
+PolyadicExpressionConversion()
+SwitchStatementConversion(context)
+InstanceofConversion()
+InstanceOfConversion()
+ForConversion(context)
+LabeledStatementConversion()
}
@@ -437,10 +437,8 @@ class NewCodeBuilder {
override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) {
printer.printWithNoIndent(FqName(javaNewExpression.constructorSymbol.fqName).shortName())//TODO import name somehow?
printer.printWithNoIndent("(")
//TODO use new sequence generator in future
for ((index, argument) in javaNewExpression.arguments.expressions.withIndex()) {
if (index > 0) printer.printWithNoIndent(", ")
argument.accept(this)
renderList(javaNewExpression.arguments.expressions, ", ") {
it.accept(this)
}
printer.printWithNoIndent(")")
}
@@ -97,7 +97,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
val start = loopVar.initializer
val operationType =
(loopStatement.updater as? JKExpressionStatement)?.expression?.isVariableIncrementOrDecrement(loopVar)
val reversed = when ((operationType as? JKJavaOperatorImpl)?.token?.token) {
val reversed = when ((operationType as? JKJavaOperatorImpl)?.token?.psiToken) {
JavaTokenType.PLUSPLUS -> false
JavaTokenType.MINUSMINUS -> true
else -> return null
@@ -0,0 +1,40 @@
/*
* 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) return recurse(element)
val checkingType = element.type.type
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 as JKClassSymbol,
typeParameters,
checkingType.nullability
)
} else checkingType
return recurse(JKKtIsExpressionImpl(element.expression.also { it.detach(it.parent!!) }, JKTypeElementImpl(type)))
}
}
@@ -1,45 +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.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)
}
}
@@ -64,9 +64,9 @@ class JKJavaModifierImpl(override val type: JKJavaModifier.JavaModifierType) : J
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaModifier(this, data)
}
class JKJavaOperatorToken(val token: IElementType) : JKOperatorToken {
class JKJavaOperatorToken(val psiToken: IElementType) : JKOperatorToken {
override val text: String
get() = when (token) {
get() = when (psiToken) {
JavaTokenType.EQ -> "="
JavaTokenType.EQEQ -> "=="
JavaTokenType.NE -> "!="
@@ -101,12 +101,12 @@ class JKJavaOperatorToken(val token: IElementType) : JKOperatorToken {
JavaTokenType.GTGTGTEQ -> "ushr"
JavaTokenType.PLUSPLUS -> "++"
JavaTokenType.MINUSMINUS -> "--"
else -> TODO(token.toString())
else -> TODO(psiToken.toString())
}
}
fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
when (this.token) {
when (this.psiToken) {
JavaTokenType.DIV -> JKKtSingleValueOperatorToken(KtTokens.DIV)
JavaTokenType.MINUS -> JKKtSingleValueOperatorToken(KtTokens.MINUS)
JavaTokenType.ANDAND -> JKKtSingleValueOperatorToken(KtTokens.ANDAND)
@@ -138,7 +138,7 @@ fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
JavaTokenType.GTGTGTEQ -> JKKtWordOperatorToken("ushr")
JavaTokenType.XOREQ -> JKKtWordOperatorToken("xor")
else -> TODO(this.token.toString())
else -> TODO(this.psiToken.toString())
}
@@ -146,7 +146,7 @@ class JKJavaOperatorImpl private constructor(psiToken: IElementType) : JKOperato
override val token: JKJavaOperatorToken = JKJavaOperatorToken(psiToken)
override val precedence: Int
get() = when (token.token) {
get() = when (token.psiToken) {
JavaTokenType.ASTERISK, JavaTokenType.DIV, JavaTokenType.PERC -> 3
JavaTokenType.PLUS, JavaTokenType.MINUS -> 4
KtTokens.ELVIS -> 7
@@ -22,9 +22,7 @@ import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
import org.jetbrains.kotlin.utils.addToStdlib.cast
class JKKtPropertyImpl(
@@ -85,12 +83,12 @@ class JKKtLiteralExpressionImpl(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtLiteralExpression(this, data)
}
class JKKtSingleValueOperatorToken(val token: KtSingleValueToken) : JKKtOperatorToken {
class JKKtSingleValueOperatorToken(val psiToken: KtSingleValueToken) : JKKtOperatorToken {
override val operatorName: String
get() = OperatorConventions.getNameForOperationSymbol(token, true, true)?.identifier
?: OperatorConventions.BOOLEAN_OPERATIONS[token]?.identifier
?: TODO(token.value)
override val text: String = token.value
get() = OperatorConventions.getNameForOperationSymbol(psiToken, true, true)?.identifier
?: OperatorConventions.BOOLEAN_OPERATIONS[psiToken]?.identifier
?: TODO(psiToken.value)
override val text: String = psiToken.value
}
class JKKtWordOperatorToken(override val text: String) : JKKtOperatorToken {
@@ -48,7 +48,7 @@ interface JKMethodSymbol : JKNamedSymbol {
interface JKFieldSymbol : JKNamedSymbol {
override val fqName: String
val filedType: JKType
val fieldType: JKType
}
class JKUniverseClassSymbol : JKClassSymbol, JKUniverseSymbol<JKClass> {
@@ -133,7 +133,7 @@ class JKMultiverseFunctionSymbol(override val target: KtNamedFunction, private v
}
class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
override val filedType: JKType
override val fieldType: JKType
get() = target.type.type
override val name: String
get() = target.name.value
@@ -145,7 +145,7 @@ class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
}
class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val filedType: JKType
override val fieldType: JKType
get() = target.type.toJK(symbolProvider)
override val name: String
get() = target.name
@@ -156,7 +156,7 @@ class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolP
}
class JKMultiversePropertySymbol(override val target: KtProperty, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val filedType: JKType
override val fieldType: JKType
get() = target.typeReference!!.typeElement!!.toJK(symbolProvider)
override val name: String
get() = target.name!!
@@ -167,7 +167,7 @@ class JKMultiversePropertySymbol(override val target: KtProperty, private val sy
}
class JKUnresolvedField(override val target: PsiReference, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val filedType: JKType
override val fieldType: JKType
get() {
val resolvedType = (target as? PsiReferenceExpressionImpl)?.type
if (resolvedType != null) return resolvedType.toJK(symbolProvider)
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.j2k.tree
import com.intellij.psi.*
import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference
import com.intellij.util.reverse
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
@@ -16,12 +15,9 @@ import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtTypeElement
import org.jetbrains.kotlin.psi.KtTypeReference
import org.jetbrains.kotlin.psi.KtUserType
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
@@ -32,7 +28,7 @@ fun JKExpression.type(context: ConversionContext): JKType =
is JKLiteralExpression -> type.toJkType(context.symbolProvider)
is JKBinaryExpression -> (operator as JKKtOperatorImpl).methodSymbol.returnType
is JKMethodCallExpression -> identifier.returnType
is JKFieldAccessExpressionImpl -> identifier.filedType
is JKFieldAccessExpressionImpl -> identifier.fieldType
is JKQualifiedExpressionImpl -> this.selector.type(context)
else -> TODO(this::class.java.toString())
}