New J2K: Move expression creation functions to separated file

This commit is contained in:
Ilya Kirillov
2018-11-01 15:38:04 +03:00
committed by Ilya Kirillov
parent fad9c52853
commit d228d6110c
6 changed files with 9 additions and 125 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.impl.JKBinaryExpressionImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaOperatorImpl
import org.jetbrains.kotlin.j2k.tree.impl.toKtToken
import org.jetbrains.kotlin.j2k.kotlinBinaryExpression
class BinaryExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
@@ -21,7 +22,7 @@ class BinaryExpressionConversion(private val context: ConversionContext) : Recur
val left = recurse(element.left)
val right = recurse(element.right)
(element as? JKBranchElement)?.invalidate()
val ktBinaryExpression = JKBinaryExpressionImpl.createKotlinBinaryExpression(left, right, ktOperatorToken, context)
val ktBinaryExpression = kotlinBinaryExpression(left, right, ktOperatorToken, context)
?: return JKBinaryExpressionImpl(left, right, element.operator)
return recurse(ktBinaryExpression)
}
@@ -158,7 +158,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
context,
psiContext
)
else -> JKBinaryExpressionImpl.createKotlinBinaryExpression(
else -> kotlinBinaryExpression(
start,
convertBound(bound, if (inclusiveComparison) 0 else -1),
JKKtSingleValueOperatorToken(KtTokens.RANGE),
@@ -176,7 +176,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
}
val sign = if (correction > 0) KtTokens.PLUS else KtTokens.MINUS
return JKBinaryExpressionImpl.createKotlinBinaryExpression(
return kotlinBinaryExpression(
bound,
JKKtLiteralExpressionImpl(Math.abs(correction).toString(), JKLiteralExpression.LiteralType.INT),
JKKtSingleValueOperatorToken(sign),
@@ -1,55 +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.PsiElement
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.JKExpression
import org.jetbrains.kotlin.j2k.tree.JKKtOperatorExpression
import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorExpressionImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol
import org.jetbrains.kotlin.name.ClassId
fun untilToExpression(
from: JKExpression,
to: JKExpression,
conversionContext: ConversionContext,
psiContext: PsiElement
): JKKtOperatorExpression =
rangeExpression(
from,
to,
"until",
conversionContext,
psiContext
)
fun downToExpression(
from: JKExpression,
to: JKExpression,
conversionContext: ConversionContext,
psiContext: PsiElement
): JKKtOperatorExpression =
rangeExpression(
from,
to,
"downTo",
conversionContext,
psiContext
)
fun rangeExpression(
from: JKExpression,
to: JKExpression,
operatorName: String,
conversionContext: ConversionContext,
psiContext: PsiElement
): JKKtOperatorExpressionImpl {
val symbol = conversionContext.symbolProvider.provideDirectSymbol(
multiResolveFqName(ClassId.fromString("kotlin/ranges/$operatorName"), psiContext).first()
) as JKMethodSymbol
return JKKtOperatorExpressionImpl(from, symbol, to)
}
@@ -1,20 +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.tree
import org.jetbrains.kotlin.j2k.JKSymbolProvider
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKClassTypeImpl
import org.jetbrains.kotlin.name.ClassId
fun kotlinTypeByName(name: String, symbolProvider: JKSymbolProvider): JKClassType {
val symbol =
symbolProvider.provideDirectSymbol(
resolveFqName(ClassId.fromString(name), symbolProvider.symbolsByPsi.keys.first())!!
) as JKClassSymbol
return JKClassTypeImpl(symbol, emptyList())
}
@@ -118,51 +118,6 @@ class JKBinaryExpressionImpl(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitBinaryExpression(this, data)
override var right by child(right)
override var left by child(left)
companion object {
private fun methodSymbolForToken(
token: JKKtOperatorToken,
leftType: JKType,
rightType: JKType,
symbolProvider: JKSymbolProvider
): JKMethodSymbol {
val classSymbol =
when (leftType) {
is JKClassType -> leftType.classReference as JKMultiverseKtClassSymbol
is JKJavaPrimitiveType -> {
val psiClass = resolveFqName(
ClassId.fromString(leftType.jvmPrimitiveType.primitiveType.typeFqName.asString()),
symbolProvider.symbolsByPsi.keys.first()
)!!
symbolProvider.provideDirectSymbol(psiClass) as JKMultiverseKtClassSymbol
}
else ->
TODO(leftType::class.java.toString())
}
val operatorNames =
if(token.operatorName == "equals") listOf("equals", "compareTo")
else listOf(token.operatorName)
return classSymbol.target.declarations// todo look for extensions
.asSequence()
.filterIsInstance<KtNamedFunction>()
.filter { it.name in operatorNames }
.mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol }
.firstOrNull { it.parameterTypes.singleOrNull()?.takeIf { it.isSubtypeOf(rightType, symbolProvider) } != null }!!
}
fun createKotlinBinaryExpression(
left: JKExpression,
right: JKExpression,
token: JKKtOperatorToken,
context: ConversionContext
): JKBinaryExpression? {
val leftType = left.type(context)
val rightType = right.type(context)
val methodSymbol = methodSymbolForToken(token, leftType, rightType, context.symbolProvider)
return JKBinaryExpressionImpl(left, right, JKKtOperatorImpl(token, methodSymbol))
}
}
}
@@ -22,7 +22,7 @@ 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.load.java.structure.impl.JavaPrimitiveTypeImpl
import org.jetbrains.kotlin.j2k.kotlinTypeByName
fun JKExpression.type(context: ConversionContext): JKType =
when (this) {
@@ -91,7 +91,10 @@ fun JKType.toKtType(symbolProvider: JKSymbolProvider): KotlinType =
when (this) {
is JKClassType -> classReference!!.toKtType(symbolProvider)
is JKJavaPrimitiveType ->
kotlinTypeByName(jvmPrimitiveType.primitiveType.typeFqName.asString(), symbolProvider).toKtType(symbolProvider)
kotlinTypeByName(
jvmPrimitiveType.primitiveType.typeFqName.asString(),
symbolProvider
).toKtType(symbolProvider)
else -> TODO(this::class.java.toString())
}