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() +ClassToObjectPromotionConversion()
+PolyadicExpressionConversion() +PolyadicExpressionConversion()
+SwitchStatementConversion(context) +SwitchStatementConversion(context)
+InstanceofConversion() +InstanceOfConversion()
+ForConversion(context) +ForConversion(context)
+LabeledStatementConversion() +LabeledStatementConversion()
} }
@@ -437,10 +437,8 @@ class NewCodeBuilder {
override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) { override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) {
printer.printWithNoIndent(FqName(javaNewExpression.constructorSymbol.fqName).shortName())//TODO import name somehow? printer.printWithNoIndent(FqName(javaNewExpression.constructorSymbol.fqName).shortName())//TODO import name somehow?
printer.printWithNoIndent("(") printer.printWithNoIndent("(")
//TODO use new sequence generator in future renderList(javaNewExpression.arguments.expressions, ", ") {
for ((index, argument) in javaNewExpression.arguments.expressions.withIndex()) { it.accept(this)
if (index > 0) printer.printWithNoIndent(", ")
argument.accept(this)
} }
printer.printWithNoIndent(")") printer.printWithNoIndent(")")
} }
@@ -97,7 +97,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
val start = loopVar.initializer val start = loopVar.initializer
val operationType = val operationType =
(loopStatement.updater as? JKExpressionStatement)?.expression?.isVariableIncrementOrDecrement(loopVar) (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.PLUSPLUS -> false
JavaTokenType.MINUSMINUS -> true JavaTokenType.MINUSMINUS -> true
else -> return null 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) 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 override val text: String
get() = when (token) { get() = when (psiToken) {
JavaTokenType.EQ -> "=" JavaTokenType.EQ -> "="
JavaTokenType.EQEQ -> "==" JavaTokenType.EQEQ -> "=="
JavaTokenType.NE -> "!=" JavaTokenType.NE -> "!="
@@ -101,12 +101,12 @@ class JKJavaOperatorToken(val token: IElementType) : JKOperatorToken {
JavaTokenType.GTGTGTEQ -> "ushr" JavaTokenType.GTGTGTEQ -> "ushr"
JavaTokenType.PLUSPLUS -> "++" JavaTokenType.PLUSPLUS -> "++"
JavaTokenType.MINUSMINUS -> "--" JavaTokenType.MINUSMINUS -> "--"
else -> TODO(token.toString()) else -> TODO(psiToken.toString())
} }
} }
fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken = fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
when (this.token) { when (this.psiToken) {
JavaTokenType.DIV -> JKKtSingleValueOperatorToken(KtTokens.DIV) JavaTokenType.DIV -> JKKtSingleValueOperatorToken(KtTokens.DIV)
JavaTokenType.MINUS -> JKKtSingleValueOperatorToken(KtTokens.MINUS) JavaTokenType.MINUS -> JKKtSingleValueOperatorToken(KtTokens.MINUS)
JavaTokenType.ANDAND -> JKKtSingleValueOperatorToken(KtTokens.ANDAND) JavaTokenType.ANDAND -> JKKtSingleValueOperatorToken(KtTokens.ANDAND)
@@ -138,7 +138,7 @@ fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
JavaTokenType.GTGTGTEQ -> JKKtWordOperatorToken("ushr") JavaTokenType.GTGTGTEQ -> JKKtWordOperatorToken("ushr")
JavaTokenType.XOREQ -> JKKtWordOperatorToken("xor") 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 token: JKJavaOperatorToken = JKJavaOperatorToken(psiToken)
override val precedence: Int override val precedence: Int
get() = when (token.token) { get() = when (token.psiToken) {
JavaTokenType.ASTERISK, JavaTokenType.DIV, JavaTokenType.PERC -> 3 JavaTokenType.ASTERISK, JavaTokenType.DIV, JavaTokenType.PERC -> 3
JavaTokenType.PLUS, JavaTokenType.MINUS -> 4 JavaTokenType.PLUS, JavaTokenType.MINUS -> 4
KtTokens.ELVIS -> 7 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.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
class JKKtPropertyImpl( class JKKtPropertyImpl(
@@ -85,12 +83,12 @@ class JKKtLiteralExpressionImpl(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtLiteralExpression(this, data) 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 override val operatorName: String
get() = OperatorConventions.getNameForOperationSymbol(token, true, true)?.identifier get() = OperatorConventions.getNameForOperationSymbol(psiToken, true, true)?.identifier
?: OperatorConventions.BOOLEAN_OPERATIONS[token]?.identifier ?: OperatorConventions.BOOLEAN_OPERATIONS[psiToken]?.identifier
?: TODO(token.value) ?: TODO(psiToken.value)
override val text: String = token.value override val text: String = psiToken.value
} }
class JKKtWordOperatorToken(override val text: String) : JKKtOperatorToken { class JKKtWordOperatorToken(override val text: String) : JKKtOperatorToken {
@@ -48,7 +48,7 @@ interface JKMethodSymbol : JKNamedSymbol {
interface JKFieldSymbol : JKNamedSymbol { interface JKFieldSymbol : JKNamedSymbol {
override val fqName: String override val fqName: String
val filedType: JKType val fieldType: JKType
} }
class JKUniverseClassSymbol : JKClassSymbol, JKUniverseSymbol<JKClass> { class JKUniverseClassSymbol : JKClassSymbol, JKUniverseSymbol<JKClass> {
@@ -133,7 +133,7 @@ class JKMultiverseFunctionSymbol(override val target: KtNamedFunction, private v
} }
class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> { class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
override val filedType: JKType override val fieldType: JKType
get() = target.type.type get() = target.type.type
override val name: String override val name: String
get() = target.name.value get() = target.name.value
@@ -145,7 +145,7 @@ class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
} }
class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol { class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val filedType: JKType override val fieldType: JKType
get() = target.type.toJK(symbolProvider) get() = target.type.toJK(symbolProvider)
override val name: String override val name: String
get() = target.name 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 { 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) get() = target.typeReference!!.typeElement!!.toJK(symbolProvider)
override val name: String override val name: String
get() = target.name!! 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 { class JKUnresolvedField(override val target: PsiReference, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val filedType: JKType override val fieldType: JKType
get() { get() {
val resolvedType = (target as? PsiReferenceExpressionImpl)?.type val resolvedType = (target as? PsiReferenceExpressionImpl)?.type
if (resolvedType != null) return resolvedType.toJK(symbolProvider) if (resolvedType != null) return resolvedType.toJK(symbolProvider)
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.j2k.tree package org.jetbrains.kotlin.j2k.tree
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference
import com.intellij.util.reverse import com.intellij.util.reverse
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
@@ -16,12 +15,9 @@ 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.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.KtElement
import org.jetbrains.kotlin.psi.KtTypeElement import org.jetbrains.kotlin.psi.KtTypeElement
import org.jetbrains.kotlin.psi.KtTypeReference
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.resolve.calls.callUtil.getType
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
@@ -32,7 +28,7 @@ fun JKExpression.type(context: ConversionContext): JKType =
is JKLiteralExpression -> type.toJkType(context.symbolProvider) is JKLiteralExpression -> type.toJkType(context.symbolProvider)
is JKBinaryExpression -> (operator as JKKtOperatorImpl).methodSymbol.returnType is JKBinaryExpression -> (operator as JKKtOperatorImpl).methodSymbol.returnType
is JKMethodCallExpression -> identifier.returnType is JKMethodCallExpression -> identifier.returnType
is JKFieldAccessExpressionImpl -> identifier.filedType is JKFieldAccessExpressionImpl -> identifier.fieldType
is JKQualifiedExpressionImpl -> this.selector.type(context) is JKQualifiedExpressionImpl -> this.selector.type(context)
else -> TODO(this::class.java.toString()) else -> TODO(this::class.java.toString())
} }