New J2K: Move expression creation functions to separated file
This commit is contained in:
committed by
Ilya Kirillov
parent
fad9c52853
commit
d228d6110c
@@ -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.JKBinaryExpressionImpl
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaOperatorImpl
|
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaOperatorImpl
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.toKtToken
|
import org.jetbrains.kotlin.j2k.tree.impl.toKtToken
|
||||||
|
import org.jetbrains.kotlin.j2k.kotlinBinaryExpression
|
||||||
|
|
||||||
|
|
||||||
class BinaryExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
class BinaryExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
||||||
@@ -21,7 +22,7 @@ class BinaryExpressionConversion(private val context: ConversionContext) : Recur
|
|||||||
val left = recurse(element.left)
|
val left = recurse(element.left)
|
||||||
val right = recurse(element.right)
|
val right = recurse(element.right)
|
||||||
(element as? JKBranchElement)?.invalidate()
|
(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 JKBinaryExpressionImpl(left, right, element.operator)
|
||||||
return recurse(ktBinaryExpression)
|
return recurse(ktBinaryExpression)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
|
|||||||
context,
|
context,
|
||||||
psiContext
|
psiContext
|
||||||
)
|
)
|
||||||
else -> JKBinaryExpressionImpl.createKotlinBinaryExpression(
|
else -> kotlinBinaryExpression(
|
||||||
start,
|
start,
|
||||||
convertBound(bound, if (inclusiveComparison) 0 else -1),
|
convertBound(bound, if (inclusiveComparison) 0 else -1),
|
||||||
JKKtSingleValueOperatorToken(KtTokens.RANGE),
|
JKKtSingleValueOperatorToken(KtTokens.RANGE),
|
||||||
@@ -176,7 +176,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
|
|||||||
}
|
}
|
||||||
|
|
||||||
val sign = if (correction > 0) KtTokens.PLUS else KtTokens.MINUS
|
val sign = if (correction > 0) KtTokens.PLUS else KtTokens.MINUS
|
||||||
return JKBinaryExpressionImpl.createKotlinBinaryExpression(
|
return kotlinBinaryExpression(
|
||||||
bound,
|
bound,
|
||||||
JKKtLiteralExpressionImpl(Math.abs(correction).toString(), JKLiteralExpression.LiteralType.INT),
|
JKKtLiteralExpressionImpl(Math.abs(correction).toString(), JKLiteralExpression.LiteralType.INT),
|
||||||
JKKtSingleValueOperatorToken(sign),
|
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 fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitBinaryExpression(this, data)
|
||||||
override var right by child(right)
|
override var right by child(right)
|
||||||
override var left by child(left)
|
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.types.typeUtil.isSubtypeOf
|
||||||
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.util.*
|
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 =
|
fun JKExpression.type(context: ConversionContext): JKType =
|
||||||
when (this) {
|
when (this) {
|
||||||
@@ -91,7 +91,10 @@ fun JKType.toKtType(symbolProvider: JKSymbolProvider): KotlinType =
|
|||||||
when (this) {
|
when (this) {
|
||||||
is JKClassType -> classReference!!.toKtType(symbolProvider)
|
is JKClassType -> classReference!!.toKtType(symbolProvider)
|
||||||
is JKJavaPrimitiveType ->
|
is JKJavaPrimitiveType ->
|
||||||
kotlinTypeByName(jvmPrimitiveType.primitiveType.typeFqName.asString(), symbolProvider).toKtType(symbolProvider)
|
kotlinTypeByName(
|
||||||
|
jvmPrimitiveType.primitiveType.typeFqName.asString(),
|
||||||
|
symbolProvider
|
||||||
|
).toKtType(symbolProvider)
|
||||||
else -> TODO(this::class.java.toString())
|
else -> TODO(this::class.java.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user